]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
changed color output to csv output
authorgtsoul-tech <gtsoulkanakis@gmail.com>
Mon, 1 Apr 2024 13:05:13 +0000 (16:05 +0300)
committergtsoul-tech <gtsoulkanakis@gmail.com>
Mon, 1 Apr 2024 13:05:13 +0000 (16:05 +0300)
benchmarks/benchmarks.cpp

index 91cab3f8daec4582ff8540d3953e4b619e56a1f3..c6e453ef584fb470b04dae4b96575fe7d23c089a 100644 (file)
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <iostream>
 #include <chrono>
+#include <cstdlib>
 #include <cstring>
 #include <ctime>
-#include <cstdlib>
-#include <memory>
 #include <functional>
+#include <iostream>
+#include <memory>
 
 #include "benchmarks.hpp"
 
-#define MAX_LOOPS    1000000000
-#define MAX_MATCHES  5
-#define N            8
+#define MAX_LOOPS 1000000000
+#define MAX_MATCHES 5
+#define N 8
 
 struct hlmMatchEntry {
     size_t to;
     u32 id;
-    hlmMatchEntry(size_t end, u32 identifier) :
-            to(end), id(identifier) {}
+    hlmMatchEntry(size_t end, u32 identifier) : to(end), id(identifier) {}
 };
 
 std::vector<hlmMatchEntry> ctxt;
 
