2011-03-20 53 views
0

我有一個函數,如果單個輸入參數的數目很大,該函數在程序中也會運行數億次。優化函數的參數輸入

如果我想優化這個函數,我應該創建一個新的數據結構來保存所有輸入參數,並通過引用將其傳遞給函數,而不是將每個參數單獨傳遞給函數?或者,這樣做無關緊要,因爲編譯器足夠聰明,能夠以更高效的方式處理這個問題?

+0

如果編譯器不內聯這樣的函數,我會感到非常驚訝。它是遞歸的嗎? – CromTheDestroyer 2011-03-20 23:35:52

+0

不,不遞歸,只是在一個巨大的5嵌套循環... – Faken 2011-03-20 23:37:20

回答

2

通常,傳遞包含變量的數據結構要好得多。這不是徒有其表或使用:

void f(int a, int b, int c, int d, int e, int f) 
{ 
    // do stuff 
} 

這是好得多:

void f(Params p) 
{ 
    // do stuff with p 
} 

你可能想要做按引用傳遞,所以編譯器可以直接傳遞給對象的引用,而不是複製整個數據結構。 作爲一個真實的例子:

double distance(double x1, double y1, double z1, double x2, double y2, double z2) 
{ 
    double dx = x1 - x2; 
    double dy = y1 - y2; 
    double dz = z1 - z2; 

    return sqrt(dx*dx + dy*dy + dz*dz); 
} 

這將是更好的,如果包裹我們的(X,Y,Z)到數據結構,但:

struct Point 
{ 
    double x; 
    double y; 
    double z; 
}; 

double distance(const Point &p1, const Point &p2) 
{ 
    double dx = p1.x - p2.x; 
    double dy = p1.y - p2.y; 
    double dz = p1.z - p2.z; 

    return sqrt(dx*dx + dy*dy + dz*dz); 
} 

更清潔的代碼,你會得到額外的獎勵它可以*表現更好(*取決於你的編譯器在優化任何版本時的智能程度)。

很顯然,這取決於您實際嘗試完成的內容,但是如果您有幾個(4+)變量在某個上下文中具有相似的用法,最好將它傳遞給數據結構。

+0

嗯...... 96個變量怎麼樣?該函數是一個沉重的數學相關函數。 – Faken 2011-03-20 23:38:33

+0

96個變量表明你可能做錯了什麼。你到底在做什麼? – 2011-03-20 23:39:06

+0

變量來自左側的右側和中間,並根據該函數所處的大量循環進行選擇。一般來說,我應該使用一種結構? – Faken 2011-03-20 23:40:07

1

參數大多是不變的,或者大多數參數在每次調用時都會改變?如果你只能做一次,你不想多次評估參數。

請記住編譯器用參數進行的操作。

它評估每一個並將其推入堆棧。然後輸入該函數,並通過它們在堆棧中的偏移量引用這些參數。所以它基本上與將參數放入塊並通過塊相同。但是,如果您自己構建塊,則可以重新使用舊值並僅評估已知更改的值。

在任何情況下,您都必須查看函數內部相對於傳遞參數花費的時間內的工作量。不知道總體時間跨度是多少,你稱它爲10^8次是毫無意義的。這可能是每個電話10ns,或每個電話10ms。如果後者幾乎所有的時間都花在了函數內部,所以它可能並沒有太大的區別。