IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Comparaison de deux byte


Sujet :

Java

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Comparaison de deux byte
    Bonjour,

    je souhaiterai comparer 2 byte de la façon la PLUS RAPIDE possible !

    Le souci en java, c'est que nous n'avons pas des "unsigned", donc les byte sont codés sur [-128, 127].
    Lorsque je veux comparer, je ne peux donc pas faire Math.max((int)b1, (int)b2), car la valeur 255 en int est négative en byte

    Donc quelle est la façon la plus rapide de comparer deux byte ?

    J'ai ces deux possibilités, mais j'espère qu'il y a plus rapide car je dois vraiment aller au plus vite :
    - Math.max(b1 & 0xFF , b2 & 0xFF)
    - Math.max(0<=b1?b1:256f+b1, 0<=b2?b2:256+b2)
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    EDIT : pas compris qu'il s'agissait d'une comparaison bit à bit...
    J'excluerai donc le bit du signe par un mask ...
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par Nemek Voir le message
    J'exclurai donc le bit du signe par un mask ...
    C'est-à-dire ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    J'ai ces deux possibilités, mais j'espère qu'il y a plus rapide car je dois vraiment aller au plus vite :
    - Math.max(b1 & 0xFF , b2 & 0xFF)
    À mon humble avis c'est déjà très rapide.
    Pour faire encore plus rapide, il faudrait manipuler des int au lieu de bytes depuis le début (en s'assurant lors de la création des données, qu'ils ne sortent pas du range 0 <= int < 256).
    Possible aussi que ça le fasse avec des short, pour économiser de la mémoire
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par thelvin Voir le message
    À mon humble avis c'est déjà très rapide.
    Pour faire encore plus rapide, il faudrait manipuler des int au lieu de bytes depuis le début (en s'assurant lors de la création des données, qu'ils ne sortent pas du range 0 <= int < 256).
    Possible aussi que ça le fasse avec des short, pour économiser de la mémoire
    Ben justement, c'est l'appliquer à comparaison en pixel d'un BufferedImage. Lorsque je travaille sur des images en niveaux de gris [0,255], c'est forcément des byte derrière.
    Certaines images couleurs sont codées sur des int, mais d'autres le sont encore sur des byte.

    D'où mon souci pour comparer AU PLUS VITE des byte. Je ne souhaite pas du "très rapide", mais LE PLUS rapide. Car c'est pour avoir des performances très particulière sur un algo.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur logiciel embarqué
    Inscrit en
    Juillet 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2002
    Messages : 386
    Points : 1 164
    Points
    1 164
    Par défaut
    a mon avis, le bit de signe est a prendre en consideration, mais comme un bit significatif et non un bit de signe.

    Pour faire de la comparaison bit a bit, rien de tel que l'assembleur (java n'a pas ete fait pour ca il me semble...) donc la solution pour que ton calcul soit le plus rapide possible serait de passer par du jni. Mais ton temps d'acces au calcul (travercer la conche jni / c / asm) risque de ne pas te faire gagner enormement au final. A moins de regrouper des series de comparaison.

    en fonction du nombre de comparaisons a faire tu peu aussi passer par des int (qui permettent la valeur 256). ta comparaisson sera rapide, mais le passage prendra du temps. tout depend des comparaisons que tu fait sur une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //renvoi la valeur (integer) d'un byte, non signe
    int bv(byte b){
      int out = b;
      if(b<0)
        out=out+256;
      return out;
    }
    enfin en fonction des cas, tu peu traiter lemsb (bit de signe) puis le reste, si le msb suffi a determiner qui est le plus grand ca ira vite, sinon non...

    Edit : dans le cas des images, en fonction de tes contraintes (multiplatforme?)ca peut etre interessant de passer par du jni. Et d'y mettre toute la procedure critique.

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je me suis demandé un moment si une méthode qui fasse la séparation des cas en fonction du signe n'irait pas plus vite, mais après quelques tests la solution avec "& 0xFF" est la plus rapide.

  8. #8
    Membre éprouvé

    Homme Profil pro
    Ingénieur logiciel embarqué
    Inscrit en
    Juillet 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2002
    Messages : 386
    Points : 1 164
    Points
    1 164
    Par défaut
    j'ai fait quelques tests pour comparrer les methodes... voici mes premiers resultats. Le bute est pas de donner une valeur temporelle mais etablire un ordre de grandeur du travail necessaire pour la comparaison, et ce avec differentes methodes. Ici je comparre deux tableau de 1200*1600. Soit 1920000 comparaisons. Les temps sont donné par comparaison (t/1920000)
    Les premiers resultats sont obtenu lors de le premiere execution du code (donc sans jit ou presque). Les second resultats sont obtenu avec jit (probablement, peut on en etre sur en java?). le tout avec une jvm 64b.

    - la valeur base correspond au temp de referance (appel, boucle... pas de comparaison )

    - la valeur byte correspond a la meme boucle avec la comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = Math.max(bt1[i] & 0xFF , bt2[i] & 0xFF);

    - la valeur int correspond a la meme boucle avec la comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = Math.max(it1[i],it2[i]);

    - la valeur cint correspond a la meme boucle avec la comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(it1[i]<it2[i])
        result =it2[i];
    else
        result =it1[i];
    Note : la convertion de la table byte vers int,n'est pas pris en compte dans les resultats.

    base 0.4643557291666667ns
    byte 1.9922109375ns
    int 1.480859375ns
    cint 1.3644703125ns

    apres un passage ...

    base 0.0155984375ns
    byte 0.12138854166666667ns
    int 0.030397395833333334ns
    cint 0.037596354166666665ns

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    En principe, une extension suivie d'un bitwise-AND devrait être plus rapide qu'un compare suivi de jne suivi d'extension suivi d'addition, sur n'importe quel processeur.

    Donc la méthode b1 & 0xFF devrait être la plus rapide partout.
    En principe.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    dès que vous faites: b & 0xFF, vous faites une promotion de votre byte en int, car 0xFF c'est un int en java! CA ne devrais pas être catastrophique car la promotion se fera via les registres de toutes façons plus gros que 8 bits

    Pour savoir comment se comporte votre test avec JIT, il faut faire tourner votre test en boucle, indiquer chaque résultat de mesure et observer la stabilisation (en général une dixaine de runs est suffisant)

    alternative à tenter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //a < b?
    a<0?a>b:a<b; // la logique est inversée pour les nombres <0

  11. #11
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    j'ai fait des tests et c'est bien en utilisant 0xFF que j'obtiens les meilleurs performances.

    Merci !
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    accesoirement, pour avoir une bonne idée des perfs, un coup d'oeil au code généré (language machine java) pourrait etre utile :p

  13. #13
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Euh il s'agissait pas d'une comparaison bit à bit
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  14. #14
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    alternative à tenter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //a < b?
    a<0?a>b:a<b; // la logique est inversée pour les nombres <0
    Ça ne fonctionne pas, car il faut aussi tenir compte du fait que b peut être négatif.
    Si a est positif et b négatif, b est dans ce cas plus grand que a ...

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ha ben oui, avais écrit à la va vite :p Du coup l'expression risque vite de devenir illisible

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison de deux float
    Par MysticKhal_0 dans le forum C
    Réponses: 5
    Dernier message: 14/09/2012, 01h08
  2. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  3. [langage] Comparaison de deux fichiers
    Par perlgirl dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 16h05
  4. [SYBASE] Comparaison de deux datetime
    Par paf15 dans le forum Sybase
    Réponses: 1
    Dernier message: 17/04/2005, 16h51
  5. Réponses: 5
    Dernier message: 06/10/2003, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo