From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id A72F81652602; Tue, 18 Nov 2025 15:21:26 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org A72F81652602 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1763468486; bh=yjsV28cG+H9tkoTkAodTouxKTgU7LnREgmWSzrY8eag=; h=Date:To:Cc:References:In-Reply-To:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=PvzL7sBmoP7aNr3p0TtdLvL7CD5Yp3GT6KLPeiKdP2lZyY4sdsqeRrKGtOU+bwjiI wj3/i6LXvLnYl1t+wqSKnr1y9Ld2BfsUOsbskDTH7RNfgSC979iJukog8olGob1JgS rmejzKpqaLhC535gxaCFKsqTh3c08ugvm99CLzac= Received: from send276.i.mail.ru (send276.i.mail.ru [95.163.59.115]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id E4099518B06 for ; Tue, 18 Nov 2025 15:21:24 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org E4099518B06 Received: by exim-smtp-88cf54d45-z8nb7 with esmtpa (envelope-from ) id 1vLKi3-00000000HJT-2f3Y; Tue, 18 Nov 2025 15:21:24 +0300 Content-Type: multipart/alternative; boundary="------------dabYt5HuaQxRGq5rAJgW456D" Message-ID: <1e32e858-f823-453c-87fc-2bad7e0f6980@tarantool.org> Date: Tue, 18 Nov 2025 15:21:21 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: Sergey Kaplun Cc: tarantool-patches@dev.tarantool.org References: <70e9131c5cfc5c44822dd73ecb010d13dbd370c4.1761301736.git.skaplun@tarantool.org> In-Reply-To: <70e9131c5cfc5c44822dd73ecb010d13dbd370c4.1761301736.git.skaplun@tarantool.org> X-Mailru-Src: smtp X-4EC0790: 10 X-7564579A: 78E4E2B564C1792B X-77F55803: 4F1203BC0FB41BD9231027FDF5B453B6022724577A46A973970D53D65E6CE2A7182A05F5380850404B4F3F0FB12D0A973DE06ABAFEAF67055F114CE5B73B719564769F4E2618242B2D7423A3730B96E4 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7AC43A7B4C36B769DEA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637AC83A81C8FD4AD23D82A6BABE6F325AC2E85FA5F3EDFCBAA7353EFBB55337566E92807B878994EEC38E97CEB97D611AB24AB7B67BEE5C9CF51E9DDAF98DB296C389733CBF5DBD5E913377AFFFEAFD269176DF2183F8FC7C0D9442B0B5983000E8941B15DA834481FCF19DD082D7633A0EF3E4896CB9E6436389733CBF5DBD5E9D5E8D9A59859A8B652D31B9D28593E51CC7F00164DA146DA6F5DAA56C3B73B237318B6A418E8EAB8D32BA5DBAC0009BE9E8FC8737B5C22496E72AA9E7D514E7076E601842F6C81A12EF20D2F80756B5FB606B96278B59C4276E601842F6C81A127C277FBC8AE2E8B998C1B47ABA640FE3AA81AA40904B5D99C9F4D5AE37F343AD1F44FA8B9022EA23BBE47FD9DD3FB595F5C1EE8F4F765FC72CEEB2601E22B093A03B725D353964B0B7D0EA88DDEDAC722CA9DD8327EE4930A3850AC1BE2E735BA6625F88748EAEFC4224003CC83647689D4C264860C145E X-C1DE0DAB: 0D63561A33F958A5F3101CBF2ED6B9CF5002B1117B3ED696ED35D1AFDE3E0037CCE9A60C8CB01D7C823CB91A9FED034534781492E4B8EEAD577AE849BCD98940BDAD6C7F3747799A X-C8649E89: 1C3962B70DF3F0ADE00A9FD3E00BEEDF3FED46C3ACD6F73ED3581295AF09D3DF87807E0823442EA2ED31085941D9CD0AF7F820E7B07EA4CF037A31C2991F42605D527872C8ACCE45393A542350B6735A16589A0AC1604977C7834276CD052397DD6EA89E5C47541B4F9DFE6F2A4B4EE7B5E9DCB3EBAE55BE9C523F0695E05B55111DC66A97D0BFE2913E6812662D5F2AB9AF64DB4688768036DF5FE9C0001AF333F2C28C22F508233FCF178C6DD14203 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu53w8ahmwBjZKM/YPHZyZHvz5uv+WouB9+ObcCpyrx6l7KImUglyhkEat/+ysWwi0gdhEs0JGjl6ggRWTy1haxBpVdbIX1nthFXMZebaIdHP2ghjoIc/363UZI6Kf1ptIMVfFX+FmbwDW1hdg+JkRDX+0= X-Mailru-Sender: C4F68CFF4024C8867DFDF7C7F2588458063CD737980982B557FFD5DAF71AD12CB8B9BFACD66B2F15A22388E9008E9A39645D15D82EE4B272BD6E4642A116CA93524AA66B5ACBE6721EF430B9A63E2A504198E0F3ECE9B5443453F38A29522196 X-Mras: Ok Subject: Re: [Tarantool-patches] [PATCH v1 luajit 37/41] perf: add CMake infrastructure X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Sergey Bronnikov via Tarantool-patches Reply-To: Sergey Bronnikov Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" This is a multi-part message in MIME format. --------------dabYt5HuaQxRGq5rAJgW456D Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, Sergey, thanks for the patch! See my comments. Sergey On 10/24/25 14:00, Sergey Kaplun wrote: > This commit introduces CMake building scripts for the benches introduced > before. The benchmarks are enabled only if `LUAJIT_ENABLE_PERF` option > is set. For each suite (LuaJIT-benches in this patch set) > `AddBenchTarget()` macro generates 2 targets: > * Target to run all benches and store results in the > perf/output/ directory. > * Target to run all benches via CTest and inspect results in the > console. > > For the LuaJIT-benches there are 2 generated files: > * FASTA_5000000 -- is used as an input for and > . > * SUMCOLL_5000.txt -- is used as an input for . > > These files and directory are added to the .gitignore files. > --- > .gitignore | 5 ++ > CMakeLists.txt | 11 ++++ > perf/CMakeLists.txt | 99 ++++++++++++++++++++++++++++++ > perf/LuaJIT-benches/CMakeLists.txt | 52 ++++++++++++++++ > 4 files changed, 167 insertions(+) > create mode 100644 perf/CMakeLists.txt > create mode 100644 perf/LuaJIT-benches/CMakeLists.txt > > diff --git a/.gitignore b/.gitignore > index c26a7eb8..bfc7d401 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -28,3 +28,8 @@ luajit-parse-memprof > luajit-parse-sysprof > luajit.pc > *.c_test > + > +# Generated by the performance tests. > +FASTA_5000000 > +SUMCOL_5000.txt > +perf/output/ > diff --git a/CMakeLists.txt b/CMakeLists.txt > index c0da4362..73f46835 100644 > --- a/CMakeLists.txt > +++ b/CMakeLists.txt > @@ -464,6 +464,17 @@ if(LUAJIT_USE_TEST) > endif() > add_subdirectory(test) > > +# --- Benchmarks source tree --------------------------------------------------- > + > +# The option to enable performance tests for the LuaJIT. > +# Disabled by default, since commonly it is used only by LuaJIT > +# developers and run in the CI with the specially set-up machine. > +option(LUAJIT_ENABLE_PERF "Generate target" OFF) > + > +if(LUAJIT_ENABLE_PERF) option name confuses a bit due to `perf` utility. I would rename to something like "LUAJIT_ENABLE_PERF_TESTS". Feel free to ignore. > + add_subdirectory(perf) > +endif() > + > # --- Misc rules --------------------------------------------------------------- > > # XXX: Implement target using the following recipe: > diff --git a/perf/CMakeLists.txt b/perf/CMakeLists.txt > new file mode 100644 > index 00000000..cc3c312f > --- /dev/null > +++ b/perf/CMakeLists.txt > @@ -0,0 +1,99 @@ > +# Running various bench suites against LuaJIT. > + > +include(MakeLuaPath) > + > +if(CMAKE_BUILD_TYPE STREQUAL "Debug") > + message(WARNING "LuaJIT and perf tests are built in the Debug mode." s/./. / missed whitespace after dot > + "Timings may be affected.") > +endif() > + > +set(PERF_OUTPUT_DIR ${PROJECT_BINARY_DIR}/perf/output) > +file(MAKE_DIRECTORY ${PERF_OUTPUT_DIR}) > + > +# List of paths that will be used for each suite. > +make_lua_path(LUA_PATH_BENCH_BASE > + PATHS > + # Use of the bench module. > + ${CMAKE_CURRENT_SOURCE_DIR}/utils/?.lua > + # Simple usage with `jit.dump()`, etc. > + ${LUAJIT_SOURCE_DIR}/?.lua > + ${LUAJIT_BINARY_DIR}/?.lua > +) > + > +make_lua_path(LUA_CPATH > + PATHS > + # XXX: Some arches may have installed the cjson module here. > + /usr/lib64/lua/5.1/?.so > +) > + > +# Produce the pair: > +# Target to run for reporting and target to inspect from the > +# console, runnable by the CTest. > +macro(AddBenchTarget perf_suite) > + file(MAKE_DIRECTORY "${PERF_OUTPUT_DIR}/${perf_suite}/") > + message(STATUS "Add perf suite ${perf_suite}") > + add_custom_target(${perf_suite}) > + add_custom_target(${perf_suite}-console > + COMMAND ${CMAKE_CTEST_COMMAND} > + -L ${perf_suite} > + --parallel 1 > + --verbose > + --output-on-failure > + --no-tests=error may be --schedule-random, --timeout XXX (default timeout is 10000000)? > + ) > + add_dependencies(${perf_suite}-console luajit-main) > +endmacro() > + > +# Add the bench to the pair of targets created by the call above. > +macro(AddBench bench_name bench_path perf_suite LUA_PATH) > + set(bench_title "perf/${perf_suite}/${bench_name}") > + get_filename_component(bench_name_stripped ${bench_name} NAME_WE) > + set(bench_out_file > + ${PERF_OUTPUT_DIR}/${perf_suite}/${bench_name_stripped}.json > + ) > + set(bench_command "${LUAJIT_BINARY} ${bench_path}") > + if(${ARGC} GREATER 4) > + set(input_file ${ARGV4}) > + set(bench_command "${bench_command} < ${input_file}") > + endif() > + set(BENCH_FLAGS > + "--benchmark_out_format=json --benchmark_out=${bench_out_file}" > + ) > + set(bench_command_flags ${bench_command} ${BENCH_FLAGS}) > + separate_arguments(bench_command_separated UNIX_COMMAND ${bench_command}) > + add_custom_command( > + COMMAND ${CMAKE_COMMAND} -E env > + LUA_PATH="${LUA_PATH}" > + LUA_CPATH="${LUA_CPATH}" > + ${bench_command_separated} > + --benchmark_out_format=json > + --benchmark_out="${bench_out_file}" previous two lines can be replaced with ${BENCH_FLAGS}, right? > + OUTPUT ${bench_out_file} > + DEPENDS luajit-main > + COMMENT > + "Running benchmark ${bench_title} saving results in ${bench_out_file}." > + ) > + add_custom_target(${bench_name} DEPENDS ${bench_out_file}) > + add_dependencies(${perf_suite} ${bench_name}) > + > + # Report in the console. > + add_test(NAME ${bench_title} > + COMMAND sh -c "${bench_command}" > + ) > + set_tests_properties(${bench_title} PROPERTIES > + ENVIRONMENT "LUA_PATH=${LUA_PATH}" > + LABELS ${perf_suite} > + DEPENDS luajit-main > + ) > + unset(input_file) > +endmacro() > + > +add_subdirectory(LuaJIT-benches) > + > +add_custom_target(${PROJECT_NAME}-perf > + DEPENDS LuaJIT-benches missed a COMMENT field > +) > + > +add_custom_target(${PROJECT_NAME}-perf-console > + DEPENDS LuaJIT-benches-console missed a COMMENT field > +) > diff --git a/perf/LuaJIT-benches/CMakeLists.txt b/perf/LuaJIT-benches/CMakeLists.txt > new file mode 100644 > index 00000000..d9909f36 > --- /dev/null > +++ b/perf/LuaJIT-benches/CMakeLists.txt > @@ -0,0 +1,52 @@ > +set(PERF_SUITE_NAME LuaJIT-benches) > +set(LUA_BENCH_SUFFIX .lua) it is not a bench-specific suffix. May be LUA_SUFFIX? > + > +AddBenchTarget(${PERF_SUITE_NAME}) > + > +# Input for the k-nucleotide and revcomp benchmarks. > +set(FASTA_NAME ${CMAKE_CURRENT_BINARY_DIR}/FASTA_5000000) > +add_custom_target(FASTA_5000000 > + COMMAND ${LUAJIT_BINARY} > + ${CMAKE_CURRENT_SOURCE_DIR}/libs/fasta.lua 5000000 > ${FASTA_NAME} FASTA_5000000 is a plain text file. I propose to add extension .txt for its full name and probably postfix "_autogenerated". Like we do this for SUMCOL_5000 and SUMCOL_1. > + OUTPUT ${FASTA_NAME} > + DEPENDS luajit-main > + COMMENT "Generate ${FASTA_NAME}." > +) > + > +make_lua_path(LUA_PATH > + PATHS > + ${LUA_PATH_BENCH_BASE} > + ${CMAKE_CURRENT_SOURCE_DIR}/libs/?.lua > +) > + > +# Input for the benchmark. > +set(SUM_NAME ${CMAKE_CURRENT_BINARY_DIR}/SUMCOL_5000.txt) > +# Remove possibly existing file. > +file(REMOVE ${SUM_NAME}) Why do we need generate file after every cmake configuration? I propose to skip generation if file already exist or regenerate if SHA256 is not the same. > + > +set(SUMCOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/SUMCOL_1.txt) > +file(READ ${SUMCOL_FILE} SUMCOL_CONTENT) > +foreach(_unused RANGE 4999) > + file(APPEND ${SUM_NAME} "${SUMCOL_CONTENT}") > +endforeach() > + > +file(GLOB benches "${CMAKE_CURRENT_SOURCE_DIR}/*${LUA_BENCH_SUFFIX}") > +foreach(bench_path ${benches}) > + file(RELATIVE_PATH bench_name ${CMAKE_CURRENT_SOURCE_DIR} ${bench_path}) > + set(bench_title "perf/${PERF_SUITE_NAME}/${bench_name}") > + if(bench_name MATCHES "k-nucleotide" OR bench_name MATCHES "revcomp") > + AddBench(${bench_name} > + ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${FASTA_NAME} > + ) > + add_dependencies(${bench_name} FASTA_5000000) > + elseif(bench_name MATCHES "sum-file") > + AddBench(${bench_name} > + ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${SUM_NAME} > + ) > + else() > + AddBench(${bench_name} ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}") > + endif() > +endforeach() > + > +# We need to generate the file before we run tests. > +add_dependencies(${PERF_SUITE_NAME}-console FASTA_5000000) --------------dabYt5HuaQxRGq5rAJgW456D Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit

Hi, Sergey,

thanks for the patch! See my comments.

Sergey

On 10/24/25 14:00, Sergey Kaplun wrote:
This commit introduces CMake building scripts for the benches introduced
before. The benchmarks are enabled only if `LUAJIT_ENABLE_PERF` option
is set. For each suite (LuaJIT-benches in this patch set)
`AddBenchTarget()` macro generates 2 targets:
* Target to run all benches and store results in the
  perf/output/<suite_name> directory.
* Target to run all benches via CTest and inspect results in the
  console.

For the LuaJIT-benches there are 2 generated files:
* FASTA_5000000 -- is used as an input for <k-nukleotide.lua> and
                   <revcomp.lua>.
* SUMCOLL_5000.txt -- is used as an input for <sum-file.lua>.

These files and <perf/output> directory are added to the .gitignore files.
---
 .gitignore                         |  5 ++
 CMakeLists.txt                     | 11 ++++
 perf/CMakeLists.txt                | 99 ++++++++++++++++++++++++++++++
 perf/LuaJIT-benches/CMakeLists.txt | 52 ++++++++++++++++
 4 files changed, 167 insertions(+)
 create mode 100644 perf/CMakeLists.txt
 create mode 100644 perf/LuaJIT-benches/CMakeLists.txt

diff --git a/.gitignore b/.gitignore
index c26a7eb8..bfc7d401 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,8 @@ luajit-parse-memprof
 luajit-parse-sysprof
 luajit.pc
 *.c_test
+
+# Generated by the performance tests.
+FASTA_5000000
+SUMCOL_5000.txt
+perf/output/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c0da4362..73f46835 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -464,6 +464,17 @@ if(LUAJIT_USE_TEST)
 endif()
 add_subdirectory(test)
 
+# --- Benchmarks source tree ---------------------------------------------------
+
+# The option to enable performance tests for the LuaJIT.
+# Disabled by default, since commonly it is used only by LuaJIT
+# developers and run in the CI with the specially set-up machine.
+option(LUAJIT_ENABLE_PERF "Generate <perf> target" OFF)
+
+if(LUAJIT_ENABLE_PERF)

option name confuses a bit due to `perf` utility.

I would rename to something like "LUAJIT_ENABLE_PERF_TESTS".

Feel free to ignore.

+  add_subdirectory(perf)
+endif()
+
 # --- Misc rules ---------------------------------------------------------------
 
 # XXX: Implement <uninstall> target using the following recipe:
diff --git a/perf/CMakeLists.txt b/perf/CMakeLists.txt
new file mode 100644
index 00000000..cc3c312f
--- /dev/null
+++ b/perf/CMakeLists.txt
@@ -0,0 +1,99 @@
+# Running various bench suites against LuaJIT.
+
+include(MakeLuaPath)
+
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+  message(WARNING "LuaJIT and perf tests are built in the Debug mode."

s/./. /

missed whitespace after dot

+                  "Timings may be affected.")
+endif()
+
+set(PERF_OUTPUT_DIR ${PROJECT_BINARY_DIR}/perf/output)
+file(MAKE_DIRECTORY ${PERF_OUTPUT_DIR})
+
+# List of paths that will be used for each suite.
+make_lua_path(LUA_PATH_BENCH_BASE
+  PATHS
+    # Use of the bench module.
+    ${CMAKE_CURRENT_SOURCE_DIR}/utils/?.lua
+    # Simple usage with `jit.dump()`, etc.
+    ${LUAJIT_SOURCE_DIR}/?.lua
+    ${LUAJIT_BINARY_DIR}/?.lua
+)
+
+make_lua_path(LUA_CPATH
+  PATHS
+    # XXX: Some arches may have installed the cjson module here.
+    /usr/lib64/lua/5.1/?.so
+)
+
+# Produce the pair:
+# Target to run for reporting and target to inspect from the
+# console, runnable by the CTest.
+macro(AddBenchTarget perf_suite)
+  file(MAKE_DIRECTORY "${PERF_OUTPUT_DIR}/${perf_suite}/")
+  message(STATUS "Add perf suite ${perf_suite}")
+  add_custom_target(${perf_suite})
+  add_custom_target(${perf_suite}-console
+    COMMAND ${CMAKE_CTEST_COMMAND}
+      -L ${perf_suite}
+      --parallel 1
+      --verbose
+      --output-on-failure
+      --no-tests=error
may be --schedule-random, --timeout XXX (default timeout is 10000000)?
+  )
+  add_dependencies(${perf_suite}-console luajit-main)
+endmacro()
+
+# Add the bench to the pair of targets created by the call above.
+macro(AddBench bench_name bench_path perf_suite LUA_PATH)
+  set(bench_title "perf/${perf_suite}/${bench_name}")
+  get_filename_component(bench_name_stripped  ${bench_name} NAME_WE)
+  set(bench_out_file
+    ${PERF_OUTPUT_DIR}/${perf_suite}/${bench_name_stripped}.json
+  )
+  set(bench_command "${LUAJIT_BINARY} ${bench_path}")
+  if(${ARGC} GREATER 4)
+    set(input_file ${ARGV4})
+    set(bench_command "${bench_command} < ${input_file}")
+  endif()
+  set(BENCH_FLAGS
+    "--benchmark_out_format=json --benchmark_out=${bench_out_file}"
+  )
+  set(bench_command_flags ${bench_command} ${BENCH_FLAGS})
+  separate_arguments(bench_command_separated UNIX_COMMAND ${bench_command})
+  add_custom_command(
+    COMMAND ${CMAKE_COMMAND} -E env
+      LUA_PATH="${LUA_PATH}"
+      LUA_CPATH="${LUA_CPATH}"
+        ${bench_command_separated}
+          --benchmark_out_format=json
+          --benchmark_out="${bench_out_file}"
previous two lines can be replaced with ${BENCH_FLAGS}, right?
+    OUTPUT ${bench_out_file}
+    DEPENDS luajit-main
+    COMMENT
+      "Running benchmark ${bench_title} saving results in ${bench_out_file}."
+  )
+  add_custom_target(${bench_name} DEPENDS ${bench_out_file})
+  add_dependencies(${perf_suite} ${bench_name})
+
+  # Report in the console.
+  add_test(NAME ${bench_title}
+    COMMAND sh -c "${bench_command}"
+  )
+  set_tests_properties(${bench_title} PROPERTIES
+    ENVIRONMENT "LUA_PATH=${LUA_PATH}"
+    LABELS ${perf_suite}
+    DEPENDS luajit-main
+  )
+  unset(input_file)
+endmacro()
+
+add_subdirectory(LuaJIT-benches)
+
+add_custom_target(${PROJECT_NAME}-perf
+  DEPENDS LuaJIT-benches
missed a COMMENT field
+)
+
+add_custom_target(${PROJECT_NAME}-perf-console
+  DEPENDS LuaJIT-benches-console
missed a COMMENT field
+)
diff --git a/perf/LuaJIT-benches/CMakeLists.txt b/perf/LuaJIT-benches/CMakeLists.txt
new file mode 100644
index 00000000..d9909f36
--- /dev/null
+++ b/perf/LuaJIT-benches/CMakeLists.txt
@@ -0,0 +1,52 @@
+set(PERF_SUITE_NAME LuaJIT-benches)
+set(LUA_BENCH_SUFFIX .lua)
it is not a bench-specific suffix. May be LUA_SUFFIX?
+
+AddBenchTarget(${PERF_SUITE_NAME})
+
+# Input for the k-nucleotide and revcomp benchmarks.
+set(FASTA_NAME ${CMAKE_CURRENT_BINARY_DIR}/FASTA_5000000)
+add_custom_target(FASTA_5000000
+  COMMAND ${LUAJIT_BINARY}
+    ${CMAKE_CURRENT_SOURCE_DIR}/libs/fasta.lua 5000000 > ${FASTA_NAME}

FASTA_5000000 is a plain text file. I propose to add extension .txt for its full name and

probably postfix "_autogenerated". Like we do this for SUMCOL_5000 and SUMCOL_1.

+  OUTPUT ${FASTA_NAME}
+  DEPENDS luajit-main
+  COMMENT "Generate ${FASTA_NAME}."
+)
+
+make_lua_path(LUA_PATH
+  PATHS
+    ${LUA_PATH_BENCH_BASE}
+    ${CMAKE_CURRENT_SOURCE_DIR}/libs/?.lua
+)
+
+# Input for the <sum-file.lua> benchmark.
+set(SUM_NAME ${CMAKE_CURRENT_BINARY_DIR}/SUMCOL_5000.txt)
+# Remove possibly existing file.
+file(REMOVE ${SUM_NAME})

Why do we need generate file after every cmake configuration?

I propose to skip generation if file already exist or regenerate if SHA256 is not the same.

+
+set(SUMCOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/SUMCOL_1.txt)
+file(READ ${SUMCOL_FILE} SUMCOL_CONTENT)
+foreach(_unused RANGE 4999)
+  file(APPEND ${SUM_NAME} "${SUMCOL_CONTENT}")
+endforeach()
+
+file(GLOB benches "${CMAKE_CURRENT_SOURCE_DIR}/*${LUA_BENCH_SUFFIX}")
+foreach(bench_path ${benches})
+  file(RELATIVE_PATH bench_name ${CMAKE_CURRENT_SOURCE_DIR} ${bench_path})
+  set(bench_title "perf/${PERF_SUITE_NAME}/${bench_name}")
+  if(bench_name MATCHES "k-nucleotide" OR bench_name MATCHES "revcomp")
+    AddBench(${bench_name}
+      ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${FASTA_NAME}
+    )
+    add_dependencies(${bench_name} FASTA_5000000)
+  elseif(bench_name MATCHES "sum-file")
+    AddBench(${bench_name}
+      ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${SUM_NAME}
+    )
+  else()
+    AddBench(${bench_name} ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}")
+  endif()
+endforeach()
+
+# We need to generate the file before we run tests.
+add_dependencies(${PERF_SUITE_NAME}-console FASTA_5000000)
--------------dabYt5HuaQxRGq5rAJgW456D--