c++ - 使用 C++ 在多线程应用程序中测量全局时间(挂钟)的最快方法
问题描述
我正在开发一个高性能库,我需要在完成计算时停止线程的时间点,然后将该时间点保存在全局变量中,以便该全局变量始终保存最近的完成时间线。
现在,我正在使用带有时间戳的 C++ std:chrono 库来停止时间,例如:
auto start = std::chrono::high_resolution_clock::now().time_since_epoch();
// thread calculates something
auto finish = std::chrono::high_resolution_clock::now().time_since_epoch();
unsigned time = std::chrono::duration_cast<std::chrono::microseconds>(finish-start).count();
// now I can use the needed time and also update a global variable with the finish time point.
这工作得很好。但...
对 chrono 的调用比对 rdtsc() 的调用慢。
rdtsc 版本:
static __inline__ ticks getticks(void)
{
unsigned a, d;
asm("cpuid");
asm volatile("rdtsc" : "=a" (a), "=d" (d));
return (((ticks)a) | (((ticks)d) << 32));
}
tick = getticks();
sleep(1); // or whatever calculation
tick1 = getticks();
time = (unsigned)((tick1-tick)/2400000/*The CPU speed*/);
比较: 我用 rdtsc 本身测量了 chrono 和 rdtsc 调用,以查看它们需要多少滴答声,结果是:
- chrono 需要大约 34096 个刻度
- rdtsc 需要大约 1744 个刻度
问题:
我不能使用 rdtsc 因为据我所知,它只是相对的。我不能用它来测量时间点,对吧?我不仅想要一些计算的持续时间,还想要实际的完成时间点,以便每个线程都知道最近的完成时间发生的时间。
问题:测量全局时间点并在所有线程之间共享的最快方法是什么?
解决方案
我不能使用 rdtsc ,因为据我所知,它只是相对的。
它与某个未指定的时间点相关,例如 CPU 开机时间。
我不能用它来测量时间点,对吧?
您用于rdtsc
测量CPU 周期的持续时间。您还可以将该值用作自未指定时间以来的时间点。您还可以找出该未指定时间的挂钟时间。
如果您使用gcc
,__builtin_ia32_rdtsc
生成比手动编码版本更好的程序集。
推荐阅读
- java - 如何在 MVC C# 中加快我从 excel 文件到 sql 数据库的导入速度
- python - 如何在 python3 中使用请求进行身份验证以进行进一步解析?
- docker - 将 ngnix 入口控制器公开为 Daemon-set
- powershell - PowerShell 大写字母后的字符不正确
- reactjs - 将组件连接到 Redux 存储时出现问题
- java - 我需要投一些东西吗?
- python - 如何配置 Heroku 以从 GitHub 接收 webhook?
- flutter - 如何测试流是否在 Dart 的特定位置发出值?
- java - 通过改造反序列化我的 JSON 响应后,我得到了空数据
- python-3.x - 添加到python字典,正在清除字典,然后添加