J'ai le code suivant en Java: J'utilise le code ci-dessus pour trier les éléments de la commande décroissante basée sur le serveurDataRate. Ici, l'ensemble de l'exemple est assez petit supposant que j'ai un ensemble d'échantillons plus grand de 100 éléments de la liste et le code devait être exécuté toutes les 5-10 secondes. Est-ce le moyen le plus rapide de trier la liste ou existe-t-il une méthode plus rapide que je ne suis pas au courant? P> P>
7 Réponses :
Ce n'est pas normal. Vérifiez votre façon de calmer.
long start = System.nanoTime(); // Sort here long time = System.nanoTime() - start; System.out.println(time / 1000000L + " Milliseconds");
100 éléments n'est pas un grand ensemble sauf si votre étape de comparaison est vraiment lourde (ne semble pas l'être comme elle). 100 éléments seront triés extrêmement em> rapidement dans n'importe quelle machine légèrement moderne. p>
Cela étant dit, je pense que votre approche est assez proche de la norme et je ne m'inquiéterais pas d'essayer d'optimiser si vous ne finissez pas cela. P>
L'optimisation précoce est le père de nombreuses visations (hypothèses étant la mère). P>
Vous pouvez utiliser la structure de données pour accomplir le tri de manière plus rapide. P>
Une BST (arbre de recherche binaire) ou Trie vous aidera à trier des données énormes de manière plus rapide. P>
Ils nécessiteront un code un peu long, mais vous aidera à courir en ligne si le jeu de données est grand. P>
Étant donné que vous ne triez pas souvent, la vitesse ne devrait pas être un problème. Même avec des milliers d'articles, Collections.sort est très rapide. p>
Avez-vous essayé votre demande de voir si la vitesse était un problème? L'optimisation prématurée n'est pas une bonne idée :) p>
Méfiez-vous d'une chose à propos de votre code: sauf si vous vous assurez que le Datariates code> de tous les serveurs ne change pas pendant le tri, vous pouvez obtenir des résultats incohérents! Vous devez synchroniser vos méthodes afin que datariates code> ne change pas tant que toute la liste est triée. P>
J'ai changé votre test et il imprime p> c'est un peu plus rapide;) p> BTW: J'ai changé les champs double code> à être int code>. P> p>
+1 Pour remarquer les doubles et pour apprendre moi 1e9 code>! Je ne savais pas que nous pourrions utiliser E code> pour les pouvoirs de dix.
@ Martijncourteaux Si vous avez aimé que j'essaie du double; Public statique Double max_value = 0x1.FFFFFFFFFFFFFP + 1023; // 1.7976931348623157E + 308 code>
@Peterlawrey Merci de m'avoir souligné cela, yup je viens de réaliser que j'utilisais un double inutilement au lieu d'Int.
Si simple et pourtant brillant!
Vous n'avez pas besoin d'utiliser des appels de méthode dans la classe, même si le champ était privé, ce qui n'est pas toujours connu - Privé restreint l'accès à une classe, non à un objet.
Étant donné que votre méthode ne fait que renvoyez l'attribut, vous pouvez utiliser l'attribut directement: p> mais le JVM peut optimiser l'appel de la fonction et dans la plage de 100 éléments, ce sera à peine mesurable. P> Votre méthode renvoie un double - pouvez-vous expliquer pourquoi? P> Avec des INTS, vous pouvez simplement faire: P> @Override
public int compare (ServerInfo o1, ServerInfo o2) {
return o2.serverDataRate - o1.serverDataRate;
}
Premièrement, votre type de variable de ServerDataRate est INT. Mais le type de retour de méthode getter est double. Lorsque le comparateur fonctionne, toutes les méthodes de GetServerDataRate convertit le champ en un format de données locataire. Si votre méthode getter renvoie le type identique que le type de champ, le temps de comparaison sera plus court.
Deuxièmement, pas besoin d'utiliser si (), dans la méthode de comparaison si votre mission est simple. Il suffit d'utiliser la soustraction. Comme ceci:
100 éléments ne sont pas un grand ensemble sauf si votre étape de comparaison est vraiment lourde (ne semble pas l'être comme elle). 100 éléments seront triés extrêmement i> rapidement dans n'importe quelle machine légèrement moderne.
Vous voulez trier 100 éléments toutes les 5-10 secondes? Ensuite, arrêtez de vous inquiéter du meilleur algorithme, car vous n'allez pas améliorer sur collections.sort d'une quantité mesurable.
Pourriez-vous utiliser un Treemap? Cela fonctionne presque comme une liste, mais conserve tous les éléments triés à tout moment.
Votre comparateur peut être simplifié à une seule ligne "Retour Double.Commare (O1.GetServerdaTarate (), O2.GetServerdaTarate ());"
@Nican j'aurais pu utiliser un Treemap (c'était en fait mon choix original), certains des taux de données auraient pu être dupliqués d'où le code ci-dessus.