【发布时间】:2013-07-15 17:11:03
【问题描述】:
我想检查我的函数在 3 秒内可以运行多少次。我写了那个代码:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
// Handle error
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
int main(int argc, char **argv)
{
long iterations = 0;
double seconds = 3.0;
double wall0 = get_wall_time(), now;
do
{
fun(a,b,c);
now = get_wall_time();
iterations++;
}while(now < wall0+seconds);
printf("%lu\n", iterations);
return 0;
}
但是有些事情告诉我它根本不行...我将结果与我老师的一个可执行文件进行了比较,结果发现他的程序在相同的 3 秒时间间隔内比我的程序执行了更多的迭代(fun 已定义同理,老师给了我它的出处,我这里只用)。
编辑:
编辑 while 循环但结果仍然相同:
do
{
fun(a,b,c);
iterations++;
}while(get_wall_time() < wall0+seconds);
编辑:
像这样? :
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
/* 3 seconds */
volatile int seconds = 3;
void handle(int sig) {
--seconds;
alarm(1);
}
int main()
{
signal(SIGALRM, handle);
alarm(1);
while(seconds)
{
fun(a,b,c);
iterations++;
}
printf("%lu\n", iterations);
return 0;
}
【问题讨论】:
-
您的代码不仅仅是衡量您的函数在 3 秒内被调用的次数。您正在测量可以调用函数和 get_wall_time 的次数。
-
@hatchet:好的,将我的
while更改为}while(get_wall_time() < wall0+seconds);但仍然......结果不正常(与我更改之前几乎相同) -
这仍然会为您的函数的每次执行调用 get_wall_time。
-
我不确切知道您的应用程序的要求是什么,但执行此类操作的一种方法是简单地调用该函数固定次数(例如 1000 次),然后检查时间只是两次——一次在循环之前,一次在循环之后。然后你可以计算每个函数调用的时间,并据此推断你可以在 3 秒内调用它多少次。
-
如果您想避免(大部分)在每次迭代中获取时间的开销(并且您在 *nix 中),请查看
alarm。它会告诉操作系统在时间到时向您发送信号,因此您可以让信号处理程序设置一个(易失性)标志并检查每次迭代。 volatile 读取会增加一点开销,但没有它,您可能会永远运行(取决于优化器的作用)。
标签: c benchmarking