C程序中特定函数计算的计算时间

时间:2012-10-09 01:29:14

标签: c timer clock

我有一个代码,其中我想计算两个排序算法合并排序和快速排序所需的时间,以微秒或更精确地排序N个数字。 这样计算的两次然后我们输出到终端。 代码(代码的一部分):

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n");
printlist(arr,n);
mergesort(extarr,0,n-1);
printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n");
printlist(extarr,n);
quicksort(arr,0,n-1);
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n");
printlist(arr,n);

通过提供它将如何完成来帮助我。我已经通过将两个变量作为开始停止并将它们分别保持在函数调用的上方和下方来尝试clock_t,但这根本没有帮助并始终将其差异打印为零。 请建议一些其他方法或功能,记住在任何类型的操作系统中运行都没有问题。 感谢您提前提供任何帮助。

5 个答案:

答案 0 :(得分:2)

方法:1

计算程序所用的总时间您可以使用linux实用程序“time”。

    Lets your program name is test.cpp.
    $g++ -o test test.cpp
    $time ./test

    Output will be like :
    real    0m11.418s
    user    0m0.004s
    sys 0m0.004s

方法:2

您还可以使用linux profiling方法“gprof”通过不同的函数查找时间。

首先,您必须使用“-pg”标志编译程序。

    $g++ -pg -o test test.cpp
    $./test
    $gprof test gmon.out

PS:gmon.out是由gprof

创建的默认文件

答案 1 :(得分:1)

您可以在Linux中调用gettimeofday函数,在Windows中调用timeGetTime。在调用排序函数之前调用这些函数,并在调用排序函数之后调用它们。

请查看手册页以获取更多详细信息。如果您仍然无法获得某些有形数据(由于较小的数据集所花费的时间可能太小),最好尝试一起测量“n”次迭代的时间,然后推断出单次运行的时间或者增加要排序的数据集的大小。

答案 2 :(得分:1)

不确定您是否尝试过以下操作。我知道您的原帖说您已尝试使用CLOCKS_PER_SEC。使用CLOCKS_PER_SEC并执行(stop-start)/CLOCKS_PER_SEC将获得秒数。双精度将提供更高的精度。

#include <time.h>

main()
{
clock_t launch = clock();
//do work
clock_t done = clock();
double diff = (done - launch) / CLOCKS_PER_SEC;
}

答案 3 :(得分:1)

获得Zero作为结果的原因可能是您正在使用的时间源的分辨率很差。这些时间源通常会增加大约10到20毫秒。这很差,但这就是他们的工作方式。当您的排序时间少于此时间增量时,结果将为zero。您可以通过增加系统中断频率将此结果增加到1 ms范围。对于Windows and Linux,没有标准的方法来实现这一点。他们有自己的方式。 通过高频计数器可以获得更高的分辨率。 Windows和Linux确实提供了对这些计数器的访问,但同样,代码可能看起来略有不同。

如果你值得one piece of codewindows and linux上运行,我建议您循环执行时间测量。运行代码以在循环中测量数百甚至更多次 并捕获循环外的时间。将捕获的时间除以循环周期的数量并得到结果。

当然:这仅供评估。您不希望在最终代码中拥有它。 并且考虑到时间分辨率在1到20毫秒之内,您应该选择合适的分辨率测量时间。 (提示:调整循环次数使其至少持续一秒左右。)

示例:

clock_t start, end;

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n");
printlist(arr,n);

start = clock();
for(int i = 0; i < 100; i++){ 
  mergesort(extarr,0,n-1);
}
end   = clock();
double diff = (end - start) / CLOCKS_PER_SEC;

// and so on...

printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n");
printlist(extarr,n);
quicksort(arr,0,n-1);
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n");
printlist(arr,n);

答案 4 :(得分:0)

如果您使用的是Linux 2.6.26或更高版本,那么getrusage(2)是最准确的方法:

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

// since Linux 2.6.26
// The macro is not defined in all headers, but supported if your Linux version matches
#ifndef RUSAGE_THREAD
#define RUSAGE_THREAD 1
#endif
// If you are single-threaded then RUSAGE_SELF is POSIX compliant 
// http://linux.die.net/man/2/getrusage

struct rusage rusage_start, rusage_stop;

getrusage(RUSAGE_THREAD, &rusage_start);

...

getrusage(RUSAGE_THREAD, &rusage_stop);

// amount of microseconds spent in user space
size_t user_time = ((rusage_stop.ru_utime.tv_sec - rusage_start.ru_stime.tv_sec) * 1000000) + rusage_stop.ru_utime.tv_usec - rusage_start.ru_stime.tv_usec;
// amount of microseconds spent in kernel space
size_t system_time = ((rusage_stop.ru_stime.tv_sec - rusage_start.ru_stime.tv_sec) * 1000000) + rusage_stop.ru_stime.tv_usec - rusage_start.ru_stime.tv_usec;