如果数字在范围内,是否有更快的方法进行比较?
我使用代码波纹管,以检查是否在数组数为范围:如果数字在范围内,是否有更快的方法进行比较?
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;
}
我认为这是一个有点快,现在(因为较少+的 - 操作)。
您可以使用数学
private boolean isPageColor(double[] color) {
return Math.max(page_red - 25,color[0]) == Math.min(color[0], page_red - 25);
}
'数学类将比'本机'运算符需要更多时间,如'==',' ='。不是吗? –
除非值完全是page_red - 25,否则此比较始终为false。您可能希望在第二项中将负号替换为加号。 – Matt
@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,整个事情只有一个失败。
如果第一次编译失败,则不需要访问其他两个变量。 – TDG
好的,我明白了!让我看看我能做些什么来改进它。 –
@JoaoEsperancinha我使用的是OpenCV,并将像素颜色作为'double []'(红色,绿色,蓝色,alpha),所以输入参数应该是'double []'。 –
如果你的'int'值是固定的那么常数那么你为什么不使用值而不是'page_red - 25'或.... @VladimirKulyk –
@VikrantKashyap好点。这只是一个例子。问题仍然是打开的(最快的方法是什么) –
您可以使用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)'。 –