summaryrefslogtreecommitdiffhomepage
path: root/benchmarks/clist_benchmark.cpp
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2021-02-10 23:17:01 +0100
committerTyge Løvset <[email protected]>2021-02-10 23:17:01 +0100
commitacd1c5560ac49b0812e258d35107603b7c8fe6f7 (patch)
treec20409204389c4c3c538aab24c16f15165210c0a /benchmarks/clist_benchmark.cpp
parentb9485b4410d2cb3d81766c487dd0edd0e92868d4 (diff)
downloadSTC-modified-acd1c5560ac49b0812e258d35107603b7c8fe6f7.tar.gz
STC-modified-acd1c5560ac49b0812e258d35107603b7c8fe6f7.zip
Benchmark image added.
Diffstat (limited to 'benchmarks/clist_benchmark.cpp')
-rw-r--r--benchmarks/clist_benchmark.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/benchmarks/clist_benchmark.cpp b/benchmarks/clist_benchmark.cpp
new file mode 100644
index 00000000..f8cadae3
--- /dev/null
+++ b/benchmarks/clist_benchmark.cpp
@@ -0,0 +1,110 @@
+#include <stdio.h>
+#include <time.h>
+#include <stc/crandom.h>
+#include <stc/clist.h>
+
+#ifdef __cplusplus
+#include <forward_list>
+#endif
+
+enum {INSERT, ERASE, FIND, ITER, DESTRUCT, N_TESTS};
+const char* operations[] = {"insert", "erase", "find", "iter", "destruct"};
+typedef struct { time_t t1, t2; uint64_t sum; float fac; } Range;
+typedef struct { const char* name; Range test[N_TESTS]; } Sample;
+enum {SAMPLES = 3, N = 50000000};
+
+uint64_t seed = 1, mask1 = 0xfffffff;
+
+static float secs(Range s) { return (float)(s.t2 - s.t1) / CLOCKS_PER_SEC; }
+
+using_clist(x, size_t);
+
+#ifdef __cplusplus
+Sample test_std_forward_list() {
+ typedef std::forward_list<size_t> container;
+ Sample s = {"std,forward_list"};
+ {
+ s.test[INSERT].t1 = clock();
+ container con;
+ stc64_srandom(seed);
+ c_forrange (N/2) con.push_front(stc64_random() & mask1);
+ c_forrange (N/2) con.push_front(stc64_random() & mask1);
+ s.test[INSERT].t2 = clock();
+ s.test[INSERT].sum = 0;
+ s.test[ERASE].t1 = clock();
+ c_forrange (N) con.pop_front();
+ s.test[ERASE].t2 = clock();
+ s.test[ERASE].sum = 0;
+ }{
+ container con;
+ stc64_srandom(seed);
+ c_forrange (N) con.push_front(stc64_random() & mask1);
+ s.test[ITER].t1 = clock();
+ size_t sum = 0;
+ for (auto i: con) sum += i;
+ s.test[ITER].t2 = clock();
+ s.test[ITER].sum = sum;
+ s.test[DESTRUCT].t1 = clock();
+ }
+ s.test[DESTRUCT].t2 = clock();
+ s.test[DESTRUCT].sum = 0;
+ return s;
+}
+#else
+Sample test_std_forward_list() { Sample s = {"std-forward_list"}; return s;}
+#endif
+
+
+Sample test_stc_forward_list() {
+ typedef clist_x container;
+ Sample s = {"STC,forward_list"};
+ {
+ s.test[INSERT].t1 = clock();
+ container con = clist_x_init();
+ stc64_srandom(seed);
+ c_forrange (N/2) clist_x_push_front(&con, stc64_random() & mask1);
+ c_forrange (N/2) clist_x_push_back(&con, stc64_random() & mask1);
+ s.test[INSERT].t2 = clock();
+ s.test[INSERT].sum = 0;
+ s.test[ERASE].t1 = clock();
+ c_forrange (N) clist_x_pop_front(&con);
+ s.test[ERASE].t2 = clock();
+ s.test[ERASE].sum = 0;
+ clist_x_del(&con);
+ }{
+ stc64_srandom(seed);
+ container con = clist_x_init();
+ c_forrange (N) clist_x_push_front(&con, stc64_random() & mask1);
+ s.test[ITER].t1 = clock();
+ size_t sum = 0;
+ c_foreach (i, clist_x, con) sum += *i.ref;
+ s.test[ITER].t2 = clock();
+ s.test[ITER].sum = sum;
+ s.test[DESTRUCT].t1 = clock();
+ clist_x_del(&con);
+ }
+ s.test[DESTRUCT].t2 = clock();
+ s.test[DESTRUCT].sum = 0;
+ return s;
+}
+
+int main(int argc, char* argv[])
+{
+ Sample std_s[SAMPLES + 1], stc_s[SAMPLES + 1];
+ c_forrange (i, int, SAMPLES) {
+ std_s[i] = test_std_forward_list();
+ stc_s[i] = test_stc_forward_list();
+ if (i > 0) c_forrange (j, int, N_TESTS) {
+ if (secs(std_s[i].test[j]) < secs(std_s[0].test[j])) std_s[0].test[j] = std_s[i].test[j];
+ if (secs(stc_s[i].test[j]) < secs(stc_s[0].test[j])) stc_s[0].test[j] = stc_s[i].test[j];
+ if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %d, sample %d\n", i, j);
+ }
+ }
+ float std_sum = 0, stc_sum = 0;
+ c_forrange (j, N_TESTS) { std_sum += secs(std_s[0].test[j]); stc_sum += secs(stc_s[0].test[j]); }
+ if (argv[1][0] == '1') printf("compiler,library,container,count,operation,time,ratio\n");
+ c_forrange (j, N_TESTS) printf("%s,%s,%d,%s,%.3f,%.3f\n", argv[2], std_s[0].name, N, operations[j], secs(std_s[0].test[j]), 1.0f);
+ printf("%s,%s,%d,%s,%.3f,%.3f\n", argv[2], std_s[0].name, N, "total", std_sum, 1.0f);
+ c_forrange (j, N_TESTS) printf("%s,%s,%d,%s,%.3f,%.3f\n", argv[2], stc_s[0].name, N, operations[j], secs(stc_s[0].test[j]), secs(std_s[0].test[j]) ? secs(stc_s[0].test[j])/secs(std_s[0].test[j]) : 1.0f);
+ printf("%s,%s,%d,%s,%.3f,%.3f\n", argv[2], stc_s[0].name, N, "total", stc_sum, stc_sum/std_sum);
+} \ No newline at end of file