2016-11-14 47 views
-2

要優化具有相同模式的函數,我正在考慮兩種實現方式。 可能使用的此功能的環境位於嵌入式軟件的中斷內部。這就是爲什麼我要面對困難,因爲需要考慮速度容量。 在我看來,以下案例1和2具有相同的速度功能。但是,我的同事說可能會有差異,因爲第一種情況需要使用指針訪問,但第二種情況不需要。 哪一個更快? 我需要你的幫助,以高速實現高效的代碼。使用結構體和變量作爲函數的輸入參數之間的速度差異

typedef struct 
{ 
    unsigned char member1; 
    unsigned char member2; 
    .. 
    unsigned char member10; 
} my_struct 

my_struct input[10]; 

void My_ISR1(void) 
{ 
    ... 
    sub_func1(input[1]); 
    return 0; 
} 
void My_ISR2(void) 
{ 
    ... 
    sub_func1(input[2]); 
    return 0; 
} 
void sub_func1(my_struct my_struct_input) 
{ 
    if(my_struct_input.member1 < my_struct_input.member2) 
    { 
    ... 
    } 
    ... 
    return 0; 
} 

CASE2)

unsigned char member1of1; 
unsigned char member2of1; 
... 
unsigned char member10of10; 

void My_ISR1(void) 
{ 
    ... 
    sub_func1(member1of1, ..., member10of1); 

    return 0; 
} 

void My_ISR2(void) 
{ 
    ... 
    sub_func1(member1of2, ..., member10of2); 

    return 0; 
} 

void sub_func1(unsigned char member1, 
       unsigned char member2, ..., 
       unsigned char member 10) 
{ 
    if(member1 < member2) 
    { 
    ... 
    } 
    ... 
    return 0; 
} 
+5

要確定一個實現是否比另一個實現更快,對於編譯器和您的問題空間,在您的代碼中,在您的硬件上,針對您的特定用例,唯一的方法就是測量它。 – mjs

+2

您沒有傳遞指向結構的指針,這兩個片段都將相同數量的數據複製到堆棧。你應該通過引用傳遞結構(即使用指針),而不是每次都複製它(就像你現在正在做的那樣),這可能會更高效(可能更容易嵌入編譯器)。除此之外,當然,您應該使用'struct's而不是重複10個字段,這不僅僅是出於性能的原因,而是爲了減少重複並允許以相同的方式傳遞任何結構實例,對於實際的使用者來說是透明的。 – Groo

+2

由於您正在通過copy *傳遞結構體*,所以不存在指針。這種微型優化很少有生產力 - 將這種事情留給編譯器,並專注於通過使用高效的數據結構和算法在設計級進行優化。最終,「哪個更快」這個問題的答案只能通過測量來回答,答案甚至可能因編譯器,目標和編譯器選項而異。 – Clifford

回答

2

可以肯定的,如果一個實現比另一個快,你的編譯器,和你的問題空間,在你的代碼,您的硬件,爲您的特定的唯一途徑用例,就是衡量它。

然而,這兩個備選辦法,我希望通按結構來稍微快一點(順便說一下,在你的代碼是路過的指針)

在這兩個呈現的情況下,變量的副本被傳遞給函數。 在這兩種情況下,都會得到10個字節的副本,但是如果結構是連續的,則可能會稍微快一點。

然而,更好的選擇是通過指針如通過:

void sub_func1(my_struct* my_struct_input) 
{ 
    if(my_struct_input->member1 < my_struct_input<member2) 
    ///........ 
} 

這種方式,而不是複製10個個人變量,或10個字節的結構,我們只複製一個(大概32位,但它取決於)地址。

它的缺點是,您現在正在使用與調用方完全相同的結構進行操作,但可以使用const指針進行解析。

需要考慮的另一件事是,儘管函數調用在某種情況下可能會更快,但您必須查看更大的圖片。雖然傳遞結構指針的速度應該更快,但您還必須考慮構造結構的開銷 - 如果必須從現有變量中分配結構成員,這顯然會增加額外處理,這必須考慮在內。

+0

如果目標不需要更高級別的字對齊,則結構只是10個字節的副本 - 對於需要32位對齊的目標,結構可能爲40個字節。結構的使用也可以防止在寄存器中傳遞一些參數。這個問題沒有答案,有太多的未知數;它就像你說的那樣被測量。 – Clifford

相關問題