summaryrefslogtreecommitdiffhomepage
path: root/benchmarks/misc/cbits_benchmark.cpp
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2022-05-24 21:12:56 +0200
committerTyge Løvset <[email protected]>2022-05-24 21:12:56 +0200
commitebc7316ac3859bc5e2f01c85bee86d6adea45898 (patch)
treefb653c49e223cca40aea3fc2d734cd69b608b46d /benchmarks/misc/cbits_benchmark.cpp
parent966100106830f990bc3e1b40a5b5c39b64d5e9b0 (diff)
downloadSTC-modified-ebc7316ac3859bc5e2f01c85bee86d6adea45898.tar.gz
STC-modified-ebc7316ac3859bc5e2f01c85bee86d6adea45898.zip
API change: cbits now uses container pointers args in all member functions, except clone() ... for now. All containers may get same treatment! which will be a rather big API change. This was needed after testing fixed size cbits performance with pass-by-value: was very slow for large bitsets: now faster than std::bitset<>. Also reverted previous cbits_set_value(): much faster because it is branchless.
Diffstat (limited to 'benchmarks/misc/cbits_benchmark.cpp')
-rw-r--r--benchmarks/misc/cbits_benchmark.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/benchmarks/misc/cbits_benchmark.cpp b/benchmarks/misc/cbits_benchmark.cpp
new file mode 100644
index 00000000..50e19a7c
--- /dev/null
+++ b/benchmarks/misc/cbits_benchmark.cpp
@@ -0,0 +1,123 @@
+#include <iostream>
+#include <bitset>
+#include <cstdlib> // rand
+#include <ctime> // timer
+
+enum{ N=1<<22 }; // 4.2 mill.
+
+#include <stc/crandom.h>
+#define i_type cbits
+#define i_len N
+#include <stc/cbits.h>
+
+inline unsigned long get_time_in_ms()
+{
+ return (unsigned long)(1000 * clock() / CLOCKS_PER_SEC);
+}
+
+
+void one_sec_delay()
+{
+ unsigned long end_time = get_time_in_ms() + 1000;
+
+ while(get_time_in_ms() < end_time)
+ {
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ size_t seed = time(NULL);
+
+ using namespace std;
+ bool *bools = new bool[N];
+
+ unsigned long current_time, difference1, difference2;
+ uint64_t total;
+
+ one_sec_delay();
+
+ total = 0;
+ csrandom(seed);
+ current_time = get_time_in_ms();
+
+ c_forrange (40 * N)
+ {
+ uint64_t r = crandom();
+ bools[r & (N-1)] = r & 1<<29;
+ }
+
+ difference1 = get_time_in_ms() - current_time;
+ current_time = get_time_in_ms();
+
+ c_forrange (100) c_forrange (num, N)
+ {
+ total += bools[num];
+ }
+
+ delete [] bools;
+
+ difference2 = get_time_in_ms() - current_time;
+
+ cout << "Bool:" << endl << "sum total = " << total << ", random access time = " << difference1
+ << ", sequential access time = " << difference2 << endl << endl;
+
+ one_sec_delay();
+
+ total = 0;
+ csrandom(seed);
+ current_time = get_time_in_ms();
+ bitset<N> bits;
+
+ c_forrange (40 * N)
+ {
+ uint64_t r = crandom();
+ bits[r & (N-1)] = r & 1<<29;
+ }
+
+ difference1 = get_time_in_ms() - current_time;
+ current_time = get_time_in_ms();
+
+ c_forrange (100) c_forrange (num, N)
+ {
+ total += bits[num];
+ }
+
+ difference2 = get_time_in_ms() - current_time;
+
+ cout << "Bitset:" << endl << "sum total = " << total << ", random access time = " << difference1
+ << ", sequential access time = " << difference2 << endl << endl;
+
+ one_sec_delay();
+
+ total = 0;
+ csrandom(seed);
+ current_time = get_time_in_ms();
+ cbits bits2 = cbits_with_size(N, false);
+
+ c_forrange (40 * N)
+ {
+ uint64_t r = crandom();
+ cbits_set_value(&bits2, r & (N-1), r & 1<<29);
+ }
+
+ difference1 = get_time_in_ms() - current_time;
+ current_time = get_time_in_ms();
+
+ c_forrange (100) c_forrange (num, N)
+ {
+ total += cbits_at(&bits2, num);
+ }
+
+ cbits_drop(&bits2);
+
+ difference2 = get_time_in_ms() - current_time;
+
+ cout << "cbits:" << endl << "sum total = " << total << ", random access time = " << difference1
+ << ", sequential access time = " << difference2 << endl << endl;
+
+ //cin.get();
+
+ return 0;
+}