-static
-hwlmcb_rv_t hlmSimpleCallback(size_t to, u32 id,
-                              UNUSED struct hs_scratch *scratch) {
+static hwlmcb_rv_t hlmSimpleCallback(size_t to, u32 id,
+                                     UNUSED struct hs_scratch *scratch) {
     DEBUG_PRINTF("match @%zu = %u\n", to, id);
 
     ctxt.push_back(hlmMatchEntry(to, id));
@@ -59,10 +57,12 @@ hwlmcb_rv_t hlmSimpleCallback(size_t to, u32 id,
     return HWLM_CONTINUE_MATCHING;
 }
 
-template<typename InitFunc, typename BenchFunc>
-static void run_benchmarks(int size, int loops, int max_matches, bool is_reverse, MicroBenchmark &bench, InitFunc &&init, BenchFunc &&func) {
+template <typename InitFunc, typename BenchFunc>
+static void run_benchmarks(int size, int loops, int max_matches,
+                           bool is_reverse, MicroBenchmark &bench,
+                           InitFunc &&init, BenchFunc &&func) {
     init(bench);
-    double total_sec = 0.0;            
+    double total_sec = 0.0;
     u64a total_size = 0;
     double bw = 0.0;
     double avg_bw = 0.0;
@@ -70,29 +70,31 @@ static void run_benchmarks(int size, int loops, int max_matches, bool is_reverse
     double avg_time = 0.0;
     if (max_matches) {
         int pos = 0;
-        for(int j = 0; j < max_matches - 1; j++) {
+        for (int j = 0; j < max_matches - 1; j++) {
             bench.buf[pos] = 'b';
-            pos = (j+1) *size / max_matches ;
+            pos = (j + 1) * size / max_matches;
             bench.buf[pos] = 'a';
             u64a actual_size = 0;
             auto start = std::chrono::steady_clock::now();
-            for(int i = 0; i < loops; i++) { 
+            for (int i = 0; i < loops; i++) {
                 const u8 *res = func(bench);
-               if (is_reverse)
-                  actual_size += bench.buf.data() + size - res;
-               else
-                   actual_size += res - bench.buf.data();
+                if (is_reverse)
+                    actual_size += bench.buf.data() + size - res;
+                else
+                    actual_size += res - bench.buf.data();
             }
             auto end = std::chrono::steady_clock::now();
-            double dt = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
+            double dt = std::chrono::duration_cast<std::chrono::microseconds>(
+                            end - start)
+                            .count();
             total_sec += dt;
             /*convert microseconds to seconds*/
             /*calculate bandwidth*/
-            bw  = (actual_size / dt) * 1000000.0 / 1048576.0;
-           /*std::cout << "act_size = " << act_size << std::endl;
-           std::cout << "dt = " << dt << std::endl;
-           std::cout << "bw = " << bw << std::endl;*/
-           avg_bw += bw;
+            bw = (actual_size / dt) * 1000000.0 / 1048576.0;
+            /*std::cout << "act_size = " << act_size << std::endl;
+            std::cout << "dt = " << dt << std::endl;
+            std::cout << "bw = " << bw << std::endl;*/
+            avg_bw += bw;
             /*convert to MB/s*/
             max_bw = std::max(bw, max_bw);
             /*calculate average time*/
@@ -100,18 +102,28 @@ static void run_benchmarks(int size, int loops, int max_matches, bool is_reverse
         }
         avg_time /= max_matches;
         avg_bw /= max_matches;
-       total_sec /= 1000000.0;
+        total_sec /= 1000000.0;
         /*convert average time to us*/
-        printf(KMAG "%s: %u matches, %u * %u iterations," KBLU " total elapsed time =" RST " %.3f s, " 
-               KBLU "average time per call =" RST " %.3f μs," KBLU " max bandwidth = " RST " %.3f MB/s," KBLU " average bandwidth =" RST " %.3f MB/s \n",
-               bench.label, max_matches, size ,loops, total_sec, avg_time, max_bw, avg_bw);
+        /* Keeping the color output
+        printf(KMAG "%s: %u matches, %u * %u iterations," KBLU
+                    " total elapsed time =" RST " %.3f s, " KBLU
+                    "average time per call =" RST " %.3f μs," KBLU
+                    " max bandwidth = " RST " %.3f MB/s," KBLU
+                    " average bandwidth =" RST " %.3f MB/s \n",
+               bench.label, max_matches, size, loops, total_sec, avg_time,
+               max_bw, avg_bw);
+        */
+        printf("%s,%u,%u,%u,%.3f,%.3f,%.3f,%.3f\n", bench.label, max_matches,
+               size, loops, total_sec, avg_time, max_bw, avg_bw);
     } else {
         auto start = std::chrono::steady_clock::now();
         for (int i = 0; i < loops; i++) {
             const u8 *res = func(bench);
         }
         auto end = std::chrono::steady_clock::now();
-        total_sec += std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
+        total_sec +=
+            std::chrono::duration_cast<std::chrono::microseconds>(end - start)
+                .count();
         /*calculate transferred size*/
         total_size = size * loops;
         /*calculate average time*/
@@ -122,117 +134,131 @@ static void run_benchmarks(int size, int loops, int max_matches, bool is_reverse
         max_bw = total_size / total_sec;
         /*convert to MB/s*/
         max_bw /= 1048576.0;
-        printf(KMAG "%s: no matches, %u * %u iterations," KBLU " total elapsed time =" RST " %.3f s, " 
-               KBLU "average time per call =" RST " %.3f μs ," KBLU " bandwidth = " RST " %.3f MB/s \n",
-               bench.label, size ,loops, total_sec, avg_time, max_bw );
+        /*Keeping the color output
+        printf(KMAG "%s: no matches, %u * %u iterations," KBLU " total elapsed
+        time =" RST " %.3f s, " KBLU "average time per call =" RST " %.3f μs ,"
+        KBLU " bandwidth = " RST " %.3f MB/s \n", bench.label, size ,loops,
+        total_sec, avg_time, max_bw );
+        */
+        printf("%s,0,%u,%u,%.3f,%.3f,%.3f,0\n", bench.label, size, loops,
+               total_sec, avg_time, max_bw);
     }
 }
 
-int main(){
+int main() {
     int matches[] = {0, MAX_MATCHES};
     std::vector<size_t> sizes;
-    for (size_t i = 0; i < N; i++) sizes.push_back(16000 << i*2);
-    const char charset[] = "aAaAaAaAAAaaaaAAAAaaaaAAAAAAaaaAAaaa"; 
-  
+    for (size_t i = 0; i < N; i++)
+        sizes.push_back(16000 << i * 2);
+    const char charset[] = "aAaAaAaAAAaaaaAAAAaaaaAAAAAAaaaAAaaa";
+    printf("Bench Label, max_matches, size,loops, total_sec, avg_time, "
+           "max_bw, avg_bw\n");
     for (int m = 0; m < 2; m++) {
         for (size_t i = 0; i < std::size(sizes); i++) {
             MicroBenchmark bench("Shufti", sizes[i]);
-            run_benchmarks(sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
+            run_benchmarks(
+                sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
                 [&](MicroBenchmark &b) {
                     b.chars.set('a');
                     ue2::shuftiBuildMasks(b.chars, (u8 *)&b.lo, (u8 *)&b.hi);
                     memset(b.buf.data(), 'b', b.size);
                 },
                 [&](MicroBenchmark &b) {
-                    return shuftiExec(b.lo, b.hi, b.buf.data(), b.buf.data() + b.size);
-                }
-            );
+                    return shuftiExec(b.lo, b.hi, b.buf.data(),
+                                      b.buf.data() + b.size);
+                });
         }
 
         for (size_t i = 0; i < std::size(sizes); i++) {
             MicroBenchmark bench("Reverse Shufti", sizes[i]);
-            run_benchmarks(sizes[i], MAX_LOOPS / sizes[i], matches[m], true, bench,
+            run_benchmarks(
+                sizes[i], MAX_LOOPS / sizes[i], matches[m], true, bench,
                 [&](MicroBenchmark &b) {
                     b.chars.set('a');
                     ue2::shuftiBuildMasks(b.chars, (u8 *)&b.lo, (u8 *)&b.hi);
                     memset(b.buf.data(), 'b', b.size);
                 },
                 [&](MicroBenchmark &b) {
-                    return rshuftiExec(b.lo, b.hi, b.buf.data(), b.buf.data() + b.size);
-                }
-            );
+                    return rshuftiExec(b.lo, b.hi, b.buf.data(),
+                                       b.buf.data() + b.size);
+                });
         }
 
         for (size_t i = 0; i < std::size(sizes); i++) {
             MicroBenchmark bench("Truffle", sizes[i]);
-            run_benchmarks(sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
+            run_benchmarks(
+                sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
                 [&](MicroBenchmark &b) {
                     b.chars.set('a');
                     ue2::truffleBuildMasks(b.chars, (u8 *)&b.lo, (u8 *)&b.hi);
                     memset(b.buf.data(), 'b', b.size);
                 },
                 [&](MicroBenchmark &b) {
-                    return truffleExec(b.lo, b.hi, b.buf.data(), b.buf.data() + b.size);
-                }
-            );
+                    return truffleExec(b.lo, b.hi, b.buf.data(),
+                                       b.buf.data() + b.size);
+                });
         }
 
         for (size_t i = 0; i < std::size(sizes); i++) {
             MicroBenchmark bench("Reverse Truffle", sizes[i]);
-            run_benchmarks(sizes[i], MAX_LOOPS / sizes[i], matches[m], true, bench,
+            run_benchmarks(
+                sizes[i], MAX_LOOPS / sizes[i], matches[m], true, bench,
                 [&](MicroBenchmark &b) {
                     b.chars.set('a');
                     ue2::truffleBuildMasks(b.chars, (u8 *)&b.lo, (u8 *)&b.hi);
                     memset(b.buf.data(), 'b', b.size);
                 },
                 [&](MicroBenchmark &b) {
-                    return rtruffleExec(b.lo, b.hi, b.buf.data(), b.buf.data() + b.size);
-                }
-            );
+                    return rtruffleExec(b.lo, b.hi, b.buf.data(),
+                                        b.buf.data() + b.size);
+                });
         }
 
         for (size_t i = 0; i < std::size(sizes); i++) {
             MicroBenchmark bench("Vermicelli", sizes[i]);
-            run_benchmarks(sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
+            run_benchmarks(
+                sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
                 [&](MicroBenchmark &b) {
                     b.chars.set('a');
                     ue2::truffleBuildMasks(b.chars, (u8 *)&b.lo, (u8 *)&b.hi);
                     memset(b.buf.data(), 'b', b.size);
                 },
                 [&](MicroBenchmark &b) {
-                    return vermicelliExec('a', 'b', b.buf.data(), b.buf.data() + b.size);
-                }
-            );
+                    return vermicelliExec('a', 'b', b.buf.data(),
+                                          b.buf.data() + b.size);
+                });
         }
 
         for (size_t i = 0; i < std::size(sizes); i++) {
             MicroBenchmark bench("Reverse Vermicelli", sizes[i]);
-            run_benchmarks(sizes[i], MAX_LOOPS / sizes[i], matches[m], true, bench,
+            run_benchmarks(
+                sizes[i], MAX_LOOPS / sizes[i], matches[m], true, bench,
                 [&](MicroBenchmark &b) {
                     b.chars.set('a');
                     ue2::truffleBuildMasks(b.chars, (u8 *)&b.lo, (u8 *)&b.hi);
                     memset(b.buf.data(), 'b', b.size);
                 },
                 [&](MicroBenchmark &b) {
-                    return rvermicelliExec('a', 'b', b.buf.data(), b.buf.data() + b.size);
-                }
-            );
+                    return rvermicelliExec('a', 'b', b.buf.data(),
+                                           b.buf.data() + b.size);
+                });
         }
 
         for (size_t i = 0; i < std::size(sizes); i++) {
-            //we imitate the noodle unit tests
+            // we imitate the noodle unit tests
             std::string str;
             const size_t char_len = 5;
             str.resize(char_len + 1);
-            for (size_t j=0; j < char_len; j++) {
-                srand (time(NULL));
-                int key = rand() % + 36 ;
+            for (size_t j = 0; j < char_len; j++) {
+                srand(time(NULL));
+                int key = rand() % +36;
                 str[char_len] = charset[key];
                 str[char_len + 1] = '\0';
             }
 
             MicroBenchmark bench("Noodle", sizes[i]);
-            run_benchmarks(sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
+            run_benchmarks(
+                sizes[i], MAX_LOOPS / sizes[i], matches[m], false, bench,
                 [&](MicroBenchmark &b) {
                     ctxt.clear();
                     memset(b.buf.data(), 'a', b.size);
@@ -242,10 +268,10 @@ int main(){
                     assert(b.nt != nullptr);
                 },
                 [&](MicroBenchmark &b) {
-                    noodExec(b.nt.get(), b.buf.data(), b.size, 0, hlmSimpleCallback, &b.scratch);
+                    noodExec(b.nt.get(), b.buf.data(), b.size, 0,
+                             hlmSimpleCallback, &b.scratch);
                     return b.buf.data() + b.size;
-                }
-           );
+                });
         }
     }