![](/img/trans.png)
[英]iPhone - is there any advantage in using animateWithDuration instead of UIView beginAnimations?
[英]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;
}
如果他们不希望代码在函数外部扩展,则可以在函数内部编写一个静态块。
我的问题是:使用一种方法或另一种方法是否可以提高速度?
我的问题是:使用一种方法或另一种方法是否可以提高速度?
MIN
和MAX
是扩展为内联代码的宏,而您的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)
选择最清晰的选择 ,不要对速度太在意-除非后来的分析表明这是一个问题。
高温超导
MIN
和MAX
是在编译开始时扩展为大约(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.