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

Collection et Stream Java Discussion :

[Format] Meilleure utilisation de MessageFormat


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut [Format] Meilleure utilisation de MessageFormat
    Bonjour,

    Je suis actuellement dans le développement d'une appli localisée.

    De manière classique, j'ai externalisé les messages (pour les logs comme pour l'utilisateur) dans des fichiers au format properties que je récupère via un ResourceBundle.

    Jusqu'à présent, j'utilisais la méthode String.format pour le formatage, mais je suis en train de reconsidérer la question pour utiliser MessageFormat.format.
    La raison de ceci est le format plus lisible des champs variables pour les non-informaticiens...

    Après quelques tests, le MessageFormat semble plus lent que le String.format (en moyenne 20% de temps en plus).

    Je cherche donc un moyen d'optimiser l'utilisation du MessageFormat.
    Après quelques tests, la seule solution que j'ai trouvée est la suivante:
    Code : 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
        // Map synchronisée et faible
        private final Map<Key<String, Locale>, MessageFormat> formatters = Collections.<Key<String, Locale>, MessageFormat> synchronizedMap(new WeakHashMap<Key<String, Locale>, MessageFormat>());
     
        public String format(final Locale locale, final String pattern, final Object... params)
        {
            // Récupération du formatteur existant
            final Key<String, Locale> key = new Key<String, Locale>(pattern, locale);
            MessageFormat formatter = formatters.get(key);
     
            // Ou création si nécessaire
            if (formatter == null)
            {
                formatter = new MessageFormat(pattern, locale);
                formatters.put(key, formatter);
            }
     
            // MessageFormat n'est pas thread-safe
            synchronized (formatter)
            {
                return formatter.format(params);
            }
        }
    Elle ne me satisfait pas complètement car la taille de la map peut très vite augmenter. Le choix d'une WeakHashMap permet de la purger régulièrement, mais cela oblige aussi à recréer régulièrement les formatteurs.

    Voyez-vous une meilleure solution?
    Celle proposée vous semble-t-elle saine?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Si tu cherches à améliorer les temps de calcul, tu explores les pistes classiques :
    • tout mettre en mémoire, malheureusement, la mémoire n'est pas infinie
    • changer de machine pour des processeurs qui "déchirent leur race", malheureusement on est souvent obligé d'utiliser la super machine achetée il y a 64 ans par l'arrière grand-père de l'actuel chef d'entreprise
    • totalement repenser l'algorithme de calcul, mais les chefs et le client ne seront pas content car ça repousse la livraison
    • soigner l'implémentation de l'algorithme, mais là encore ouille la date de livraison
    • autre... on sait jamais


    Ton approche me semble correcte.

    Avant de compliqué tout, es-tu sûr et certain d'avoir besoin d'améliorer le temps de réponse ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Merci pour ta réponse.

    Pour toutes les contraintes pro, on oublie!
    Pour ce problème là, je suis dans le cadre d'un projet perso et j'en profite pour explorer différentes pistes et trouver une solution qui soit suffisamment élégante et qui ne plombe pas trop les perfs non plus.

    Comme cette méthode est appelée, entre autres, pour écrire des logs, je pense que l'aspect perf est un peu plus important que pour une interface utilisateur. Il ne faudrait pas qu'en niveau TRACE/DEBUG, des ralentissements se fassent sentir...

    Disons que j'essaie de voir les avantages/inconvénients des deux méthodes de formatage standards (String.format & MessageFormat.format) et les meilleures façons de s'en servir.

    Donc je reste ouvert à tout commentaire!

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2014, 14h05
  2. Réponses: 6
    Dernier message: 11/02/2013, 21h10
  3. Meilleure utilisation des tableaux comme hashtable?
    Par Eric80 dans le forum Langage
    Réponses: 4
    Dernier message: 30/06/2009, 15h03
  4. enorme donnée, meilleure utilisation..
    Par {F-I} dans le forum Général Conception Web
    Réponses: 14
    Dernier message: 16/05/2008, 08h11
  5. Meilleure utilisation de sscanf
    Par Gryzzly dans le forum C
    Réponses: 4
    Dernier message: 19/12/2005, 12h33

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