我在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:'操作码'中的内联汇编语法错误;找到'数据类型'"
有人可以帮忙吗?
更新:似乎这是MSVC的一个错误,但它也发生在ICC版本14,最高优化(/ o3)打开.
UPDATE2:随着ICC关闭优化,我得到了:
我使用下面的代码比较std :: array vs raw array vs std :: vector的性能.我已经在Win 7 64上使用MSVC 2012编译器和英特尔编译器vs 14进行了测试,并进行了64位编译.CPU是Intel第3代.
结果是(一致地):
当我检查组件时,编译器为std::array原始阵列选择XMM寄存器,因此可能正在进行某种SIMD处理?但是,对于std::vector常规的r8-r15寄存器是使用的.
假设我对上述内容是正确的,为什么XMM寄存器不能用于std :: vector?
这是完全工作的测试代码(您需要增加默认的堆栈保留大小):
#include <iostream>
#include <vector>
#include <array>
const unsigned int noElements = 10000000;
const unsigned int noIterations = 500;
void testVector(){
volatile unsigned long long sum = 0;
unsigned long long start = 0;
unsigned long long finish = 0;
unsigned …Run Code Online (Sandbox Code Playgroud)