2017-09-24 70 views
6

我有一些編碼方面的經驗,但最令人討厭的問題之一是如何改進我的代碼。如何衡量我的代碼質量?

每次

我檢查複雜可讀性正確性代碼,但我的問題是如何衡量的大小和特定命令的時間。

例如:

時,我有下一個問題:

A是整數

B是整數

C是整數

if - A是bi gger在B分配C=A

else - C=B

對於此問題,我們有2個簡單的解決方案 -

使用if-else語句

2.使用三元運算符

對於編譯前文件大小的幹檢查,我得到第二個解決方案文件比第一個少一半(對於1000000次操作,我得到的是一些MB的差異)。

我的問題是如何衡量的一些代碼,這使得同樣的操作之間,但與不同的命令,多少編譯器可以進行優化,接近像2從示例命令的時間差。

+0

說實話,很難衡量這個低時間框架。我對測試人員的回覆非常感興趣,因爲測量哪一個更好是相當直接的(寫下每次執行後的時間和1000000次操作的平均值),但這不會給你準確的執行時間,而是哪個更快平均。但是,如何準確執行時間對我來說也是一個謎。 –

+1

@安特 - 如果差異太小而無法衡量,爲什麼我們首先關心? –

+1

執行時間!=適合目的 –

回答

3

分析兩種算法的時間複雜度。如果它們看起來有競爭力,則

基準

爲您的問題提供足夠大的輸入,以便時間不受其他-OS-開銷的影響。

開發兩個解決相同問題但程序不同的程序。

我有一些方法在Time measurements時間碼。例如:

#include <sys/time.h> 
#include <time.h> 

typedef struct timeval wallclock_t; 

void wallclock_mark(wallclock_t *const tptr) 
{ 
    gettimeofday(tptr, NULL); 
} 

double wallclock_since(wallclock_t *const tptr) 
{ 
    struct timeval now; 
    gettimeofday(&now, NULL); 

    return difftime(now.tv_sec, tptr->tv_sec) 
      + ((double)now.tv_usec - (double)tptr->tv_usec)/1000000.0; 
} 

int main(void) 
{ 
    wallclock_t t; 
    double s; 

    wallclock_mark(&t); 

    /* 
    * Solve the problem with Algorithm 1 
    */ 

    s = wallclock_since(&t); 
    printf("That took %.9f seconds wall clock time.\n", s); 
    return 0; 
} 

您將得到一個時間測量。然後,例如,使用「算法2」解決問題,並比較這些測量結果。 PS:或者您可以檢查每種方法的彙編代碼,以獲取更低級別的方法。

2

其中一種方法是在bash shell中使用時間函數,然後重複執行很多次。這將顯示哪個更好。並且製作一個不做任何事情的模板,你可以知道緩衝時間。

請在做出任何結論之前對許多情況進行計算並比較平均值。

4

最好也是最直接的方法是檢查編譯器在不同優化級別生成的彙編代碼。

//編輯

我沒有提到的標杆,因爲你的問題是關於檢查使用不同的語言結構做同樣的工作,兩個源代碼之間的差異。

不要誤解我的意思,臺式機是推薦的一種確保一般軟件性能的解決方案,但在這種特殊情況下,由於基本操作的執行時間框架非常短,所以它可能不可靠。 即使您計算來自多次運行的攤銷時間,這種差異可能會對操作系統和環境造成很大的依賴,從而污染您的結果。

要了解更多關於這個問題,我建議this talk from Cppcon,這是有趣的有趣。

但最重要的,通過探索彙編代碼可以給你的信息是否兩條語句引擎蓋下

快速窺視已被優化到完全相同的代碼。從基準代碼中可能不太清楚。

如果你問(如果對比tenary操作符),它應該總是導致相同的機器代碼,因爲tenary操作符只是一個語法糖,因爲if和physical在實際上是相同的操作。

+0

如果您有足夠的經驗優化代碼的速度,並因此獲得了對Agner Fog指令表的良好回憶;有時只需要快速瀏覽彙編輸出以確定更好的代碼......或者在優化開始時沒有區別,您只需使用更簡單的代碼即可。擁有越來越多的經驗越來越難。 – technosaurus