当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 如何准确测量c函数使用的时钟周期?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我知道我必须使用:rdtsc.测量的函数是确定性的,但结果远非可重复(我从运行到运行得到5%的振荡). 可能的原因是: 上下文切换 缓存未命中 你知道其他原因吗? 如何消除它们? TSC(
我知道我必须使用:rdtsc.测量的函数是确定性的,但结果远非可重复(我从运行到运行得到5%的振荡).
可能的原因是:

>上下文切换
>缓存未命中

你知道其他原因吗?
如何消除它们?

TSC(rdtsc使用的)通常在多处理器系统上不同步.设置CPU亲和性以将进程绑定到单个CPU可能会有所帮助.

您也可以从HPET timers获得时间戳(如果可用),这些时间戳不容易出现同样的问题.

至于可重复性,这些差异是正确的.您可以禁用缓存,为进程提供实时优先级和/或(如果在Linux或类似的情况下)使用较低的固定定时器中断频率(执行时间分片的那个)重新编译内核.您不能完全消除差异,至少不容易消除,而不是常规CPU OS组合.

一般而言,为了便于编码,可靠性和可移植性,我建议您使用操作系统提供的功能.如果它提供高精度计时器,请使用适当的OS助手.

(以防万一你正在尝试对加密系统进行时间攻击,好吧,你将不得不忍受1.这种随机性和2.一般防御使得系统因各种原因无法预测,所以功能可能不会在时间上是确定性的.)

编辑:添加了关于操作系统可提供的计时器的段落.

编辑:这是指Linux.为了将进程绑定到单个CPU(从RDTSC获得准确的读取),可以使用sched_setaffinity(2).而here是我的一个项目中的一些代码,用于其他目的(将线程映射到CPU).这应该是你的第一次尝试.对于HPET,只要内核和机器支持这些定时器,就可以像these一样使用常规的POSIX调用.

网友评论