2016-11-27 27 views
-1

我看到蘋果公司創建一個示例應用程序的代碼段:使用MIN MAX而不是通過普通代碼檢查範圍,在速度方面是否有優勢?

- (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; 
} 

或者寫一個靜態塊裏面的功能,如果他們不想要的代碼的功能以外的業務。

我的問題是:通過使用一種方法或其他方法有速度增益嗎?

回答

2

我的問題是:通過使用一種方法或其他方法是否有速度增益?

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) 

選號,不關心自己太多在速度 - 除非以後的分析表明它是一個問題。

HTH

+0

你已經使用了'NS_INLINE'而不是僅僅使用'inline' ...爲什麼是這樣? – SpaceDog

+0

查找'NS_INLINE'的定義,你會看到它擴展爲內聯屬性和'static',它們停止將函數名添加到全局名稱空間。這只是Apple定義的一個方便的宏。 – CRD

1

MINMAX是在編譯開始時擴展到大致爲(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和MIN的其他參數MAX)」。當我看到這樣的代碼時,我會感覺很舒服,我會更好地理解後面的數學,因爲我只需要考慮鉗位範圍。

我會調用方法「clampedGains」而不是「normalizedGains」獲得。通過將該值除以其理論最大值,歸一化將值映射到0.0 ... 1.0的範圍內。

+0

如果二進制編譯的代碼是相同的,目的是使其變得複雜。 – SpaceDog

相關問題