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

本文关键字:标准 调用 API Math Ceiling 函数 lambda 新定义 定义 使用 | 更新日期: 2023-09-27 18:17:48

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

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个转换。所以我想用第一个。我错过什么了吗?

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

就我个人而言,我会避免担心优化int -> double转换,这些通常是您在性能方面最不担心的问题。是的,它们可以加起来,但你需要在一个紧密的循环中做很多事情或类似的事情。

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

10亿次迭代进行计时,lambda为8,677 ms, Math.Ceiling()为9,749 ms,但每个调用的0.0000087 ms vs 0.0000097 ms可以忽略不计。

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

第二个有点难看:当被除数是被除数的整数倍时,您依赖浮点除法来给出精确的结果。虽然我想不出32位整数和双精度的情况不是这种情况,但它仍然给我一种不好的感觉。如果你后来用Int64代替Int32,它突然就不再正确了。

定义一个新的normal方法:

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