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

Langage Java Discussion :

[Math] Méthodes plus rapides que Math.pow ou .exp ?


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut [Math] Méthodes plus rapides que Math.pow ou .exp ?
    Bonjour,

    Je programme en java un algorithme de calcul assez lourd, avec des millions d'itérations sur une routine pleine de Math.pow(), Math.exp(), Math.log(), voire de Math.sin(), et mon algorithme est très lent...

    Existe-t'il en java d'autres méthodes Math plus rapides que celles de java.lang.Math, même beaucoup moins précises ?

    - Je précise que je n'ai pas besoin de la précision des variables "double", "float" me suffirait largement...

    - Au cas où, si jamais il existe des méthodes rapides spécifiques au processeur (j'ai un intel core duo 2), je suis preneur car je fais un algorithme personnel que je n'ai pas besoin de porter sur d'autres machines.

    Voire, existe-t'il quelque part des méthodes Math basées sur des tableaux de valeurs déjà calculées ?
    (il y a très longtemps, je programmais en Basic sur Atari et il y avais ce genre de fonction "lookup" déjà calculés, pour Sin et Cos)

    Je suis pas un pro du java, et je suis parfois un peu perdu avec les docs java.

    Merci d'avance pour votre aide,

    Alexandre de Toulouse

  2. #2
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    C'est une question pas évidente. Les méthodes de la classe Math sont déjà des méthodes natives pour des raisons de performances. Par contre, il existe effectivement des libraires pour améliorer les performances, tu peux regarder cette page : http://math.nist.gov/javanumerics/ (voir les libraires Colt ou Apfloat).

    Note: Il me semble que Apfloat permet de choisir la précision que l'on désire pour les calculs.

    Note 2: Ce qu'il fait savoir c'est qu'en Java c'est l'allocation de mémoire qui coute très cher. Donc si tu veux des algorithmes performances alors alloue peu de mémoire et si possible réutilise les objets déjà crées pour éviter d'en créer de nouveaux.

    Note 3: Je te conseils d'utiliser l'outil de profiling de Java. Il va te dire où se trouve le bootleneck de ton application et c'est là que tu devras mettre le paquet. Par exemple en passant la partie critique en code natif écrit en C ou C++.

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Merci de ta reponse,

    > Par contre, il existe effectivement des libraires pour améliorer
    > les performances, tu peux regarder cette page :
    > http://math.nist.gov/javanumerics/ (voir les libraires Colt ou Apfloat).
    mouai, je trouve pas vraiment là dedans, quelque chose qui, explicitement, déclare ameliorer les performances de java.lang.Math, en diminuant la precision, à moins que ça m'est échappé.

    > Note: Il me semble que Apfloat permet de choisir la précision
    > que l'on désire pour les calculs.
    Mais je lis que Apfloat est "arbitrary precision", j'imagine que c'est alors de toute façon moins performant.

    > Note 2: Ce qu'il fait savoir c'est qu'en Java c'est l'allocation de
    > mémoire qui coute très cher. Donc si tu veux des algorithmes
    > performances alors alloue peu de mémoire et si possible
    > réutilise les objets déjà crées pour éviter d'en créer de nouveaux.
    Là je comprend pas tout... en "technique de programmation java", je suis sans doute un débutant, mais je vois pas le rapport entre la mémoire de quelques valeurs(peu nombreuses, et toutes déjà définies avant la boucle critique) dans des arrays de ma class, et l'efficience des calculs...
    qu'est-ce que tu entend par "alloue peu de mémoire" ?

    > Note 3: Je te conseils d'utiliser l'outil de profiling de Java. Il va te
    > dire où se trouve le bootleneck de ton application et c'est là que
    > tu devras mettre le paquet.
    ben, en ce qui me concerne je vois bien où est le point noir de mon algorithme: c'est le coeur d'une petite boucle effectuée des millions de fois.
    Même si j'ai du mal à imaginer le rapport entre les temps de calculs des differentes fonctions:

    ---->> Combien, environ, de cycles machine pour Math.exp(), combien pour Math.log(), Math.sin(), et pour *, /,+,-, etc... le tout sur des "double". et combien de cycles machine pour *, /,+,- sur des "float" ??
    combien de fois plus vite pour une simple multiplication qu'un Math.pow() ?

    Sinon, s'il y a des tutorials pour cet "outil de profiling de Java", quelque part, peut-etre que ça me servira quand même.

    >Par exemple en passant la partie critique en code natif écrit en C ou C++.
    Là je m'arrete, je programme en java, c'est déjà pas mal, je vais pas me mettre au C juste pour une routine, même si elle est importante pour moi.

    Je vais sans doute choisir de me faire mes propres "tables lookup" pour les fonctions, dans des gros arrays, avant de commencer l'iteration de la routine.

    Merci d'avance si quelqu'un à une idée sur la question sur des "cycles machines" pour chaque calcul ou operateur... ca me permetrait de savoir quelle efficience je peux esperer gagner.

    Alexandre

  4. #4
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Mais je lis que Apfloat est "arbitrary precision", j'imagine que c'est alors de toute façon moins performant.
    J'aime pas les gens qui imaginent sans prendre le temps de regarder la bibliothèque. Je n'ai pas l'impression non plus que tu es parcouru Colt...

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    > sans prendre le temps de regarder la bibliothèque.
    > Je n'ai pas l'impression non plus que tu es parcouru Colt...
    Ben si j'ai regarder tout ça, mais j'ai peut-être juste rien compris (Enfin, y a bien un passage dans Colt qui parle des performances mais c'est pas clair pour moi). Je programme en Max/msp, et je n'utilise java que pour de l'algorithmique, quelques routines pleines de calculs, qui sont appelée depuis Max/msp, alors c'est vrai que pour les API, je suis pas trés fort. Pour avancer en java j'utilise surtout des programmes d'exemples, sinon je suis pas trés fort pour savoir comment utiliser des methodes que je connais pas, et ce qu'elles font reelement

Discussions similaires

  1. Access plus rapide que SQL server ????? (débutante)
    Par 24 faubourg dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 21/12/2005, 17h36
  2. [D7] composants plus rapides que dbExpress pour Oracle 8i
    Par Magnus dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/10/2005, 12h06
  3. Plus rapide que bresenham ?
    Par mathieu_t dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 01/06/2005, 13h28
  4. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 00h16
  5. Réponses: 8
    Dernier message: 31/10/2003, 16h21

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