8

我想知道将哪些 C 代码行添加到程序中,以便它告诉我程序运行所需的总时间。我猜应该在 main 开始附近和 main 函数结束后有一个计数器初始化。是正确的标题clock.h

非常感谢...

更新我有一台 Win Xp 机器。它只是clock()在程序的开头添加,而clock()在程序的末尾添加另一个?然后我可以估计时间差。是的,你是对的time.h

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <share.h>
#include <time.h>


void f(long double fb[], long double fA, long double fB);

int main() {

clock_t start, end;
start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A, B;

if (z == NULL) {
    printf("Out of memory\n");
    exit(-1);
}

A = 0.5;
B = 2;


for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
}

z[1] = 5;

f(z, A, B);

for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

end = clock();
printf("Took %ld ticks\n", end-start);
printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);



return 0;  
}  

void f(long double fb[], long double fA, long double fB) {
    fb[0] = fb[1]* fA;
    fb[1] = fb[1] - 1;
    return;
 }  

MVS2008 的一些错误:

testim.c(16):错误 C2143:语法错误:缺少“;” 在“常量”之前  
testim.c(18) :error C2143: 语法错误: 缺少';' 在“类型”之前  
testim.c(20) :error C2143: 语法错误: 缺少';' 在“类型”之前   
testim.c(21) :error C2143: 语法错误: 缺少';' 在“类型”之前    
testim.c(23) :error C2065: 'z' : undeclared identifier   
testim.c(23) :warning C4047: '==' : 'int' 与 'void *' 的间接级别不同  
testim.c(28):错误 C2065:'A':未声明的标识符
testim.c(28) : 警告 C4244: '=' : 从 'double' 转换为 'int',可能丢失数据   

它出现28个错误。请注意,如果没有您的时钟代码,我没有任何错误/警告。

最新消息:很遗憾,我在这里没有得到好的答复。但在谷歌上搜索后,代码是有效的。这里是:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


void f(long double fb[], long double fA);

int main() {

clock_t start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A;

if (z == NULL) {
printf("Out of memory\n");
exit(-1);
}

A = 0.5;


for (i = 0; i < ARRAY_SIZE; i++) {
z[i] = 0;
}

z[1] = 5;

f(z, A);

for (i = 0; i < ARRAY_SIZE; i++)
printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

printf("Took %f seconds\n", ((double)clock()-start)/CLOCKS_PER_SEC);



return 0;
}

void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

干杯

4 月 10 日更新:感谢“JustJeff”,这是一个更好的解决方案

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

void f(long double fb[], long double fA);

const int ARRAY_SIZE = 11;

int main(void)
{

   long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);
   int i;
   long double A;

   LARGE_INTEGER freq;
   LARGE_INTEGER t0, tF, tDiff;
   double elapsedTime;
   double resolution;

   if (z == NULL) {
   printf("Out of memory\n");
   exit(-1);
   }
   QueryPerformanceFrequency(&freq);
   QueryPerformanceCounter(&t0);
   // code to be timed goes HERE
   {
    A = 0.5;


    for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
    }

    z[1] = 5;
    f(z, A);


    for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);

    free(z);
    z = NULL;

   }
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
resolution = 1.0 / (double) freq.QuadPart;
printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
printf("Resolution is %lf nanoseconds\n", resolution*1e9);
printf("Code under test took %lf sec\n", elapsedTime);
return 0;
}


void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

它适用于 MVS2008 和 2003 年的 Borland C++ builderX。

4

6 回答 6

6

在 Unix(我认为)系统上,以time程序名称作为命令行参数的命令将告诉您程序运行所需的时间。请注意,这测量了整个程序的执行时间。如果您只需要测试一个部分,请包含time.h并使用时钟功能,或多或少像这样:

#include <time.h>

int main() {
    clock_t start;
    clock_t end;
    int function_time;
    start = clock();
    function_you_want_to_time();
    end = clock();
    /* Get time in milliseconds */
    function_time = (double)(end - start) / (CLOCKS_PER_SEC / 1000.0);
    return 0;
}

