C++ C++;基准测试,易变的

C++ C++;基准测试,易变的,c++,benchmarking,side-channel-attacks,C++,Benchmarking,Side Channel Attacks,我试图用rdtsc测量执行函数“check()”所需的时间,如下所示: a = rdtsc(); check(pw); b = rdtsc(); return (b-a); 但是,我收到的时间差非常小,我认为这是由于我的编译器(在windows上使用G++)优化了代码。由于“check()”不影响程序的任何其他部分,我认为编译器完全忽略了这个调用 我读过关于使用asm volatile告诉编译器不要优化某段代码的内容,但我不知道如何实现它 这方面有什么帮助吗?该函数可能会计算并返回一些值。使

我试图用rdtsc测量执行函数“check()”所需的时间,如下所示:

a = rdtsc();
check(pw);
b = rdtsc();

return (b-a);
但是,我收到的时间差非常小,我认为这是由于我的编译器(在windows上使用G++)优化了代码。由于“check()”不影响程序的任何其他部分,我认为编译器完全忽略了这个调用

我读过关于使用asm volatile告诉编译器不要优化某段代码的内容,但我不知道如何实现它


这方面有什么帮助吗?

该函数可能会计算并返回一些值。使用该值执行某些操作,例如将其添加到全局变量中(并最终打印出该变量),这样编译器就无法轻松优化函数。

可能函数会计算并返回一些值。使用该值执行某些操作,例如将其添加到全局变量(并最终打印出该变量),这样编译器就无法轻松优化函数。

1)您需要运行数亿次迭代才能获得某种平均性能

2) 不要对这些低级的东西进行基准测试,因为它几乎与现实世界无关。实际任务工作数十亿CPU周期和单个volatile只会增加0.000001%的开销。。。或者,如果您的线程不断访问共享数据,则可能会将其增加100000%。您可以对您的算法的一部分进行基准测试,然后对其进行改进,但不需要特定的指令。

1)您需要运行数亿次迭代才能获得某种平均性能


2) 不要对这些低级的东西进行基准测试,因为它几乎与现实世界无关。实际任务工作数十亿CPU周期和单个volatile只会增加0.000001%的开销。。。或者,如果您的线程不断访问共享数据,则可能会将其增加100000%。您可以对您的算法的一部分进行基准测试,然后对其进行改进,但不能对特定的指令进行改进。

如果它花费的时间太少,以至于您无法测量它,那么为什么还要担心它呢?“你肯定有更大的(表演)的事情要做……”杰斯帕尔表示歉意,我应该说得不那么含糊。我的目标不是优化性能,我需要分析不同输入的时间,以找出哪些输入会导致时间泄漏。将
-O0
设置到编译器?@Jesper Juhl我的目标是找到加密函数中的时间泄漏,以便攻击它们,因此我无法重新编写函数本身。这是一个大学项目,所以这是一个完全假设的案例,因此,我想构建自己的框架,而不是使用预先制作的框架。如果您认为调用正在优化,请查看汇编程序列表以获得明确的答案。如果它花费的时间太少,以至于您在度量它时遇到困难,那么为什么还要担心它呢?“你肯定有更大的(表演)的事情要做……”杰斯帕尔表示歉意,我应该说得不那么含糊。我的目标不是优化性能,我需要分析不同输入的时间,以找出哪些输入会导致时间泄漏。将
-O0
设置到编译器?@Jesper Juhl我的目标是找到加密函数中的时间泄漏,以便攻击它们,因此我无法重新编写函数本身。这是一个大学项目,所以这是一个完全假设的案例,因此,我想构建自己的框架,而不是使用预先制作的框架。如果你认为调用正在优化,检查汇编程序列表以获得最终答案。对每个输入运行函数一百万次,然后计时。对每个输入运行函数一百万次,然后计时。