我在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:'操作码'中的内联汇编语法错误;找到'数据类型'"
有人可以帮忙吗?
我想为我的C#应用程序提供一个非常高分辨率的计时器.我想访问RDTSC汇编指令.有没有办法做到这一点?
编辑:我正在移植一些C++代码并尝试保留与原始相同的功能.我可能会切换到更多的.NET,但想要评估RDTSC指令,以便我可以将结果与原始结果进行比较.
结果:
矢量时间:7051
阵列时间:18944
我为此使用了MSVC释放模式,编译为32位.
在此测试之前,我正在查看GCC的矢量源代码并且感到惊讶,因为我认为operator[]检查了数组越界,但事实并非如此.但是,我没想到矢量这么快?!
完整代码:
#include <iostream>
#include <vector>
int main(){
const int size = 10000;
unsigned long long my_array[size];
std::vector<unsigned long long> my_vec;
my_vec.resize(size);
//Populate containers
for(int i=0; i<size; i++){
my_vec[i] = i;
my_array[i] = i;
}
//Initialise test variables
unsigned long long sum = 0;
unsigned long long time = 0;
unsigned long long start = 0;
unsigned long long finish = 0;
//Time the vector
start = __rdtsc();
for(int i=0; i<size; i++){
sum += …Run Code Online (Sandbox Code Playgroud)