如果数字在范围内,是否有更快的方法进行比较?

问题描述:

我使用代码波纹管,以检查是否在数组数为范围:如果数字在范围内,是否有更快的方法进行比较?

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)'。 –

您可以使用数学

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

} 
+2

'数学类将比'本机'运算符需要更多时间,如'==',' ='。不是吗? –

+0

除非值完全是page_red - 25,否则此比较始终为false。您可能希望在第二项中将负号替换为加号。 – Matt

+0

@VikrantKashyap这也是我想知道的。我开始考虑在开始时创建变量,如果绝对所有情况都经过测试,那么情况就会变得更加有效。我开始认为这个问题的实际执行可能是最高性能的。 –

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

并检查以下 -

​​

这样可以节省你每种颜色减少一次,每次通话最多3次。

这里我已经改变了我以前的答案了一下。

纯粹基于性能我会说,什么可能会改善它,就好比你在开始比较之前拉出一些变量,并在你的方法中使用它们。您可能没有理由首先创建阵列。如果你不需要这个阵列在所有和您只使用它可以很容易地传递参数,那么你应该考虑实际传递每个颜色:

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 []'。 –