Test de performances Java

Afin de valider une approche de développement pour un projet personnel, j’ai réalisé un petit test de performances en Java. Le but était de savoir quel mécanisme serait le plus rapide pour différencier des signaux d’événements. Les challengers étaient instanceof et le polymorphisme, les chaînes de caratères et les enums.

Le procédure utilisée est la suivante :

  • Remplir aléatoirement un tableau pour chaque mécanisme tout en gardant le même ordre des éléments pour tous les mécanismes
  • Tester successivement le parcours intégral de chaque tableau et évaluer la durée

Voilà les résultats du test :

Instances :
    A: 500537 - B: 500534 - C: 499560 - D: 499369 - Temps: 32
Strings (avec equals) :
    A: 500537 - B: 500534 - C: 499560 - D: 499369 - Temps: 58
Strings (avec ==) :
    A: 500537 - B: 500534 - C: 499560 - D: 499369 - Temps: 27
Enums (avec ==) :
    A: 500537 - B: 500534 - C: 499560 - D: 499369 - Temps: 26
Enums (switch) :
    A: 500537 - B: 500534 - C: 499560 - D: 499369 - Temps: 34

Les grands gagnants sont donc les enums et les chaînes de caractères évalués grâce à l’opérateur == .

Voici le code source utilisé pour le test :

import java.util.Random;

public class Test {
    public static class A { }
    public static class B { }
    public static class C { }
    public static class D { }

    public static int count = 2000000;

    public static enum TestEnum { A, B, C, D };

    public static void main(String[] args) {
        Random rng = new Random();

        Class<?>[] classValues = { A.class, B.class, C.class, D.class };
        Object[] instances = new Object[count];

        String aStr = "AAA";
        String bStr = "BBBBBB";
        String cStr = "CCCCCCCCC";
        String dStr = "DDDDDDDDDDDD";
        String[] stringValues = { "AAA", "BBBBBB", "CCCCCCCCC", "DDDDDDDDDDDD" };
        String[] strings = new String[count];

        TestEnum[] enumValues = { TestEnum.A, TestEnum.B, TestEnum.C, TestEnum.D };
        TestEnum[] enumRefs = new TestEnum[count];

        for (int i = 0; i < count; i++)
        {
            int rand = rng.nextInt(4);

            Class<?> c = classValues[rand];
            try {
                instances[i] = c.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }

            strings[i] = stringValues[rand];
            enumRefs[i] = enumValues[rand];
        }

        int a = 0, b = 0, c = 0, d = 0;
        long start = System.currentTimeMillis();
        for (Object o : instances)
        {
            if (o instanceof A)
                a++;
            else if (o instanceof B)
                b++;
            else if (o instanceof C)
                c++;
            else if (o instanceof D)
                d++;
         }
         long elapsed = System.currentTimeMillis() - start;

         System.out.println("Instances :");
         System.out.println(String.format("\tA: %d - B: %d - C: %d - D: %d - Temps: %d", a, b, c, d, elapsed));
         System.out.println();

         a = b = c = d = 0;
         start = System.currentTimeMillis();
         for (String s : strings)
         {
             if (s.equals(aStr))
                 a++;
             else if (s.equals(bStr))
                 b++;
             else if (s.equals(cStr))
                 c++;
             else if (s.equals(dStr))
                 d++;
         }
        elapsed = System.currentTimeMillis() - start;

        System.out.println("Strings (avec equals) :");
        System.out.println(String.format("\tA: %d - B: %d - C: %d - D: %d - Temps: %d", a, b, c, d, elapsed));
        System.out.println();

        a = b = c = d = 0;
        start = System.currentTimeMillis();
        for (String s : strings)
        {
            if (s == aStr)
                a++;
            else if (s == bStr)
                b++;
            else if (s == cStr)
                c++;
            else if (s == dStr)
                d++;
         }
         elapsed = System.currentTimeMillis() - start;

         System.out.println("Strings (avec ==) :");
         System.out.println(String.format("\tA: %d - B: %d - C: %d - D: %d - Temps: %d", a, b, c, d, elapsed));
         System.out.println();

         a = b = c = d = 0;
         start = System.currentTimeMillis();
         for (TestEnum e : enumRefs)
         {
             if (e == TestEnum.A)
                 a++;
             else if (e == TestEnum.B)
                 b++;
             else if (e == TestEnum.C)
                 c++;
             else if (e == TestEnum.D)
                 d++;
         }
         elapsed = System.currentTimeMillis() - start;

         System.out.println("Enums (avec ==) :");
         System.out.println(String.format("\tA: %d - B: %d - C: %d - D: %d - Temps: %d", a, b, c, d, elapsed));
         System.out.println();

         a = b = c = d = 0;
         start = System.currentTimeMillis();
         for (TestEnum e : enumRefs)
         {
             switch (e) {
                 case A:
                     a++;
                     break;
                 case B:
                     b++;
                     break;
                 case C:
                     c++;
                     break;
                 case D:
                     d++;
                     break;
             }
         }
         elapsed = System.currentTimeMillis() - start;

         System.out.println("Enums (switch) :");
         System.out.println(String.format("\tA: %d - B: %d - C: %d - D: %d - Temps: %d", a, b, c, d, elapsed));
         System.out.println();
    }
}
Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s