printf如何影响getrusage在C中测量时间
How does printf influence getrusage measure time in C
我可能错过了 getrusage() 函数的一些重要点。
当我运行以下代码时,我得到:
用户时间:0.000000 秒
系统时间:0.000000 s
总时间:0.000000 秒
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 内部)的相同代码时,我得到了一些 expected/realistic 时间。为什么在第一种情况下测量零时间?我怎样才能可靠地测量时间?
谢谢你的想法。 P.
更新:必须有一些安全可靠的方法来测试循环中的算法。我需要包括所有标准编译器优化,并且仍然执行相同算法的所有迭代。有什么办法吗?如何测试时间性能并确保时间结果代表执行的所有迭代?
我认为您的程序没有使用足够的 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);
}
当我在 Linux 上使用带有 -g 调试标志的 gcc 和 运行 编译它时,我得到 CPU usage is: 372000
.
我可能错过了 getrusage() 函数的一些重要点。
当我运行以下代码时,我得到:
用户时间:0.000000 秒 系统时间:0.000000 s 总时间:0.000000 秒
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 内部)的相同代码时,我得到了一些 expected/realistic 时间。为什么在第一种情况下测量零时间?我怎样才能可靠地测量时间?
谢谢你的想法。 P.
更新:必须有一些安全可靠的方法来测试循环中的算法。我需要包括所有标准编译器优化,并且仍然执行相同算法的所有迭代。有什么办法吗?如何测试时间性能并确保时间结果代表执行的所有迭代?
我认为您的程序没有使用足够的 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);
}
当我在 Linux 上使用带有 -g 调试标志的 gcc 和 运行 编译它时,我得到 CPU usage is: 372000
.