【发布时间】:2015-06-09 18:12:18
【问题描述】:
我有一个算法可以将浮点数/双精度数与 0 进行大量比较。
类似的东西:
var sum = 0.0;
for(int i=0;i<data.Length;i++)
sum += Math.Max(data[i],0);
我想知道是否有更快的方法来做到这一点? 在我的微基准测试中,它的执行速度几乎没有提高 (5-7%)。
public static unsafe float FasterCompare(float value)
{
var val = *(int*) &value;
return val > 0 ? value : 0;
}
【问题讨论】:
-
是什么让您认为这是需要优化的主要性能瓶颈?
-
@Michal 那么听起来你的时间最好花在其他地方。
-
referencesource.microsoft.com/#mscorlib/system/math.cs 请参阅第 441 行的 Math.Max,它并不过分复杂,但如果您可以保证没有任何值是
Single.Nan,那么您可以通过编写自己的检查来删除。归结为 sum += (data[i] > 0.0f ? data[i] : 0.0f)。还要删除隐式转换,因为这会花费一些东西,根据数组将sum声明为float或double,现在您正在对浮点数求和,转换整数,然后再次转换为双精度... -
你到底想在这里做什么?您将数据中大于或等于零的任何值添加到总和中。为什么还要
Math.Max()?您可以检查该值是否 >= 0 并添加它。 -
您的基准测试存在严重问题,始终存在,此代码的成本是读取数组元素,而不是比较。访问内存是迄今为止处理器所做的最昂贵的事情。比较是免费的,然后处理器只是停止等待值。
标签: c# performance