Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
如何在windows或linux中查找C函数的运行时间_C_Performance_Timer_Elapsedtime - Fatal编程技术网

如何在windows或linux中查找C函数的运行时间

如何在windows或linux中查找C函数的运行时间,c,performance,timer,elapsedtime,C,Performance,Timer,Elapsedtime,我正在执行一个函数我的任务。我想计算CPU执行该函数所需的时间(或时钟周期),因为我将对该函数进行性能改进。所以我参考并编写了下面的代码 typedef struct timer { LARGE_INTEGER t1; LARGE_INTEGER t2; LARGE_INTEGER frequency; }MY_TIMER_S; int start_timer(MY_TIMER_S *a) { QueryPerformanceFrequency(&a-&

我正在执行一个函数
我的任务
。我想计算CPU执行该函数所需的时间(或时钟周期),因为我将对该函数进行性能改进。所以我参考并编写了下面的代码

typedef struct timer
{
    LARGE_INTEGER t1;
    LARGE_INTEGER t2;
    LARGE_INTEGER frequency;
}MY_TIMER_S;

int start_timer(MY_TIMER_S *a)
{
    QueryPerformanceFrequency(&a->frequency);
    QueryPerformanceCounter(&a->t1);
}

int stop_timer(MY_TIMER_S *a)
{
    double elsapsedtime;
    QueryPerformanceCounter(&a->t2);
    elapsedtime = (a->t2.QuadPart - a->t1.QuadPart) * 1000.0 / a->frequency.QuadPart;
    printf("Elapsed time is %lf ms\n", elapsedtime);
}

void main()
{
    MY_TIMER_S a = {0};
    int i = 0;

    for (i = 0; i < 3; i++)
    {
        start_timer(&a);
        my_task();
        stop_timer(&a); 
    }
}
这三个值精确到纳秒,但不精确。我这样想是因为在我的系统中并行运行的其他应用程序发生了进程切换。我检查了任务管理器,它显示124个进程正在运行。所以我重新启动了我的系统(现在是任务管理器中的84进程),然后输出是

Elapsed time is 0.083162 ms
Elapsed time is 0.113223 ms
Elapsed time is 0.074258 ms
之后,我用
start/high
执行exe,然后我也没有得到精度值

我的问题是如何在windows或linux中更精确地计算函数的运行时间

环境:i5处理器上的32位Windows7,使用VisualStudio2005C编译器的4Gb ram

for (i = 0; i < 3; i++)
{
    start_timer(&a);
    my_task();
    stop_timer(&a); 
}
(i=0;i<3;i++)的

{
启动计时器(&a);
我的任务();
停止计时器(&a);
}

(i=0;i<3;i++)的

{
启动计时器(&a);
对于(j=0;j<30000;j++)
{        
我的任务();
}
停止计时器(&a);
}

最基本的答案是多次运行您的任务(比如100000次),这样开销就减少到整个运行时的一小部分。unwind和msam是正确的。更重要的是,忘记精确性。如果你对它所做的任何加速都需要2位数以上的精度才能看到,你甚至可以不用麻烦了。
for (i = 0; i < 3; i++)
{
    start_timer(&a);
    my_task();
    stop_timer(&a); 
}
for (i = 0; i < 3; i++)
{
  start_timer(&a);
  for (j = 0; j < 30000; j++)
  {        
    my_task();        
  }
  stop_timer(&a); 
}