Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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++ 每次更改QueryPerformanceCounter函数实现/时间都正确_C++_Windows - Fatal编程技术网

C++ 每次更改QueryPerformanceCounter函数实现/时间都正确

C++ 每次更改QueryPerformanceCounter函数实现/时间都正确,c++,windows,C++,Windows,我必须创建一个排序算法函数,它返回用于完成排序的比较数、副本数和微秒数 我已经看到,要使用微秒,我必须使用函数QueryPerformance counter,因为它是精确的(Ps,我知道它在操作系统之间不可移植) 所以我做到了: void Exchange_sort(int vect[], int dim, int &countconf, int &countcopy, double &time) { LARGE_INTEGER a, b, oh, fre

我必须创建一个排序算法函数,它返回用于完成排序的比较数、副本数和微秒数

我已经看到,要使用微秒,我必须使用函数QueryPerformance counter,因为它是精确的(Ps,我知道它在操作系统之间不可移植)

所以我做到了:

void Exchange_sort(int vect[], int dim, int &countconf, int &countcopy, double &time)  
{

    LARGE_INTEGER a, b, oh, freq;

    QueryPerformanceFrequency(&freq); 
    QueryPerformanceCounter(&a);
    QueryPerformanceCounter(&b);
    oh.QuadPart = b.QuadPart - a.QuadPart; //Saves in oh the overhead time (?) accuracy
    QueryPerformanceCounter(&a); 

    int i=0,j=0; // The sorting algorithm starts

    for (i=0 ; i<dim-1 ; i++)
    {   for(j=i+1 ; j<dim; j++ )
        {
            countconf++; // +1 Comparisons
            if (vect[i]>vect[j])
            {
                scambio ( vect[i],vect[j] );  // It is a function that swaps 2 integers
                countcopy=countcopy+3;  // +3 copies
            }
        }
    }

    QueryPerformanceCounter(&b); // Ends timer
    time = (  ( (double)(b.QuadPart - a.QuadPart - oh.QuadPart)  /freq.QuadPart )            
    *1000000 ) ;

}
void Exchange\u排序(int vect[],int dim,int&countconf,int&countcopy,double&time)
{
大整数a,b,oh,freq;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&a);
查询性能计数器(&b);
oh.QuadPart=b.QuadPart-a.QuadPart;//节省了开销时间(?)的准确性
QueryPerformanceCounter(&a);
int i=0,j=0;//排序算法开始

对于(i=0;i首先,性能计数器频率可能没有那么高。它通常是几十万或更多,这会提供微秒或几十微秒的分辨率,但您应该知道,它可能更糟

其次,如果数组大小很小,排序可能会在纳秒或微秒内完成,而使用
QueryPerformanceCounter
无法准确测量

第三,当您的基准进程运行时,Windows可能会在一段(相对)长的时间内(毫秒甚至数百毫秒)占用CPU。这将导致非常不规则且看似不稳定的计时

我有两个建议,你们可以相互独立地寻求:

  • 我建议您研究使用
    RDTSC
    指令(使用内联汇编或编译器内部函数,甚至是现有库),这很可能会以更少的开销提供更好的解决方案。但我必须警告您,它也有自己的问题包

  • 对于这种类型的基准测试,您必须使用完全相同的输入多次(数十次或数百次)运行排序例程然后进行最小的时间测量。你应该采用这种策略的原因是,有一些现象会干扰你的计时并使它变长,但没有什么能使你的排序比纸上更快。因此,你需要多次运行测试,并希望你所有的神您测量的最快时间是没有干扰或噪音的实际运行时间


  • 更新:通过阅读有关问题的评论,您似乎试图使用分辨率不够的计时器对运行时间很短的代码段计时。要么增加输入大小,要么使用RDTSC。

    您问题的简短答案是,不可能准确测量e相同函数的所有调用的相同时间

    由于您的操作系统不是一个完美的实时系统,而是一个多进程同时运行的通用操作系统,并且竞争由内核调度以获得自己的CPU周期,因此您收到不同时间的消息这一事实是意料之中的


    而且,考虑到,每次执行程序或函数时,它的一些指令可能位于RAM中,有些可能在CPU L1或L2高速缓冲存储器中可用,并且可能会从一个执行改变到另一个执行。因此,在评估函数调用的经过时间时,有很多变量要考虑。高精度。

    'Ps我知道它在操作系统之间不可移植,然后为正确的一个plase添加一个标记!!这里也没有必要为糟糕的编码感到羞耻,重点是提出正确的问题并提供必要的信息来解决它们。你介意给出一些“不同的时间”吗你正在经历的是什么?你期望得到什么样的结果?当然,你也知道你的输入是什么?(总是一样的,每次调用都随机进行,知道元素的数量,等等)10个元素,已排序整数数组,最后3次:0.76991-1.15487-1。53982@SuperN那么,你在抱怨你的测量值变化了一微秒?