Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内在的滴答计数,一个精细的性能度量,无需外部api_C++_C_Performance Testing - Fatal编程技术网

C++ 内在的滴答计数,一个精细的性能度量,无需外部api

C++ 内在的滴答计数,一个精细的性能度量,无需外部api,c++,c,performance-testing,C++,C,Performance Testing,采取最少的步骤来质疑给定代码的性能(快速的),不是吗 那是最小的单位,最精细的度量 #pragma intrinsic(__rdtsc) int main(void) { ULONGLONG t1,t2; t1= __rdtsc(); work(); t2= __rdtsc(); std::cout<<t2-t1<<std::endl; } #pragma内在(u rdtsc) 内部主(空) { 龙龙t1,t2; t1=uu

采取最少的步骤来质疑给定代码的性能(快速的),不是吗 那是最小的单位,最精细的度量

#pragma intrinsic(__rdtsc)

int main(void)
{
    ULONGLONG t1,t2;

    t1= __rdtsc();
    work();
    t2= __rdtsc();
    std::cout<<t2-t1<<std::endl;
}
#pragma内在(u rdtsc)
内部主(空)
{
龙龙t1,t2;
t1=uu rdtsc();
工作();
t2=uu rdtsc();

std::cout它取决于您想要测量的内容。它不一定提供任何有关经过时间的信息。这取决于具体的x86实现。它提供经过的“滴答声”数量,以及“滴答声”的不同定义。它可能是或多或少恒定的最大时钟频率或实际使用的频率

<> >为了使RDTSC < /Cord>可用于小核心片段的性能测量,还必须确保OS不抢占线程,或将其移动到另一个核心,可能具有不同的TSC值。使用CPU绑定和CPU屏蔽来实现性能测量线程。温暖的性能测试。根据您的用例,在两者之间进行明智的选择

几年前,我在一个团队中工作过,我们就是这样使用它的,它确实给了我们很好的、相当稳定的和可重复的结果,因为我们还处理了所有其他问题:CPU绑定和CPU屏蔽的热测试。

手册页,位于:提供了所有细节

您想调用
clock\u gettime()
函数

要获得流程所需的时间,请使用:

 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec * );
或对于当前线程使用:

 clock_gettime(CLOCK_THREAD_CPUTIME_ID, struct timespec * );   
返回0表示成功,返回-1表示失败(在这种情况下,errno设置正确)

结构timespec定义为:

struct timespec 
{
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};

以上所有内容都在头文件中定义:
time.h

rdtsc
是x86专用的,可能会被困在操作系统中,没有序列化,没有很好地指定(一些cpu的计数以周期为单位,另一些以恒定增量为单位,由于时钟速度可变,这可能不同)。不,这不能给你一个精确的度量。它给出了重置后的时钟周期。由于有许多进程在运行,因此它不能度量一个进程的性能。它毫无用处,但你仍然需要调用一个oracle来告诉你一个勾号的含义。它的长度在机器之间是不同的。@EOF in x86
rdtsc
不会被困在操作系统中。我不知道是否存在其他平台上的仿真,这会,但不会在x86上。这只是一种生成一条明确定义的汇编指令的方法:
rdtsc
@cdonat它是否会被困取决于cr4.tsd;例如,当我研究“屏蔽CPU”时我allready发明了一个想法,如果可以使用8核CPU,并将4个专用于用户,除非您专门将4个滑动的CPU分配给您的特定程序,它们处于休眠状态且从未中断,我不知道RTOS,这是UNIX的强大功能之一。我想应该有一台专门用于tes的pcting,8个内核,比如说windows操作系统指定用于测试操作系统是否知道这些条件在linux或windows上,这是一个问题吗?我使用windows 7&vs 2010原生c++我在AMD x86-64 CPU上运行带有gcc的ubuntu linux 14.04,有10个内核。我没有使用
clock\u gettime()
在windows操作系统上,所以它可能有不同的名称;但是,它仍然是C语言,所以我希望它是相同的名称不是英特尔,不是windows,我的一个最好的朋友和你一样……但说到问题的关键……这应该进一步检查(;