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 :

Java et pointeurs


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 Java et pointeurs
    Bonjour,

    je travaille actuellement à la traduction d'un code C++ ultra rapide en java. Pour que ce dernier soit ultra rapide, on n'utilise QUE des pointeurs (cf. le code qui suit).

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    int function(uint8_t *imageIn, uint8_t *imageOut, int imageWidth, int imageHeight, int size)
    {
      uint8_t *in,*out,*aux;
      uint8_t *inLeft,*inRight,*outLeft,*outRight; 
      uint8_t max;
     
      in =  (uint8_t *)imageIn;
      out = (uint8_t *)imageOut;
    ...
      /* Computation */
      /* Row by row */
      for (j=0; j<imageHeight; j++)
        {
          inLeft = in+(j*imageWidth);
          outLeft = out+(j*imageWidth);
          inRight = inLeft+imageWidthMinus1;
          outRight = outLeft+imageWidthMinus1;
     
          max = *inLeft;
          histo[max]++;
          for (i=0; i<middle; i++) 
       	{
    	  inLeft++; 
    	  histo[*inLeft]++;
    	  if (*inLeft > max) { max = *inLeft; }
    	}
          *outLeft = max;
    Bref, une jolie horreur très rapide à base de pointeurs :-(
    Mais le souci, c'est que si je traduis/modifie ces pointeurs par des valeurs/indices de tableau, on double le temps d'exécution (on a fait le test en C++).
    Par exemple :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
          max = in[inLeft];
          histo[max]++;
          for (i=0; i<middle; i++) 
       	{
    	  inLeft++; 
    	  histo[in[inLeft]]++;
    	  if (in[inLeft] > max) { max = in[inLeft]; }
    	}
          out[outLeft] = max;

    Le souci c'est qu'en Java, il me semble que je n'ai pas le choix et je dois travailler avec les indices comme le dernier petit morceau de code.

    Je pose la question à tout hasard (mais sans conviction je dois l'avouer) : y aurait il une solution pour avoir le même type de code (dans le sens rapidité) que le premier exemple que j'ai montré au dessus ? Donc un code qui travaillerai avec des pointeurs que l'on fait glisser/pointer sur les éléments du tableau ?

    Merci par avance...
    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
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et avec ceci, vous doublez toujours votre temps de calcul?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          max = in[inLeft];
          histo[max]++;
          for (i=0; i<middle; i++) 
       	{
    	  inLeft++;
              index  = in[inLeft]; 
    	  histo[index]++;
    	  if (index > max) { max = index; }
    	}
          out[outLeft] = max;
    Ce ne sont pas les pointeur la source de vitesse de votre programme mais le fait qu'on évite au maximum les additions cachées (qu'on a quand on doit faire base+index dans un tableau)

    Et de toutes façons, ca n'a pas de sens de vouloir optimiser un code en C++ pour le porter ensuite en java. Il faut directement l'optimiser en java, les principe de fonctionnement ne sont pas du tout les mêmes. Un tableau, en java, par exemple, pour tout accès vous avez des vérification de taille, ce que vous n'avez pas en C, ce qui vous coute inévitablement en termes de temps de calcul (à chaque appel onvérifie qu'on ne dépasse pas l'index)

  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
    C'est ce que j'ai fait dans mon code ! Je n'ai marqué là qu'un exemple.

    Pointer sur les valeurs permet justement en C++ d'éviter les additions inutiles.
    Le souci, c'est que nous ne les avons pas en Java et c'est un peu dommage dans le genre de situations qui m'intéressent en ce moment :-(

    En parlant de vérifications, est ce qu'il n'y a pas une solution pour les éviter ?
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pas en langage Java. Mais on peut imaginer passer par du JNI pour faire ces traitements en C, ou bien enlever les vérifications du code .class compilé.

    Le langage Java garantit qu'une lecture ou écriture en dépassement de buffer est impossible (lire impossible, jamais, sous aucune condition, pas d'exception d'aucune sorte quoi qu'on imagine.)
    C'est justement à cause de cette vérification.
    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 : 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
    enlever les vérifications du code .class compilé.
    Mmm... intéressant... comment fait on pour supprimer cela ?

    Peut on le faire pour une partie seulement des classes ? Car j'ai des traitements dont je suis sûr et que je veux optimiser au maximum, donc supprimer les vérifications dans ces classes permettrait un très grand gain de temps.
    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
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu ne peux pas, c'est la jvm et non le code compilé qui fait la vérification !

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

Discussions similaires

  1. Difference entre pointeur REF et pointeur en Java ou C++
    Par lemagicien dans le forum Oracle
    Réponses: 4
    Dernier message: 21/03/2007, 16h01
  2. [info] taille des adresses des pointeurs Java
    Par TabrisLeFol dans le forum Général Java
    Réponses: 11
    Dernier message: 14/02/2006, 13h24
  3. [Language]Equivalent Java des pointeurs de fonctions du C/C++
    Par Thierry Chappuis dans le forum Langage
    Réponses: 1
    Dernier message: 25/11/2005, 15h14
  4. Pointeur c/c++ et java
    Par vincent0 dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 03h40
  5. [debutant] correspondance JAVA C++ pour pointeur de fonction
    Par davidoff_tls dans le forum Langage
    Réponses: 7
    Dernier message: 15/04/2004, 09h13

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