我知道我必须使用:rdtsc.测量的函数是确定性的,但结果远非可重复(我从运行到运行得到5%的振荡). 可能的原因是: 上下文切换 缓存未命中 你知道其他原因吗? 如何消除它们? TSC(
可能的原因是:
>上下文切换
>缓存未命中
你知道其他原因吗?
如何消除它们?
您也可以从HPET timers获得时间戳(如果可用),这些时间戳不容易出现同样的问题.
至于可重复性,这些差异是正确的.您可以禁用缓存,为进程提供实时优先级和/或(如果在Linux或类似的情况下)使用较低的固定定时器中断频率(执行时间分片的那个)重新编译内核.您不能完全消除差异,至少不容易消除,而不是常规CPU OS组合.
一般而言,为了便于编码,可靠性和可移植性,我建议您使用操作系统提供的功能.如果它提供高精度计时器,请使用适当的OS助手.
(以防万一你正在尝试对加密系统进行时间攻击,好吧,你将不得不忍受1.这种随机性和2.一般防御使得系统因各种原因无法预测,所以功能可能不会在时间上是确定性的.)
编辑:添加了关于操作系统可提供的计时器的段落.
编辑:这是指Linux.为了将进程绑定到单个CPU(从RDTSC获得准确的读取),可以使用sched_setaffinity(2).而here是我的一个项目中的一些代码,用于其他目的(将线程映射到CPU).这应该是你的第一次尝试.对于HPET,只要内核和机器支持这些定时器,就可以像these一样使用常规的POSIX调用.