这只是代数,而不是方程或理论。
如果您已经知道字节/秒和时钟速度(周期/秒),那么
(bytes/second) / (cycles/second) => bytes/cycle
1 / (bytes/cycle) => cycles/byte
如果您不知道每秒字节数,可以通过以下方式计算:
- 获得适合这种测量的高分辨率时间戳T 1
- 在B个字节上运行你的算法N次
- 获取另一个时间戳T 2
- 从另一个中减去时间戳,得到经过的时间E = T 2 - T 1
- 您现在已经以E时间单位处理了(N * B)个字节
- 重复几次
- 如果您的测量值不稳定,或者您的持续时间E令人不安地接近于零,或者可疑地接近某个系统计时器粒度,请增加N和/或B并重试。实际上,无论如何都要这样做几次,以确认您得到处理的字节数和所用时间之间的线性关系
- 将您的时间单位(纳秒、微秒,无论它们是什么)缩放为秒,如果这是您想要显示结果的方式
请注意,如果您上面的“时间戳”实际上是一个周期计数器,您可以跳过周期/第二阶段。否则,您可以从平台的系统/硬件信息工具中读取 CPU 频率。
例如,对于 POSIX,一个合理的计时器可能是clock_gettime(CLOCK_THREAD_CPUTIME_ID,...)
。您应该能够rdtsc
通过搜索找到最佳 Windows 计时功能的示例代码、文档等。
至于实际进行测量,评论中有很好的建议。你需要:
- 取大量(足够)样本以使其可靠
- 理想情况下,如果没有 FIFO/实时调度,则没有其他东西争夺资源
- 要么确保关闭任何 CPU 时钟缩放,要么丢弃它正在预热的第一个样本