0

我可能错过了 getrusage() 函数的一些重要点。

当我运行以下代码时,我得到:

用户时间:0.000000 s 系统时间:0.000000 s 总时间:0.000000 s

void naiveSearch(unsigned char *text, unsigned int textLen, unsigned char *pattern, unsigned int pattLen) 
{
  register unsigned int count = 0;
  for(int i=0;i<=textLen-pattLen;i++)
  {
    int j;
    for(j=0;j<pattLen;j++)
      if((unsigned char)text[i+j] != (unsigned char)pattern[j])
        break;

    if(j == pattLen)
       count++;
  }
  //printf("naiveSearch: count = %d\n",count);
}

int main(int argc, char * argv[])
{
  struct rusage ruse;
  double ssec1, ssec2, usec1, usec2;

  getrusage(RUSAGE_SELF,&ruse);
  ssec1 = (double)(ruse.ru_stime.tv_sec * 1000000 + ruse.ru_stime.tv_usec);
  usec1 = (double)(ruse.ru_utime.tv_sec * 1000000 + ruse.ru_utime.tv_usec);

  for(int k=0;k<1000;k++)
    naiveSearch(writeBuffer,outSize,writeBuffer+rand,16);

  getrusage(RUSAGE_SELF,&ruse);
  ssec2 = (double)(ruse.ru_stime.tv_sec * 1000000 + ruse.ru_stime.tv_usec);
  usec2 = (double)(ruse.ru_utime.tv_sec * 1000000 + ruse.ru_utime.tv_usec);

  printf("User time:\t%f s\n",(usec2 - usec1)/(double)1000000);
  printf("System time:\t%f s\n",(ssec2 - ssec1)/(double)1000000);
  printf("Total time:\t%f s\n",((usec2 + ssec2) - (usec1 + ssec1))/(double)1000000);

  return 0;
}

但是,当我在未注释 printf() 函数(naiveSearch 内部)的情况下运行相同的代码时,我得到了一些预期/现实的时间。为什么在第一种情况下测量零时间?如何可靠地测量时间?

谢谢你的任何想法。P。

更新:必须有一些安全可靠的方法来测试循环中的算法。我需要包括所有标准编译器优化,并且仍然对同一算法进行所有迭代。有什么办法吗?如何确定时间结果代表所有执行的迭代来测试时间性能?

4

1 回答 1

0

我认为您的程序没有使用足够的 CPU 来让计时器显示任何内容。可能时钟滴答对您的 naiveSearch 函数来说不够敏感,无法生成任何内容。此外,没有理由将时间转换为双打。尝试做这样的事情:

#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>

int runalot()
{
    int i = 0;
    int j = 1;

    for (i = 0; i < 100000000; i++) {
        if (i % j == 4) {
            j += 1;
        }
    }
    return j;
}

int main(int argc, char * argv[])
{
    int j;
    struct rusage ruse1, ruse2;
    double ssec1, ssec2, usec1, usec2;

    getrusage(RUSAGE_SELF,&ruse1);
    j = runalot();
    printf("runalot returns %d\n", j);
    getrusage(RUSAGE_SELF,&ruse2);
    printf("CPU usage is: %lu\n", ruse2.ru_utime.tv_sec * 1000000 + ruse2.ru_utime.tv_usec - ruse1.ru_utime.tv_sec * 1000000 + ruse1.ru_utime.tv_usec);
}

当我在带有 -g 调试标志的 Linux 上使用 gcc 编译它并运行它时,我得到CPU usage is: 372000.

于 2017-02-28T00:52:29.650 回答