From 65b9af05d4cc381496d79c7b402d249ec40bb683 Mon Sep 17 00:00:00 2001 From: Marko Budiselic Date: Wed, 8 Jun 2016 23:39:24 +0200 Subject: [PATCH] cache benchmark and utils/time/timer improvement --- src/experimental/cache_benchmark.cpp | 48 +++++++++++++++++++++++++++ src/experimental/cache_benchmark.run | Bin 0 -> 15264 bytes src/utils/time/timer.hpp | 24 ++++++++------ src/utils/type_discovery.hpp | 2 +- 4 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 src/experimental/cache_benchmark.cpp create mode 100755 src/experimental/cache_benchmark.run diff --git a/src/experimental/cache_benchmark.cpp b/src/experimental/cache_benchmark.cpp new file mode 100644 index 000000000..ed5e132f0 --- /dev/null +++ b/src/experimental/cache_benchmark.cpp @@ -0,0 +1,48 @@ +#include + +#include "utils/time/timer.hpp" + +using std::cout; +using std::endl; + +using ns = std::chrono::nanoseconds; +using ms = std::chrono::milliseconds; + +constexpr long iterations_no = 10 * 1024 * 1024; + +struct DataShort +{ + long a; + long b; +}; + +struct DataLong +{ + long a; + long b; + long c; + long d; +}; + +DataShort *data_short = new DataShort[iterations_no]; +DataLong *data_long = new DataLong[iterations_no]; + +int main() +{ + auto time_short = timer([]() { + for (long i = 0; i < iterations_no; i++) { + data_short[i].a = data_short[i].b; + } + }); + + auto time_long = timer([]() { + for (long i = 0; i < iterations_no; i++) { + data_long[i].a = data_long[i].b; + } + }); + + cout << "Time short: " << time_short << " ms"<< endl; + cout << "Time long: " << time_long << " ms" << endl; + + return 0; +} diff --git a/src/experimental/cache_benchmark.run b/src/experimental/cache_benchmark.run new file mode 100755 index 0000000000000000000000000000000000000000..b2b470c00c85d9bbfb6e5e52b5c4d849d959b4a8 GIT binary patch literal 15264 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 z z@bGb{*f0ZYD=jg%IpHEcC}`!ua1jEt|2kwZOx%K7?@ z%=s6Y3z?lQh7n6r-(X#}d~iRt9f`|CF+0s~(TvFGD98I4GS)2ZQdFdY871lUpzrB! zJ)jxd!4As6lY`84q+J@Ct_1XsZo#2Gv}aF9Lk?VPTc<`!MPt%mOpwWa!sz(&!PW!8 zc1l>=e}{vBaj=G>38`)gQ>E|S@c_2h2jj<(y|=%|%F>f*a)E$MbF)(0;HXT3i=;Dh z1_Hl*J|ZOyI;>C%pqf_0G0ZVzal)Sl>aC|-zPFTCs6n0*5tGA|A88&Ri3ay!{$cWI zS|g$87A*RGG_8#hOdJzAiJ=y-iP3HZLmftF7f=egGZm5&6dhe~W&_R7!>DVmPqa_a^Ti^qe%Ds6ls^v1`Z*6vOktEGU+JhJmsmD&P6r) z!)DmZv@D+fMZ@_BTTGO#`JQLN>Biq{bqtj|Z%Oz^hN-iEAYxYoL3IsoGo^r8C<4M2YOcuN>4D9V= zfjc2>G4Q`^RD=;Fr>(6=Z5#DIJRYd1$jBQpJQv(q_!mWA)8d_dxL5b#M%|2kh6b{% zH<(|_VKw7~Om`OE^zmUc+y`i;EI7n9Y^TxGi0~$oX4Ko-7Tk%mBZUnnGTy#S4FA#) z>la?ahQjF~;q5=3fISPEDT|{{qKXg$yi_zECIwX+iJQVJmzWn-?_d%rlC<$lk3|ql z%4m9{L+U|js2@fcvsA4oB1?nozZZcRnh6ibBJd$;l6g>QXuMcd!b|rTJa4I|z)uh8 zTmg@e`S&tDFXR8);rA47fn@E4o}=-Io7d-awH`cIQ}M{(!VkZfFvX9GU7ye2Or^h- z1r>Da)AKP>Op;1Ge@=Hw5%|0ouNSi5F}kQ61V(4ctbeH@08HRqPXaNfI*iu`87J1~ zb6+}Vz$;>2pU?etGILk3S3O=1ZGtTFT zKBdp+BZQI+`>)IjI`<)0S$}MKK(fY^e!2K@|4%CYHmOxOKR>PX=M%RaR zg;lDuLMTb70hmI&m*-7z=c`w0EQysYsGyowdFsokQU7`T`2BxI>ED-^v?@;hzj5gE z`BP=BC4b>I`ez*ae6D**=~FJFy*T6dCYa+^Z{kjGMBKb86-e{O<7wz&WN4+5heOT$OTZN+1& zQ #include - -using time_point_t = std::chrono::high_resolution_clock::time_point; - -#define duration(a) \ - std::chrono::duration_cast(a).count() +#include +#include #define time_now() std::chrono::high_resolution_clock::now() -template -double timer(F func, Args&&... args) +template +auto to_duration(const std::chrono::duration &delta) { - time_point_t start_time = time_now(); - func(std::forward(args)...); - return duration(time_now() - start_time); + return std::chrono::duration_cast(delta).count(); +} + +template +auto timer(F func, Args &&... args) +{ + auto start_time = time_now(); + func(std::forward(args)...); + return to_duration(time_now() - start_time); } diff --git a/src/utils/type_discovery.hpp b/src/utils/type_discovery.hpp index 9d49a2665..9368afe66 100644 --- a/src/utils/type_discovery.hpp +++ b/src/utils/type_discovery.hpp @@ -1,7 +1,7 @@ #pragma once // USAGE: -// type_name>(); +// type_name(); // current solution has been taken from http://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in-standard-c // TODO: create more appropriate solution