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