From b2f66c738626be122ff054504d8335415f018b03 Mon Sep 17 00:00:00 2001
From: Stefan Ravn van Overeem <StefanRvO@users.noreply.github.com>
Date: Tue, 27 Jun 2023 22:32:57 +0200
Subject: [PATCH] Improve unicode codepoint Bisearch performance (#691)

Improve the performance of the functions for searching for codepoints
in a table by passing the table array in as a reference instead of copying
it.

Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
---
 src/ftxui/dom/benchmark_test.cpp | 13 +++++++++++++
 src/ftxui/screen/string.cpp      |  4 ++--
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/ftxui/dom/benchmark_test.cpp b/src/ftxui/dom/benchmark_test.cpp
index 76d20c1f..bf8ca9f3 100644
--- a/src/ftxui/dom/benchmark_test.cpp
+++ b/src/ftxui/dom/benchmark_test.cpp
@@ -30,6 +30,19 @@ static void BencharkBasic(benchmark::State& state) {
 }
 BENCHMARK(BencharkBasic)->DenseRange(0, 256, 16);
 
+static void BencharkText(benchmark::State& state) {
+  while (state.KeepRunning()) {
+    std::string content = "HELLO world ";
+    for(int i=0; i<state.range(0); ++i) {
+      content += content;
+    }
+    auto document = paragraph(content);
+    Screen screen(200,200);
+    Render(screen, document);
+  }
+}
+BENCHMARK(BencharkText)->DenseRange(0, 10, 1);
+
 }  // namespace ftxui
 // NOLINTEND
 
diff --git a/src/ftxui/screen/string.cpp b/src/ftxui/screen/string.cpp
index b477acb1..c1baf163 100644
--- a/src/ftxui/screen/string.cpp
+++ b/src/ftxui/screen/string.cpp
@@ -1368,7 +1368,7 @@ const std::array<WordBreakPropertyInterval, 1288> g_word_break_intervals = {{
 
 // Find a codepoint inside a sorted list of Interval.
 template <size_t N>
-bool Bisearch(uint32_t ucs, const std::array<Interval, N> table) {
+bool Bisearch(uint32_t ucs, const std::array<Interval, N>& table) {
   if (ucs < table.front().first || ucs > table.back().last) {  // NOLINT
     return false;
   }
@@ -1391,7 +1391,7 @@ bool Bisearch(uint32_t ucs, const std::array<Interval, N> table) {
 
 // Find a value inside a sorted list of Interval + property.
 template <class C, size_t N>
-bool Bisearch(uint32_t ucs, const std::array<C, N> table, C* out) {
+bool Bisearch(uint32_t ucs, const std::array<C, N>& table, C* out) {
   if (ucs < table.front().first || ucs > table.back().last) {  // NOLINT
     return false;
   }
-- 
GitLab