可能重複:
Are doubles faster than floats in c#?簡單的數學運算在double上比在float數據類型上更快?
我寫了簡單的基準來檢查多少表現我可以在我的應用改變double
數據類型來float
。這裏是我的代碼:
// my form:
// one textbox: textbox1 (MultiLine property set to true)
// one button: button1 with event button1_Click
private void button1_Click(object sender, EventArgs e)
{
int num = 10000000;
float[] floats1 = new float[num];
float[] floats2 = new float[num];
float[] floatsr = new float[num]; // array for results
double[] doubles1 = new double[num];
double[] doubles2 = new double[num];
double[] doublesr = new double[num]; // array for results
Stopwatch stw = new Stopwatch();
log("Preparing data");
Random rnd = new Random();
stw.Start();
for (int i = 0; i < num; i++)
{
floats1[i] = NextFloat(rnd);
floats2[i] = NextFloat(rnd);
doubles1[i] = rnd.NextDouble();
doubles2[i] = rnd.NextDouble();
}
stw.Stop();
log(stw.Elapsed.TotalMilliseconds.ToString()+"ms");
stw.Reset();
log("");
stw.Start();
for (int i = 0; i <# i++)
{
floatsr[i] = floats1[i] * floats2[i];
}
stw.Stop();
log("Multiplying floats: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
stw.Reset();
stw.Start();
for (int i = 0; i < num; i++)
{
doublesr[i] = doubles1[i] * doubles2[i];
}
stw.Stop();
log("Multiplying doubles: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
stw.Reset();
stw.Start();
for (int i = 0; i < num; i++)
{
floatsr[i] = floats1[i]/floats2[i];
}
stw.Stop();
log("Dividing floats: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
stw.Reset();
stw.Start();
for (int i = 0; i < num; i++)
{
doublesr[i] = doubles1[i]/doubles2[i];
}
stw.Stop();
log("Dividing doubles: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
stw.Reset();
}
private void log(string text)
{
textBox1.Text = textBox1.Text + text + Environment.NewLine;
}
// I found that function somewhere on stackoverflow
static float NextFloat(Random random)
{
double mantissa = (random.NextDouble() * 2.0) - 1.0;
double exponent = Math.Pow(2.0, random.Next(-126, 128));
return (float)(mantissa * exponent);
}
我得到了這樣的結果(版本,沒有調試,英特爾移動酷睿雙核T2500 2.0GHz的CPU 2MB):
Preparing data 5275,6862ms
Multiplying floats: 442,7865ms
Multiplying doubles: 169,4028ms
Dividing floats: 550,7052ms
Dividing doubles: 164,1607ms
我很驚訝,上double
操作幾乎比float
上的操作快3倍。我搜索了「雙浮」在這裏,我發現這一點:
Is using double faster than float?
最好的答案是專注於CPU架構,但我不能同意這一點。
我懷疑別的東西會導致浮點運算性能低下,因爲我的英特爾SSE CPU應該能夠一次乘以或分成4個浮點數(打包浮點指令),或者一次打2個雙精度浮點數。所以花車應該更快。
也許編譯器(或者.net中的clr)以某種方式優化內存使用?
有沒有什麼辦法來優化它,並使浮動更快?
請不要舉報重複,我看到其他問題,他們不滿足我。
我的結果改變方法產生花車現在看起來罰款後(由Servy建議):
Preparing data 1367,0678ms
Multiplying floats: 109,8742ms
Multiplying doubles: 149,9555ms
Dividing floats: 167,0079ms
Dividing doubles: 168,6821ms
請注意,使用浮點數進行任何長時間的數值計算都會很快導致累積舍入誤差的風險。 –
與'NextDouble'小麥相比,你'NextFloat'的分佈非常不同。我不知道這是否有任何關聯。但請注意,'NextDouble'在'0.0'和'1.0'之間創建一個數字,它是1.0/2147483647.0的整數倍。所以這個數字的「結尾」並不是真正的隨機數,當計算產品或商數時,這可能很重要。 –
@JeppeStigNielsen重要;看到我的答案。改變它們使得它們都生成0到1之間的數字從根本上改變了我在修改之前和之後運行OP代碼的運行時間。 – Servy