在c ++中计算函数的执行时间

时间:2017-09-28 07:01:37

标签: c++

我想通过将其放入另一个可以计算经过时间的函数来计算排序函数(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'?

2 个答案:

答案 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;
}

Try it online

答案 1 :(得分:0)

有几个错误,一些错误,一些不那么严重。另外,在我写这篇文章时,代码完全改变了。

主要原因,首先,它为什么不起作用是你执行bubble()无条件地返回零整数(没有充分理由)。然后将该整数传递给计时函数并执行&#34;执行&#34;整数。
换句话说,你告诉编译器要做的是&#34;什么都不做&#34;在定时循环内(空语句)。显然,这并不能衡量很多。

你可能意味着传递函数指针而不是函数的返回值。 最近的编辑(完全改变了问题,顺便说一下)表明这正是你的意图
如果你没有在函数上返回一个整数void(它永远不会返回任何有用的东西),那么编译器很可能会告诉你你是试图使用整数作为函数指针。

接下来的问题是你没有遵守四项基准规则:

  1. 所有基准测试都很糟糕。那些不吸吮的人有偏见。
  2. 时间不够的基准吸引更多。
  3. 工作量太小的基准测试特别糟糕。
  4. 一次运行的基准测试非常糟糕。
  5. 你执行一个函数虽然众所周知是一个表现不佳的函数,但由于数组的大小只有100,000,所以它的运行速度很快。此外,您只执行一次,因此存在额外的偏置效应,例如指令缓存冷,处理器可能处于低功耗状态。现代处理器几乎一直处于低功耗状态 - 除非你运行一些&#34;预热&#34;代码优先。

    clock的分辨率为微秒(无论实际的定时器分辨率如何),因此即使您正确地测量&#34;正确&#34;,结果也可能在单个数字范围内。这没用,因为它太粗糙了,无法说出什么 如果你比较两辆车的速度,你的测量结果返回5或6(取决于四舍五入),你真的不能说出它们,你可以吗。

相关问题