gpt4 book ai didi

c# - double 有没有可能比 float 快 2 倍?

转载 作者:太空狗 更新时间:2023-10-29 22:16:14 27 4
gpt4 key购买 nike

<分区>

我执行了一些基准测试来比较 double 和 float 的性能。看到 double 比浮点快得多,我感到非常惊讶。

我看到一些关于这个的讨论,例如:

Is using double faster than float?

Are doubles faster than floats in c#?

他们中的大多数人说,double 和 float 性能可能会相似,因为 double 优化等。但我看到使用 double 时x2 的性能提升!!这怎么可能?最糟糕的是,我使用的是一台 32 位机器,根据一些帖子,它确实有望在 float 方面表现更好......

我使用 C# 对其进行了精确检查,但我发现类似的 C++ 实现具有类似的行为。

我用来检查它的代码:

static void Main(string[] args)
{
double[,] doubles = new double[64, 64];
float[,] floats = new float[64, 64];

System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();

s.Restart();
CalcDoubles(doubles);
s.Stop();
long doubleTime = s.ElapsedMilliseconds;

s.Restart();
CalcFloats(floats);
s.Stop();
long floatTime = s.ElapsedMilliseconds;

Console.WriteLine("Doubles time: " + doubleTime + " ms");
Console.WriteLine("Floats time: " + floatTime + " ms");
}

private static void CalcDoubles(double[,] arr)
{
unsafe
{
fixed (double* p = arr)
{
for (int b = 0; b < 192 * 12; ++b)
{
for (int i = 0; i < 64; ++i)
{
for (int j = 0; j < 64; ++j)
{
double* addr = (p + i * 64 + j);
double arrij = *addr;
arrij = arrij == 0 ? 1.0f / (i * j) : arrij * (double)i / j;
*addr = arrij;
}
}
}
}
}
}

private static void CalcFloats(float[,] arr)
{
unsafe
{
fixed (float* p = arr)
{
for (int b = 0; b < 192 * 12; ++b)
{
for (int i = 0; i < 64; ++i)
{
for (int j = 0; j < 64; ++j)
{
float* addr = (p + i * 64 + j);
float arrij = *addr;
arrij = arrij == 0 ? 1.0f / (i * j) : arrij * (float)i / j;
*addr = arrij;
}
}
}
}
}
}

我使用的笔记本电脑性能很差:Intel Atom N455 处理器(双核,1.67GHz,32 位)和 2GB RAM。

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