Java - la Recherche de quelque chose de plus rapide que PriorityQueue

je suis à l'aide de java sur une grande quantité de données.

[j'essaie de simplifier le problème autant que possible]

En fait, j'ai une petite classe (Élément) contenant une CLÉ de type int et un double POIDS (getters et setters).

J'ai lu beaucoup de ces objets à partir d'un fichier et je dois obtenir le meilleur (le plus de poids) M objets.

En fait, je suis en utilisant un PriorityQueue avec un Comparateur écrit pour comparer deux éléments, et il fonctionne, mais il est trop lent.

Savez-vous (je sais que tu ne) de toute façon plus rapide de le faire?

Merci

  • Vous avez un profil sur ce code? Comment est votre comparateur écrit?
  • public int compare(ListElement j', ListElement j) { if(j'.getValue()-j.getValue() > 0) return 1; else return -1; }
  • Id suggérons fortement que vous le profil de votre code et de trouver exactement ce qui est la cause de votre code à exécuter plus lentement que vous le souhaitez. Avec aucun code n'est indiqué, et aucune information supplémentaire, il est difficile de répondre à cette question. Quelle partie est lent?
  • Je ne suis pas sûr si le compilateur d'optimiser automatiquement cette distance en manque de pertinence, mais si pas de faire une comparaison comme public int compare(ListElement j', ListElement j) {return (j'.getValue() >= j.getValue()) ? 1 : -1;} peut vous faire économiser un peu de temps.
  • Remarque: Vous pouvez simplifier votre comparateur de retour je.getValue()-j.getValue();
  • Comme l'a noté Tnay, sans plus d'informations de profilage, vous êtes "optimisation sans représentation" - c'est à dire l'optimisation sans savoir où votre problème est en réalité. Je recommande d'obtenir un bon profiler - j'ai utilisé YourKit dans le passé beaucoup de succès (de 500 à 800% de gains) dans le passé, mais il existe d'autres Java profileurs de là-bas.
  • À l'aide de la soustraction de mettre en œuvre un traitement de référence sur les doubles semble extrêmement risqué. Le comparateur de résultat est converti en un int, donc beaucoup (la plupart? tous?) des différences significatives entre le poids pourrait être contraint à zéro.
  • Profilage, révéler des facteurs constants qui vous ralentissent. Améliorer l'algorithme en premier.

InformationsquelleAutor BigG | 2009-08-31