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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    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 : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    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
    Membre expérimenté

    Homme Profil pro
    Ingénieur logiciel embarqué
    Inscrit en
    Juillet 2002
    Messages
    407
    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 : 407
    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.

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    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.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur logiciel embarqué
    Inscrit en
    Juillet 2002
    Messages
    407
    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 : 407
    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

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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

  9. #9
    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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    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.

+ 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