c#非规范化浮点:是"零文字0.0f"慢?

时间:2016-12-27 16:07:16

标签: c# floating-point micro-optimization

我刚刚读到了非规范化浮点数,我应该用几乎为零的文字替换所有零文字以获得更好的性能。

我担心我的邪恶零常数会污染我的表现。 例如:

计划1:

float a = 0.0f;
Console.WriteLine(a);

计划2:

float b = 1.401298E-45f;
Console.WriteLine(b);

程序2不应该比程序1快1.000.000倍,因为b可以用cannonized形式的ieee浮点表示来表示吗?而程序1必须采用"零"这不能直接表示。

如果是这样,整个软件开发行业就存在缺陷。一个简单的字段声明:

float c;

会自动将其初始化为零,这会导致可怕的性能损失。

避免喧嚣提及"过早优化是......,blablabla"。 延迟了解编译器优化工作可能导致核工厂爆炸。所以我想提前知道我付的是什么,这样我就可以安全地忽略它的优化。

聚苯乙烯。我不在乎浮动因数学运算的结果而变得非正规化,我无法控制,所以我不在乎。

证明:x + 0.1f比x + 0快10倍 Why does changing 0.1f to 0 slow down performance by 10x?

问题提要:是邪恶的?所有使用它作为常数的人都是邪恶的吗?

1 个答案:

答案 0 :(得分:4)

非正规数没有什么特别之处,这使得它们本身比标准化的浮点数慢。事实上,仅支持支持非正规数的FP系统会非常快,因为它基本上只会进行整数运算。

缓慢来自于在法线和非法线的混合上执行时某些操作的相对困难。将法线添加到非正规比将法线添加到法线或将法线加到非法线上要复杂得多。计算机器只是涉及更多,需要更多步骤。因为大多数时候你只是在法线上运行,所以对这种常见情况进行优化是有意义的,只有当它不起作用时才会进入较慢且更通用的正常/非正规实现。

非正规异常的例外当然是0.0,这是一个零尾数的非正规。因为0是经常发现并执行操作的事物,并且因为涉及0的操作是微不足道的,所以这些操作是快速常见情况的一部分。

我认为你误解了你所关联问题的答案中发生了什么。 0本身并不会使事情变得缓慢:尽管技术上是非常规的,但它的操作速度很快。所讨论的非正规数是经过足够数量的循环迭代后存储在y数组中的非正规数。 0.1优于0的优点在于,在该特定代码片段中,它阻止变为非零非正规数的数字,而不是将0.1加上0.0而不是更快(不是)。