2016-05-16 4 views
0

J'utilise le code ci-dessous pour vérifier si les numéros de tableau est dans la gamme:Existe-t-il un moyen plus rapide de comparer si le nombre est dans la plage?

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

Y at-il un moyen plus rapide (plus de performance) pour le faire?


regardant vos conseils (en particulier @VikrantKashyap et @TDG) J'ai fait modifier:

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

Je pense qu'il est un peu plus vite maintenant (en raison de moins + - opérations).

+1

si vos valeurs 'int' sont fixes Constante alors pourquoi n'utilisez-vous pas la valeur au lieu de' page_red - 25' ou .... @VladimirKulyk –

+0

@VikrantKashyap bon point. C'est juste un exemple. La question est toujours ouverte (quel est le moyen le plus rapide de le faire) –

+0

Vous pouvez utiliser le validateur commun apache comme alternative, ['isInRange()'] (https://commons.apache.org/proper/commons-validator/apidocs /org/apache/commons/validator/routines/DoubleValidator.html#isInRange(double,%20double,%20double)) comme 'isInRange (couleur [0], page_red, page_blue)'. –

Répondre

0

Vous pouvez utiliser Math

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

} 
+2

La classe 'Math' prendra plus de temps qu'un opérateur' natif 'comme '==', '<=' or '> ='. N'est-ce pas? –

+0

Cette comparaison est toujours fausse sauf si la valeur est exactement page_red - 25. Vous pouvez remplacer le moins par un plus dans le second terme. – Matt

+0

@VikrantKashyap C'est aussi ce que je me demandais.J'ai pensé à créer les variables au début et ce serait plus efficace si absolument toutes les conditions étaient testées tout le temps ce qui n'est pas le cas. Je commence à penser que peut-être la mise en œuvre réelle dans la question est la plus performante. –

1

Modifiez la valeur des constantes à la minimale Valeur:
private static final int page_red = 105;

et vérifiez les points suivants -

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

Il vous sauve une soustraction par couleur, et jusqu'à 3 par appel.

0

Ici, j'ai un peu changé ma réponse précédente.

Purement basé sur performance Je dirais que ce qui pourrait l'améliorer, c'est juste si vous retirez certaines variables avant de commencer la comparaison et de les utiliser dans votre méthode. Vous ne pouvez pas avoir une raison de créer le tableau en premier lieu. Si vous n'avez pas besoin de ce tableau du tout et vous ne l'utilisez pas pour le rendre facile de passer des paramètres alors vous devriez considérer en fait passer chacun de la couleur:

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

Vous évitez ainsi re-accéder au tableau ce qui vous sauvera pas vraiment beaucoup, mais vous obtiendrez certainement un peu plus de microsecondes supplémentaires. Donc, fondamentalement, je fais usage de la propriété de court-circuit & opérateur et le fait que je ne ai pas besoin de créer les trois variables dans le début de la méthode qui diminuerait réellement la performance parce que toutes les conditions ont besoin être testé. Ils sont 6 et il n'en faut qu'un pour que tout échoue.

+0

Si la première compression échoue, il n'est pas nécessaire d'accéder aux deux autres variables. – TDG

+0

ok je vois! laisse-moi voir ce que je peux faire pour l'améliorer. –

+0

@JoaoEsperancinha J'utilise OpenCV et je prends la couleur des pixels comme 'double []' (rouge, vert, bleu, alpha), donc le paramètre d'entrée doit être 'double []'. –