gpt4 book ai didi

c# - 简单的数学运算在 double 数据类型上比在 float 数据类型上更快?

转载 作者:行者123 更新时间:2023-11-30 13:38:54 39 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Are doubles faster than floats in c#?

我编写了简单的基准测试来检查在我的应用程序中将 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);
}

我得到了这样的结果(发布,无调试,Intel Mobile Core Duo T2500 2.0GHz 2MB CPU):

Preparing data 5275,6862ms

Multiplying floats: 442,7865ms
Multiplying doubles: 169,4028ms
Dividing floats: 550,7052ms
Dividing doubles: 164,1607ms

令我惊讶的是,double 上的操作几乎比 float 上的操作快 3 倍。我在这里搜索“double float”,我发现了这个:

Is using double faster than float?

最佳答案侧重于 CPU 架构,但我不同意这一点。

我怀疑是其他原因导致 float 性能低下,因为我的带有英特尔 SSE 的 CPU 应该能够一次乘以或除以 4 个 float (打包浮点指令),或者一次乘以或除以 2 个 double 。所以 float 应该更快。

也许编译器(或 .net 中的 clr)正在以某种方式优化内存使用?

有什么办法可以优化一下,让float更快吗?

请不要重复报告,我看到了其他问题,但它们并不令我满意。


更改生成 float 的方法后我的结果现在看起来很好(由 Servy 建议):

Preparing data 1367,0678ms

Multiplying floats: 109,8742ms
Multiplying doubles: 149,9555ms
Dividing floats: 167,0079ms
Dividing doubles: 168,6821ms

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com