我想通过将其放入另一个可以计算经过时间的函数来计算排序函数(bubblesort)的执行时间。 但它一直给我看时间:0,因为我运行它...
#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'?
答案 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;
}
答案 1 :(得分:0)
有几个错误,一些错误,一些不那么严重。另外,在我写这篇文章时,代码完全改变了。
主要原因,首先,它为什么不起作用是你执行bubble()
无条件地返回零整数(没有充分理由)。然后将该整数传递给计时函数并执行&#34;执行&#34;整数。
换句话说,你告诉编译器要做的是&#34;什么都不做&#34;在定时循环内(空语句)。显然,这并不能衡量很多。
你可能意味着传递函数指针而不是函数的返回值。 最近的编辑(完全改变了问题,顺便说一下)表明这正是你的意图。
如果你没有在函数上返回一个整数void
(它永远不会返回任何有用的东西),那么编译器很可能会告诉你你是试图使用整数作为函数指针。
接下来的问题是你没有遵守四项基准规则:
你执行一个函数虽然众所周知是一个表现不佳的函数,但由于数组的大小只有100,000,所以它的运行速度很快。此外,您只执行一次,因此存在额外的偏置效应,例如指令缓存冷,处理器可能处于低功耗状态。现代处理器几乎一直处于低功耗状态 - 除非你运行一些&#34;预热&#34;代码优先。
clock
的分辨率为微秒(无论实际的定时器分辨率如何),因此即使您正确地测量&#34;正确&#34;,结果也可能在单个数字范围内。这没用,因为它太粗糙了,无法说出什么
如果你比较两辆车的速度,你的测量结果返回5或6(取决于四舍五入),你真的不能说出它们,你可以吗。