如果Number在范围内,是否有更快的比较方式?

时间:2016-05-16 08:52:38

标签: java android primitive

我正在使用下面的代码来检查数组中的数字是否在范围内:

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

我认为它现在有点快(因为少了+ - 操作)。

3 个答案:

答案 0 :(得分:1)

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

并检查以下内容 -

color[0] >= page_red && color[0] <= page_red + 50

每种颜色可节省一次减法,每次通话最多可节省3次。

答案 1 :(得分:0)

您可以使用数学

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

}

答案 2 :(得分: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;
}

这样你就可以避免重新访问阵列,这样可以节省你很多但是你会得到definitelly得到更多的额外微秒。

所以基本上我正在使用&amp;&amp;操作员短路特性以及我不需要在方法的开头创建三个变量的事实,这实际上会降低性能,因为并非所有条件都需要测试。它们是6,整个事情只需要一个就失败了。