2016-12-24 50 views
-2

這兩個程序哪個運行速度更快?第一個是指向兩個函數的指針數組,這兩個函數重新分配一個變量,第二個是兩個用相同方式重新分配變量的情況的開關。使用開關或定義一組函數 - 哪個更快?

1:

#include <iostream> 

void w (int &z); 
void y (int &z); 

int main(int argc, const char * argv[]) { 
    void (*p[2]) (int &a) = {w,y}; 
    int s = 0; 
    for(int i=0;i<1000;i++) { 
     p[s](s); 
    } 
    return 0; 
} 

void w (int &z) { 
    z = 1; 
} 

void y (int &z) { 
    z = 0; 
} 

2:

#include <iostream> 

int main(int argc, const char * argv[]) { 
    int s = 0; 
    for(int i=0;i<1000;i++) { 
     switch (s) { 
      case 0: 
       s = 1; 
       break; 
      case 1: 
       s = 0; 
       break; 
     } 
    } 
    return 0; 
} 

在一般情況下,做程序運行速度更快,如果你使用指針數組的功能,而不是定義switch語句的,如果你知道在編譯什麼時候根據變量的當前值執行哪些指令?或者switch語句更快?或者它們都一樣快?

+7

您是否已經測量過自己(優化級別)? –

+1

第一個例子使我的皮膚爬行... – DeiDei

+0

你展示的兩個程序並不是真的相同,它們不是嚴格相似的。 –

回答

1

我認爲switch語句會更快,因爲函數指針具有的功能的擡頭函數調用的開銷。開關只是一個跳轉表。

1

switch聲明會更快,很多的赫克更容易理解。至少,在這種情況下。可能在大多數情況下。

在這種情況下,它會更快,因爲編譯器可以完全放棄整個循環。很顯然,所有代碼只對局部變量有影響,所以可以在不改變程序的可觀察行爲的情況下將其消除。

這凸顯爲什麼switch聲明一般會更快。如果有很多情況,它將通過一個跳轉表來實現,編譯器擁有所有的信息,並且可以做各種技巧來刪除代碼或者出於速度原因移動它。

隨着函數指針版本,編譯器必須足夠聰明,意識到你初始化函數指針數組,然後從未改變它或地址傳給任何如此別的可以改變它。然後,它還必須查看所有被調用的函數,並意識到它們對除了參考文件被傳入之外的任何內容都沒有影響。這是lot要問。

更糟的是,函數指針版本對於人類來說是非常難以理解的。如果你不關心這個問題,你爲什麼不用匯編語言編寫它,或者(甚至更好)在原始處理器操作碼中編寫它?

相關問題