2017-09-28 41 views
-2

我想通過將排序函數(bubblesort)的執行時間放入另一個可以計算已用時間的函數來計算它的執行時間。但它一直顯示我的時間:0,因爲我運行它...在C++中計算函數的執行時間

#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; 
} 

但是,如果我寫的,而不是創建其計算時間和排序陣列離散函數在主塊中的所有代碼,它可以作爲我打算就好了。 這裏有什麼問題?爲什麼我在屏幕上獲得'time:0'?

+2

花幾個星期閱讀一本好的C++編程書,然後看看一些[C++參考](http://en.cppreference.com/w/cpp)。你有一個很大的誤解,**我們不能在這裏教你C++。** –

+2

'func;'不是一個函數調用(而且'int func'不會傳遞一個函數作爲參數,它只是一個值 - 在這種情況下,'bubble'的結果) – UnholySheep

+0

'executeTime(bubble(A,l,r));'相當於'int temp = bubble(A,l,r); executeTime(temp);'因此不是你認爲的 –

回答

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

+0

謝謝!我忘了如何使用函數指針,但我現在知道! –

0

有幾個失誤,多了一些,有的不太嚴重。另外,當我寫這個時,代碼完全改變了。

主要的原因,首先,爲什麼它不起作用,是你執行bubble(),它無條件地返回一個零整數(沒有很好的理由)。然後你將該整數傳遞給定時函數並「執行」整數。
換句話說,你告訴編譯器要做的是在定時循環(空語句)內部「什麼都不做」。顯然,這並不是很重要。

您可能意思是傳遞函數指針而不是函數的返回值。 最近的編輯(這完全改變了問題,順便說一句)表明,這正是你的意圖
如果你沒有返回一個函數的整數,也可能是void(它永遠不會返回任何有用的東西),那麼編譯器很可能會告訴你,你正在嘗試使用一個整數作爲函數指針。

接下來的問題是,你沒有兌現基準的四個規則:

  1. 所有的基準吸。那些不吸吮的人是有偏見的。
  2. 時間不足的基準吮吸更多。
  3. 特別是工作量太小的基準。
  4. 一次運行的基準測試完全吸引。

您執行一個函數,雖然衆所周知是一個糟糕的執行者,但它可能運行得非常快,因爲數組的大小隻有100,000。另外,你只執行一次,所以還有額外的偏置效果,例如指令緩存很冷,處理器可能處於低功耗狀態。現代處理器幾乎一直處於低功耗狀態 - 除非您先運行一些「預熱」代碼。

clock的分辨率是微秒(不管實際的計時器分辨率),所以即使假定您測量「正確」,結果可能會在單個數字範圍內的某個位置。這沒有用,因爲它太粗糙而無法告訴某些事情。
如果您比較兩輛汽車的速度,並且您的測量結果返回5或6(取決於四捨五入),那麼您是否可以真正講述它們。