繁体   English   中英

通过使用MIN MAX而不是通过常规代码检查范围,在速度方面是否有任何优势?

[英]Is there any advantage in terms of speed by using MIN MAX instead of checking the range by regular code?

我在Apple创建的示例应用程序上看到此代码段:

- (AVCaptureWhiteBalanceGains)normalizedGains:(AVCaptureWhiteBalanceGains)gains
{
    AVCaptureWhiteBalanceGains g = gains;

    g.redGain = MAX( 1.0, g.redGain );
    g.greenGain = MAX( 1.0, g.greenGain );
    g.blueGain = MAX( 1.0, g.blueGain );

    g.redGain = MIN( self.videoDevice.maxWhiteBalanceGain, g.redGain );
    g.greenGain = MIN( self.videoDevice.maxWhiteBalanceGain, g.greenGain );
    g.blueGain = MIN( self.videoDevice.maxWhiteBalanceGain, g.blueGain );

    return g;
}

苹果正在检查红色,绿色和蓝色增益值,以防止该值超出有效范围。

好的,我知道MIN MAX会做什么,但是像他们这样写,真的有必要吗? 这种代码会使您的大脑疲劳一微秒,因为如果您以前从未看过,一眼就很难理解。

相反,编写一个函数来检查它会更容易吗? 喜欢:

- (CGFloat) checkValue:(CGFloat)v againstMinimum:(CGFloat)min andMaximum:(CGFloat)max {
  if (v < min) return min;
  if (v > max) return max; 
  return v;
}

如果他们不希望代码在函数外部扩展,则可以在函数内部编写一个静态块。

我的问题是:使用一种方法或另一种方法是否可以提高速度?

我的问题是:使用一种方法或另一种方法是否可以提高速度?

MINMAX是扩展为内联代码的宏,而您的checkValue:againstMinimum:andMaximum:是需要方法分派的方法-因此,前者无疑是更快的方法,但对整个应用程序的好处可能微不足道。

如果您想要清晰度,并且应该但不花太多钱,可以从一个函数开始:

CGFloat checkValue(CGFloat min, CGFloat v, CGFloat max)
{
   if (v < min) return min;
   if (v > max) return max; 
   return v;
}

并获得内联的好处,添加NS_INLINE

NS_INLINE CGFloat checkValue(CGFloat min, CGFloat v, CGFloat max) ...

两者都具有它们是函数的优点–通常是更好的编译器错误消息,不会因参数的双重评估而产生奇怪的影响,等等–但是,如果您喜欢宏解决方案,则可以使用:

#define CLAMP(lower, v, upper) MIN(MAX(lower, v), upper)

选择最清晰的选择 ,不要对速度太在意-除非后来的分析表明这是一个问题。

高温超导

MINMAX是在编译开始时扩展为大约(a < b)? a : b(a < b)? a : b (a < b)? a : b MIN表示(a < b)? a : b ,MAX表示相反。 不考虑条件if和三元之间的详细区别? , 他们都是一样的。

也就是说,出于所有意图和目的:

int a = MAX(b,c);
int a = (b > c)? b : c;
if (b > c) a = b; else a = c;

都是一样的。

一旦习惯了,他们选择的配方就非常好。 这是将值“限制”在范围内的想法:“这些值可能以任何方式出现,但是当我们完成操作后,它们将落入某个范围内(在代码中可以像MIN和MAX)”。 当我看到这样的代码时,因为我只需要考虑钳位范围,就可以更好地理解以下数学内容,这让我感到很自在。

我将方法称为“ clampedGains”增益,而不是“ normalizedGains”增益。 通过将值除以理论最大值,规范化将值映射到0.0 ... 1.0范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM