【问题标题】:Fastest Way To Clamp an Integer钳位整数的最快方法
【发布时间】:2022-04-04 09:14:41
【问题描述】:

我不确定“clamping”是否是正确的术语,但我真的不知道还能怎么称呼它。假设我们想将一个整数限制在某个任意范围内,比如 0-50。这可以通过使用 if 语句测试当前值并相应地分配最大值或最小值来轻松实现。但是,让 Integer 保持最大值或最小值的最快方法是什么?

【问题讨论】:

  • 如果一个内置特性是您在 C# 中寻找的钳位,那可能不可用。使用这些抽象来实现您的目的是安全的,而不必担心性能瓶颈。
  • 检查最小值和/或最大值最终通常会“编译”为 CPU 上大约 5-10 个时钟周期或更短的整数比较和分支指令。你为什么关心这个级别的时钟周期。当然,让你的代码可读和更容易维护比使用一些花哨的位移位或布尔掩码技巧来节省 1 个时钟周期更为重要。
  • 可能重复:已在此处回答:“如何强制数字在 C# 中的范围内?” (stackoverflow.com/questions/3176602/…)。
  • @krythic 你要求的是最快的,而不是“正确”的方式:)

标签: c# clamp


【解决方案1】:

很简单

var normalized = Math.Min(50, Math.Max(0, value));

截至业绩:

  public static int Max(int val1, int val2) {
    return (val1>=val2)?val1:val2;
  }

implemented in .NET 就是这样,所以你不可能更好地实现它。

【讨论】:

  • 而这已知是最快的?我期待某种花哨的位移或其他东西。
  • “最快”与什么相比?没有绝对的“最佳解决方案”。
  • 看起来其他人也建议这样做,因为另一个链接显示了相同的内容但实现方式略有不同。我会接受你作为答案。
  • @zerkms,直到 JON SKEET 否认。
  • @Manoz 希望他现在睡着了,这样我就可以轻松获得 +15 分!
【解决方案2】:

如果你想要速度,你应该保持 CPU 的分支预测器满意。所以让“幸福路径”返回 'n'(调用 'Clamp' 的最可能结果):

public static int Clamp( int n, int min, int max ) {
    if( value < min ) return min;
    if( value > max ) return max;
    return n;
}

【讨论】:

    【解决方案3】:

    Math.Clamp 是从 .NET Core 2.0 开始引入的,因此您可以直接使用它。应该是目前最快的方法

    Math.Clamp(12, 0, 50)
    

    【讨论】:

    • 这有什么问题?
    • 看起来其中一些重载是在 .net 6 中添加的。
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2014-10-26
    • 2023-03-30
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多