繁体   English   中英

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

[英]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的整数(它永远不会返回任何有用的东西),那么编译器很有可能会告诉您您正在尝试使用整数作为函数指针。

下一个问题是您没有遵守基准测试的四个规则:

  1. 所有的基准都很糟糕。 那些不烂的人是有偏见的。
  2. 时间不足的基准测试更糟糕。
  3. 工作量太小的基准测试尤其糟糕。
  4. 一次运行的基准测试完全糟糕。

您执行一个函数,虽然众所周知它的性能很差,但由于数组的大小只有 100,000,因此它可能会运行得非常快。 此外,您只执行一次,因此存在额外的偏差效应,例如指令缓存变冷和处理器可能处于低功耗状态。 现代处理器几乎一直处于低功耗状态——除非您先运行一些“预热”代码。

clock的分辨率是微秒(无论实际的计时器分辨率如何),因此即使假设您确实“正确”地进行了测量,结果也可能在个位数范围内。 这没有用,因为它太粗糙了,无法说出一些东西。
如果您比较两辆车的速度,并且您的测量结果返回 5 或 6(取决于四舍五入),您就无法真正了解它们,对吧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM