我有一個函數,如果單個輸入參數的數目很大,該函數在程序中也會運行數億次。優化函數的參數輸入
如果我想優化這個函數,我應該創建一個新的數據結構來保存所有輸入參數,並通過引用將其傳遞給函數,而不是將每個參數單獨傳遞給函數?或者,這樣做無關緊要,因爲編譯器足夠聰明,能夠以更高效的方式處理這個問題?
我有一個函數,如果單個輸入參數的數目很大,該函數在程序中也會運行數億次。優化函數的參數輸入
如果我想優化這個函數,我應該創建一個新的數據結構來保存所有輸入參數,並通過引用將其傳遞給函數,而不是將每個參數單獨傳遞給函數?或者,這樣做無關緊要,因爲編譯器足夠聰明,能夠以更高效的方式處理這個問題?
通常,傳遞包含變量的數據結構要好得多。這不是徒有其表或使用:
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+)變量在某個上下文中具有相似的用法,最好將它傳遞給數據結構。
參數大多是不變的,或者大多數參數在每次調用時都會改變?如果你只能做一次,你不想多次評估參數。
請記住編譯器用參數進行的操作。
它評估每一個並將其推入堆棧。然後輸入該函數,並通過它們在堆棧中的偏移量引用這些參數。所以它基本上與將參數放入塊並通過塊相同。但是,如果您自己構建塊,則可以重新使用舊值並僅評估已知更改的值。
在任何情況下,您都必須查看函數內部相對於傳遞參數花費的時間內的工作量。不知道總體時間跨度是多少,你稱它爲10^8次是毫無意義的。這可能是每個電話10ns,或每個電話10ms。如果後者幾乎所有的時間都花在了函數內部,所以它可能並沒有太大的區別。
如果編譯器不內聯這樣的函數,我會感到非常驚訝。它是遞歸的嗎? – CromTheDestroyer 2011-03-20 23:35:52
不,不遞歸,只是在一個巨大的5嵌套循環... – Faken 2011-03-20 23:37:20