[英]Calculating execution time of function in c++
我想通过将它放入另一个可以计算经过时间的函数来计算排序函数(bubblesort)的执行时间。
#include <ctime>
#include <cstdlib>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define A_SIZE 100000
void executeTime(int func);
int bubble(int A[], int l, int r);
int main()
{
int A[A_SIZE], i;
int l = 0, r = A_SIZE - 1;
srand((unsigned int)time(0));
for (int i = 0; i < A_SIZE; i++)
{
A[i] = rand();
}
executeTime(bubble(A, l, r));
}
void executeTime(int func) {
int start_s = clock();
func;
int stop_s = clock();
cout << "time: " << (stop_s - start_s) / double(CLOCKS_PER_SEC) * 1000 << endl;
}
int bubble(int A[], int l, int r)
{
int i, j, min;
for (i = l; l < r - 1; l++)
{
min = A[i];
for (j = l + 1; j < r; j++)
{
if (A[j] < min)
{
min = A[j];
A[j] = A[i];
A[i] = min;
}
}
}
return 0;
}
但是如果我在主块中编写所有代码,而不是创建计算时间和排序数组的离散函数,它会按我的预期工作。 这里有什么问题? 为什么我在屏幕上显示“时间:0”??
您必须将函数传递给executeTime
而不是函数的结果。 您的错误是您执行冒泡排序并将返回值传递给executeTime
。 您必须在executeTime
内调用该函数。 有不同的方法可以实现这一点。 您可以使用函数指针或std::function<int(int*, int, int)>
(C++11)。
#include <ctime>
#include <cstdlib>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define A_SIZE 100000
typedef int FUNCTION_POINTER(int*, int, int);
void executeTime(FUNCTION_POINTER func, int* A, int i, int j);
int bubble(int A[], int l, int r);
int main()
{
int A[A_SIZE], i;
int l = 0, r = A_SIZE - 1;
srand((unsigned int)time(0));
for (int i = 0; i < A_SIZE; i++)
{
A[i] = rand();
}
executeTime(&bubble, A, l, r);
}
void executeTime(FUNCTION_POINTER func, int* A, int i, int j) {
int start_s = clock();
func(A, i, j);
int stop_s = clock();
cout << "time: " << (stop_s - start_s) / double(CLOCKS_PER_SEC) * 1000 << endl;
}
int bubble(int A[], int l, int r)
{
int i, j, min;
for (i = l; l < r - 1; l++)
{
min = A[i];
for (j = l + 1; j < r; j++)
{
if (A[j] < min)
{
min = A[j];
A[j] = A[i];
A[i] = min;
}
}
}
return 0;
}
有几个错误,有的比较严重,有的不太严重。 另外,在我写这篇文章时,代码完全改变了。
首先,为什么它不起作用的主要原因是您执行了bubble()
,它无条件地返回了一个零整数(没有充分的理由)。 然后将该整数传递给计时函数并“执行”该整数。
换句话说,你告诉编译器做的是在计时循环内“什么都不做”(空语句)。 显然,这并不重要。
您可能打算传递函数指针而不是函数的返回值。 最近的编辑(完全改变了问题,顺便说一句)表明这正是您的意图。
如果您没有在函数上返回一个也可能为void
的整数(它永远不会返回任何有用的东西),那么编译器很有可能会告诉您您正在尝试使用整数作为函数指针。
下一个问题是您没有遵守基准测试的四个规则:
您执行一个函数,虽然众所周知它的性能很差,但由于数组的大小只有 100,000,因此它可能会运行得非常快。 此外,您只执行一次,因此存在额外的偏差效应,例如指令缓存变冷和处理器可能处于低功耗状态。 现代处理器几乎一直处于低功耗状态——除非您先运行一些“预热”代码。
clock
的分辨率是微秒(无论实际的计时器分辨率如何),因此即使假设您确实“正确”地进行了测量,结果也可能在个位数范围内。 这没有用,因为它太粗糙了,无法说出一些东西。
如果您比较两辆车的速度,并且您的测量结果返回 5 或 6(取决于四舍五入),您就无法真正了解它们,对吧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.