假設我正在使用C++。現在,我有以下代碼:在這種情況下,如何優化性能而不違反DRY(不重複自己)原則?
int flag;
// ...
while (!TimeToExitLoop()) {
Func();
}
的while
循環將被執行的時間數量龐大,而且Func
是這樣一個時間關鍵功能:
void Func() {
// some big stuff ...
if (flag > 1) {
// logic 1 ...
}
else {
// logic 2 ...
}
}
而且,flag
值將不會在while
循環內發生變化。因此,最好是移動條件if
聲明瞭while
循環,並定義兩個單獨的函數的兩個條件是這樣的:
int flag;
// ...
if (flag > 1) {
while (!TimeToExitLoop()) {
Func_FlagBiggerThanOne();
}
}
else {
while (!TimeToExitLoop()) {
Func_FlagNoBiggerThanOne();
}
}
然而,這將導致「大東西」的重複在Func
通過Func_FlagBiggerThanOne
和Func_FlagNoBiggerThanOne
:
void Func_FlagBiggerThanOne() {
// big stuff ...
// logic 1 ...
}
void Func_FlagNoBiggerThanOne() {
// big stuff ...
// logic 2 ...
}
這將違反鴕鳥政策重複自己動手的原則。我們不能在某些函數中使用「大東西」,因爲調用該函數會比原始語句更費時。其中一個解決方案是爲那個大東西定義一個宏,但是如果「邏輯1」和「邏輯2」將使用「大東西」中定義的變量呢?雖然宏仍然有效,但這可能會導致難看的代碼,程序的讀者可能會想,「這些變量在哪裏定義?」
使用一個編譯器/鏈接器,它可以將條件從環路中斷開......但編譯器/鏈接器必須是相當的如果`Func`在另一個文件中,因爲`flag`顯然是全局性的,所以很時髦。 – lijie 2010-11-24 11:01:56
「我們不能在某些函數中放入那些」大東西「,因爲調用該函數比原始if語句耗時更多。 » 你不能內聯嗎? – Zecc 2010-11-24 11:23:27
我認爲一個好的程序員不應該從編譯器/鏈接器中取任何東西。另外,Zecc,我猜內聯不會工作,因爲那些東西非常「大」。 – 2010-11-25 05:11:40