要優化具有相同模式的函數,我正在考慮兩種實現方式。 可能使用的此功能的環境位於嵌入式軟件的中斷內部。這就是爲什麼我要面對困難,因爲需要考慮速度容量。 在我看來,以下案例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;
}
要確定一個實現是否比另一個實現更快,對於編譯器和您的問題空間,在您的代碼中,在您的硬件上,針對您的特定用例,唯一的方法就是測量它。 – mjs
您沒有傳遞指向結構的指針,這兩個片段都將相同數量的數據複製到堆棧。你應該通過引用傳遞結構(即使用指針),而不是每次都複製它(就像你現在正在做的那樣),這可能會更高效(可能更容易嵌入編譯器)。除此之外,當然,您應該使用'struct's而不是重複10個字段,這不僅僅是出於性能的原因,而是爲了減少重複並允許以相同的方式傳遞任何結構實例,對於實際的使用者來說是透明的。 – Groo
由於您正在通過copy *傳遞結構體*,所以不存在指針。這種微型優化很少有生產力 - 將這種事情留給編譯器,並專注於通過使用高效的數據結構和算法在設計級進行優化。最終,「哪個更快」這個問題的答案只能通過測量來回答,答案甚至可能因編譯器,目標和編譯器選項而異。 – Clifford