Le premier numéro de calcul de plaisir

Que nous allons avoir un peu de plaisir ici à l'œuvre. Tout a commencé avec l'un des gars de la configuration d'un Hackintosh et nous nous demandions si elle était plus rapide que Windows Boîte de (presque) les mêmes caractéristiques que nous avons. Nous avons donc décidé d'écrire un petit test pour elle. Juste un simple nombre Premier de la calculatrice. Il est écrit en Java et nous dit que le temps qu'il faut pour calculer les n premiers nombres premiers.

Version optimisée ci-dessous - prend maintenant ~6.6 secondes

public class Primes {

    public static void main(String[] args) {
        int topPrime = 150000;
        int current = 2;
        int count = 0;
        int lastPrime = 2;

        long start = System.currentTimeMillis();

        while (count < topPrime) {

            boolean prime = true;

            int top = (int)Math.sqrt(current) + 1;

            for (int i = 2; i < top; i++) {
                if (current % i == 0) {
                    prime = false;
                    break;
                }
            }

            if (prime) {
                count++;
                lastPrime = current;
            }
            if (current == 2) {
             current++;
            } else {
                current = current + 2;
            }
        }

        System.out.println("Last prime = " + lastPrime);
        System.out.println("Total time = " + (double)(System.currentTimeMillis() - start) / 1000);
    } 
}

Nous ai vraiment perdu le fil de l'ensemble de la Hackintosh vs PC chose et sont simplement avoir du plaisir avec l'optimisation. Première tentative avec aucun des optimisations (le code ci-dessus a un couple) a couru autour de 52,6 min pour trouver la première 150000 nombres premiers. Cette optimisation est en cours d'exécution autour de 47,2 minutes.

Si vous voulez avoir un aller poster vos résultats, puis stick em up.

Les spécifications pour le PC je suis en cours d'exécution sur Pentium D 2.8 GHz, 2 go de RAM, Ubuntu 8.04.

Meilleure Optimisation jusqu'à présent a été la racine carrée du courant, d'abord mentionné par Jason Z.

Il y a une erreur dans votre code. Top != courant / 2, il devrait être à la racine carrée du courant. Pourrait accélérer un peu.
C'est une optimisation plutôt que d'une erreur? Merci, je vais essayer.
Parfois, d'autre blocs de ralentir beaucoup pour essayer de se débarrasser de ce trop et voir si ça aide. Évidemment, le courant est augmenté de 1 à chaque tour de boucle, donc au lieu de if..else je l'avais mis if(courant!=2) { courant++; } courant++; à sa place.
L'écriture d'un très algorithmique pour tester des OS de la performance est un peu comme écrire un poème pour tester les différentes couvertures. Au mieux, vous trouverez une différence dans la VM implémentations.
Peut-être que Java n'est pas le candidat idéal pour passer le test, mais je pense que vous pouvez comprendre l'essentiel de ce que nous essayions de faire. Peut-être un langage de plus bas niveau aurait été un meilleur choix.

OriginalL'auteur Feet | 2008-11-13