使用lambda重新定义函数或调用标准API(Math.Ceiling)

时间:2011-12-13 15:38:20

标签: c# casting lambda

我想计算严格正整数的 ceiling 除法。我可以在以下两种实现之间进行选择:

var ceil = new Func<int, int, int>((a, b) => a % b > 0 ? a / b + 1 : a / b);
var x = ceil(y, z); // y and z being int previously defined

var x = (int)Math.Ceiling((double)y / (double)z);

第二个版本(Math.Ceiling)似乎与第一个版本(带有lambda)相同,但添加了3个转换。所以我觉得要使用第一个。我错过了什么吗?

(编辑以确定它只是处理严格正整数的事实)

2 个答案:

答案 0 :(得分:6)

就个人而言,我会避免担心优化int - &gt; double转化,这些通常是您对性能的担忧最少。是的,他们可以加起来,但你需要在紧密的循环或类似的东西中做很多事情。

我坚持使用Math.Ceiling(),因为你要做的事情非常明显,因此更容易维护。如果您发现代码很慢,那么首先优化并攻击最大的问题点。

这些超过 10亿次次迭代的时间,lambda为8,677 ms,Math.Ceiling()为9,749 ms,但是每次调用为0.0000087 ms vs 0.0000097 ms,这可以忽略不计。

答案 1 :(得分:0)

没有理由使用lambda而不是方法。

第二个有点难看:当被除数是除数的整数倍时,你依靠浮点除法给出一个确切的结果。虽然我不能想到32位整数的情况,并且在不是这种情况的情况下加倍,但它仍然给我一种不好的感觉。如果您稍后将Int32替换为Int64,则突然不再正确。

只需定义一个新的常规方法:

public static int IntDivisionCeiling(int dividend, int divisor)
{
  int quotient=dividend/divisor;
  if(dividend%divisor>0)
    return quotient;
  else
    return quotient+1;
}