2016-05-16 81 views
0

我使用代碼波紋管,以檢查是否在數組數爲範圍:如果數字在範圍內,是否有更快的方法進行比較?

private static final int page_red = 130; 
private static final int page_green = 140; 
private static final int page_blue = 135; 

private boolean isPageColor(double[] color) { 
    return color[0] >= page_red - 25 && color[0] <= page_red + 25 
       && color[1] >= page_green - 25 && color[1] <= page_green + 25 
       && color[2] >= page_blue - 25 && color[2] <= page_blue + 25; 
} 

有一個更快的方法(更高的性能)這樣做呢?


看你的意見(尤其是@VikrantKashyap和@TDG)我做編輯:

private static final int delta = 25; 

    private static final int page_red_min = page_red - delta; 
    private static final int page_green_min = page_green - delta; 
    private static final int page_blue_min = page_blue - delta; 

    private static final int page_red_max = page_red + delta; 
    private static final int page_green_max = page_green + delta; 
    private static final int page_blue_max = page_blue + delta; 

    private boolean isPageColor(double[] color) { 
     return color[0] >= page_red_min && color[0] <= page_red_max 
       && color[1] >= page_green_min && color[1] <= page_green_max 
       && color[2] >= page_blue_min && color[2] <= page_blue_max; 
    } 

我認爲這是一個有點快,現在(因爲較少+的 - 操作)。

+1

如果你的'int'值是固定的那麼常數那麼你爲什麼不使用值而不是'page_red - 25'或.... @VladimirKulyk –

+0

@VikrantKashyap好點。這只是一個例子。問題仍然是打開的(最快的方法是什麼) –

+0

您可以使用apache常用驗證器作爲替代,['isInRange()'](https://commons.apache.org/proper/commons-validator/apidocs /org/apache/commons/validator/routines/DoubleValidator.html#isInRange(double,%20double,%20double))like'isInRange(color [0],page_red,page_blue)'。 –

回答

0

您可以使用數學

private boolean isPageColor(double[] color) { 
    return Math.max(page_red - 25,color[0]) == Math.min(color[0], page_red - 25); 

} 
+2

'數學類將比'本機'運算符需要更多時間,如'==','<=' or '> ='。不是嗎? –

+0

除非值完全是page_red - 25,否則此比較始終爲false。您可能希望在第二項中將負號替換爲加號。 – Matt

+0

@VikrantKashyap這也是我想知道的。我開始考慮在開始時創建變量,如果絕對所有情況都經過測試,那麼情況就會變得更加有效。我開始認爲這個問題的實際執行可能是最高性能的。 –

1

更改常量的值到最小值:
private static final int page_red = 105;

並檢查以下 -

​​

這樣可以節省你每種顏色減少一次,每次通話最多3次。

0

這裏我已經改變了我以前的答案了一下。

純粹基於性能我會說,什麼可能會改善它,就好比你在開始比較之前拉出一些變量,並在你的方法中使用它們。您可能沒有理由首先創建陣列。如果你不需要這個陣列在所有和您只使用它可以很容易地傳遞參數,那麼你應該考慮實際傳遞每個顏色:

private boolean isPageColor(double color0, double color1, double color2) { 
    return color0 >= page_red - 25 && color0 <= page_red + 25 
       && color1 >= page_green - 25 && color1 <= page_green + 25 
       && color2 >= page_blue - 25 && color2 <= page_blue + 25; 
} 

這樣你避免再次訪問數組這會爲你節省很多,但你會得到更多的額外微秒。

所以基本上我正在利用運營商的短路屬性和事實,我不需要在方法的開始創建三個變量,實際上會降低性能,因爲並非所有的條件都需要進行測試。他們是6,整個事情只有一個失敗。

+0

如果第一次編譯失敗,則不需要訪問其他兩個變量。 – TDG

+0

好的,我明白了!讓我看看我能做些什麼來改進它。 –

+0

@JoaoEsperancinha我使用的是OpenCV,並將像素顏色作爲'double []'(紅色,綠色,藍色,alpha),所以輸入參數應該是'double []'。 –

相關問題