From a6dd3f93cd43d6fa3d6d8f930ed7f7d293251728 Mon Sep 17 00:00:00 2001 From: Richard Thier Date: Thu, 3 Apr 2025 15:29:28 +0200 Subject: [PATCH] added C++ measurements --- perf.cpp | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/perf.cpp b/perf.cpp index 1df5117..03ed5d1 100644 --- a/perf.cpp +++ b/perf.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "fastrand.h" #define N 10000000 @@ -22,6 +23,10 @@ int main() { srand((unsigned int)time(NULL)); rand_state rs = init_rand(); rand_ilp_state rs_ilp = init_rand_ilp(); + // C++ engines + std::linear_congruential_engine lce; + std::mt19937 mte; + std::minstd_rand lce_def; // Generate FROM,TO as random, because otherwise compiler optimizes out IDIV of the '%' operator! uint32_t FROM = (uint32_t) rand(); @@ -45,6 +50,27 @@ int main() { auto t2 = std::chrono::high_resolution_clock::now(); + // C++ LCG + for (int i = 0; i < N; ++i) { + res[i] += lce_def(); + } + + auto t21 = std::chrono::high_resolution_clock::now(); + + // C++ LCG - my parameters + for (int i = 0; i < N; ++i) { + res[i] += lce(); + } + + auto t211 = std::chrono::high_resolution_clock::now(); + + // C++ MT + for (int i = 0; i < N; ++i) { + res[i] += mte(); + } + + auto t22 = std::chrono::high_resolution_clock::now(); + // lcg for (int i = 0; i < N; ++i) { res[i] += lcg(&rs); @@ -65,11 +91,17 @@ int main() { auto arc4_elapsed = std::chrono::duration_cast(t1 - t0); auto rand_elapsed = std::chrono::duration_cast(t2 - t1); - auto lcg_elapsed = std::chrono::duration_cast(t3 - t2); + auto lce_def_elapsed = std::chrono::duration_cast(t21 - t2); + auto lce_elapsed = std::chrono::duration_cast(t211 - t21); + auto mt_elapsed = std::chrono::duration_cast(t22 - t21); + auto lcg_elapsed = std::chrono::duration_cast(t3 - t22); auto lcg4_elapsed = std::chrono::duration_cast(t31 - t3); printf("Time (arc4): %.3f ms.\n", arc4_elapsed.count() * 1e-6); printf("Time (rand): %.3f ms.\n", rand_elapsed.count() * 1e-6); + printf("Time (C++ lcg): %.3f ms.\n", lce_def_elapsed.count() * 1e-6); + printf("Time (C++ lcg my parameters): %.3f ms.\n", lce_elapsed.count() * 1e-6); + printf("Time (C++ mersenne twister 32bit): %.3f ms.\n", mt_elapsed.count() * 1e-6); printf("Time (lcg): %.3f ms.\n", lcg_elapsed.count() * 1e-6); printf("Time (lcg4): %.3f ms.\n", lcg4_elapsed.count() * 1e-6);