这将为您提供以毫秒为单位的时间(注意/ 1000.0部分)。如果你想要秒,删除/ 1000.0. 如果您想要更准确的简单时钟滴答,请制作function_timeaclock_t并将该function_time = ...行替换为:

function_time = end - start;

为了给整个程序计时,我建议做一个调用函数_main()或其他东西,将所有与程序相关main()的代码从(不是计时代码!)移动到该函数,然后从main(). 这样,更清楚什么是时序代码以及程序的其余部分是什么。

于 2010-04-07T09:47:51.867 回答
3

如果您想测试代码块或 *nix 上的程序,您可以使用clock()函数 (in ) ,正如另一个回答者建议的那样。例如<time.h>time

> time ./foo my args

对于时钟,您需要减去两个检查点之间的差异。例如

#include <time.h>

void f() {
  clock_t start, end;

  start = clock();

  // some long code.

  end = clock();
  printf("Took %ld ticks\n", end-start);
  // or in (fractional) seconds.
  printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);
}

更新

关于您的新错误,您不能在 VC 中混合代码和声明。你不能调用任何函数然后继续声明变量。在顶部声明所有变量,或使用 C++ 模式编译。

于 2010-04-07T09:48:03.463 回答
3

如果您的程序需要总计,那么在 Linux 控制台中:

$ time myProgram

您还可以在代码中使用 time.h。

#include <time.h>

int main(){
  time_t start, end;
  start = time(0);

  /* some working code */

  end = time(0);
  printf("%i seconds", end - start );
}
于 2010-04-07T09:57:43.573 回答
1

您可能需要 time.h 和clock()函数。

于 2010-04-07T09:48:34.807 回答
1

如果您在 Windows 上并且想要在微秒内测量数据,请研究 QueryPerformanceCounter() 和 QueryPerformanceFrequency()。在许多系统上,它们可以解析完整的处理器时钟周期,即纳秒的三分之一,而且我相信我从未见过它比 3.5795MHz 更粗糙,仍远低于 1 微秒。

您调用 QueryPerformanceFrequency() 来确定计数器每秒计数的次数。然后在测试代码之前调用 QueryPerformanceCounter(),然后再调用。将 QPC 的两个读数相加并除以 QPF 的周期,就可以得到两个 QPC 调用之间经过的时间。像这样...

LARGE_INTEGER freq;
LARGE_INTEGER t0, tF, tDiff;
double elapsedTime;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&t0);
// code to be timed goes HERE
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
// elapsedTime now has your measurement, w/resolution given by freq

显然,它们访问了一个硬件计数设备,该设备与主板上的某个系统振荡器相连,在这种情况下,它们不应该受到软件负载的抖动。您获得的分辨率取决于您的系统。

跟进

这是一个演示界面的非常简单的完整程序:

#include <windows.h>
int main(void)
{
    LARGE_INTEGER freq;
    LARGE_INTEGER t0, tF, tDiff;
    double elapsedTime;
    double resolution;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&t0);
    // code to be timed goes HERE
    {
        Sleep(10);
    }
    QueryPerformanceCounter(&tF);
    tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
    elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
    resolution = 1.0 / (double) freq.QuadPart;
    printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
    printf("Resolution is %lf nanoseconds\n", resolution*1e9);
    printf("Code under test took %lf sec\n", elapsedTime);
    return 0;
}

对于像这样简单的事情,跳过 IDE 会更快,只需将其保存在 foo.c 文件中并(假设 MS VS 2008)使用命令行

cl foo.c

建造它。这是我系统上的输出:

Your performance counter ticks 3579545 times per second
Resolution is 279.365115 nanoseconds
Code under test took 0.012519 sec
于 2010-04-07T23:42:28.430 回答
0

您也可以尝试GetTickCount。时钟也可以正常工作。但是,我猜如果其他进程或某个手动更改系统时间,时钟值会发生变化,而 GetTickCount 值不受此影响。

于 2010-04-07T10:17:38.600 回答