我在SO上看到这篇文章,其中包含C代码以获取最新的CPU周期数:
基于CPU周期计算的C/C++ Linux x86_64中的分析
有没有办法在C++中使用这个代码(欢迎使用windows和linux解决方案)?虽然用C语言编写(而C是C++的一个子集)但我不太确定这段代码是否适用于C++项目,如果没有,如何翻译呢?
我使用的是x86-64
EDIT2:
找到此功能但无法让VS2010识别汇编程序.我需要包含任何内容吗?(我相信我必须换uint64_t到long long窗户......?)
static inline uint64_t get_cycles()
{
uint64_t t;
__asm volatile ("rdtsc" : "=A"(t));
return t;
}
Run Code Online (Sandbox Code Playgroud)
EDIT3:
从上面的代码我得到错误:
"错误C2400:'操作码'中的内联汇编语法错误;找到'数据类型'"
有人可以帮忙吗?
我从事编程语言分析器工作,正在寻找分辨率优于 100 ns 的 Windows 计时器解决方案。
QueryPerformanceCounter应该是一个答案,但在 Windows 10 上返回的频率为QueryPerformanceFrequency10 MHz,在 Windows 7 上甚至更低
GetSystemTimePreciseAsFileTime有 100 ns 刻度/步
RDTSC分辨率优于1ns,但随频率变化
我的目标分辨率至少为 10 ns。
目前最好的解决方案是什么?
如何QueryPerformanceCounter实施?是否可以轻松拆卸并提高分辨率?
是否可以RDTSC在每次频率变化时直接使用并跟踪/中断?
我正在实现一些数据结构,其中我需要在一段时间后使某些条目无效,因此对于每个条目,我需要维护其插入时间戳。当我得到一个条目时,我需要再次获取时间戳并计算从插入开始的经过时间(如果它太旧,我无法使用它)。
许多线程高度满足此数据结构,因此我必须以最有效的方式获取此时间戳(oninsert和find)。效率在这里非常重要。
如果重要的话,我正在使用 C++ 开发的 linux 机器上工作。检索时间戳的最有效方法是什么?
顺便说一句,在我正在做的一些旧项目中,我记得我看到了一些直接从 CPU 获取时间戳的汇编命令(不记得命令了)。
unsigned int lo = 0;
unsigned int hi = 0;
__asm__ __volatile__ (
"mfence;rdtsc" : "=a"(lo), "=d"(hi) : : "memory"
);
Run Code Online (Sandbox Code Playgroud)
mfence 在上面的代码中,是否有必要?
根据我的测试,找不到cpu重新排序.
测试代码片段包含在下面.
inline uint64_t clock_cycles() {
unsigned int lo = 0;
unsigned int hi = 0;
__asm__ __volatile__ (
"rdtsc" : "=a"(lo), "=d"(hi)
);
return ((uint64_t)hi << 32) | lo;
}
unsigned t1 = clock_cycles();
unsigned t2 = clock_cycles();
assert(t2 > t1);
Run Code Online (Sandbox Code Playgroud)