簡體   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