Journal : Lisaac plus rapide que le C !

Posté par Nicolas Boulay () le 24 avril 2008
0
Tout le monde s'en fout, mais cela fait des années que je suis persuadé qu'un langage de très haut niveau à plus de potentiel d'optimisation qu'un langage aussi bas niveau que le C. Et pourtant dés que l'on veut de la performance, on pense C.

C'est fait, Lisaac, un langage impératif à prototype, a plus de point que le C dans le langage shoutout. Il s'agit de microbenchmarks, dont l'algorithme est imposé.

http://shootout.alioth.debian.org/gp4/benchmark.php?test=all(...)

Cela fait un test un peu plus complet que le code mpeg2 qui servait de test.

http://isaacproject.u-strasbg.fr/li/li_benchs.html

Chapeau à Ben !

> Lire le journal (157 commentaires, moyenne: 3,4).  

Vous avez demandé le commentaire #925588.

...

Posté par Matthieu C () le 24/04/2008 à 22:17. (lien). Évalué à 3.

Heu, a part pour les arbres binnaires, il n'y a pas de grosses differences : http://shootout.alioth.debian.org/gp4/benchmark.php?test=all(...)

Et puis bon le pb de shootout, c'est que les "tests" ne sont pas forcement représentatif.

  • [^]Re: ...

    Posté par Nicolas Boulay () le 24/04/2008 à 22:22. (lien). Évalué à 2.

    "Et puis bon le pb de shootout, c'est que les "tests" ne sont pas forcement représentatif."

    C'est pas le problème du shoutout, c'est le problème des microbenchs en général par rapport à un bench applicatif.

    Mais si un langage n'est pas devant dans ce genre de cas, il a très peu de chance d'être devant dans des cas plus gros.

    [^]Re: ...

    Posté par Matthieu C () le 24/04/2008 à 22:28. (lien). Évalué à 10.

    Et puis bon le pb de shootout, c'est que les "tests" ne sont pas forcement représentatif.
    J'ai regarder le cas des arbres binnaires, et on peut voir un beau malloc dans l'implementation.
    Celui ci est appelé un certain nombre de fois (59157182).
    Un coup de profiler confirme que ce test benchmark l'allocateur memoire de la libc...

    • [^]Re: ...

      Posté par alenvers () le 25/04/2008 à 09:52. (lien). Évalué à 7.

      Effectivement, en 5 minutes, j'ai remplacé l'allocation par de la pré-allocation et les perfs sont multipliées par 10. Niveau consommation de mémoire ce n'est pas ça (mais on s'en fout ici, ça peut être réglé avec un peu plus d'effort).

      Sans optimisation :
      bash-3.2$ time ./binarytrees.gcc_run 16
      stretch tree of depth 17 check: -1
      131072 trees of depth 4 check: -131072
      32768 trees of depth 6 check: -32768
      8192 trees of depth 8 check: -8192
      2048 trees of depth 10 check: -2048
      512 trees of depth 12 check: -512
      128 trees of depth 14 check: -128
      32 trees of depth 16 check: -32
      long lived tree of depth 16 check: -1

      real 0m11.233s
      user 0m8.983s
      sys 0m0.000s

      Avec :
      bash-3.2$ /usr/bin/gcc -pipe -Wall -O3 -fomit-frame-pointer -march=pentium4 -lm binarytrees.c -o binarytrees.gcc_run
      bash-3.2$ time ./binarytrees.gcc_run 16
      stretch tree of depth 17 check: -1
      131072 trees of depth 4 check: -131072
      32768 trees of depth 6 check: -32768
      8192 trees of depth 8 check: -8192
      2048 trees of depth 10 check: -2048
      512 trees of depth 12 check: -512
      128 trees of depth 14 check: -128
      32 trees of depth 16 check: -32
      long lived tree of depth 16 check: -1

      real 0m1.235s
      user 0m0.843s
      sys 0m0.140s

      void* mem_chunks = NULL;
      char* mem_pos = NULL;
      char* mem_chunks_nbr = 0;

      void
      *my_malloc(size_t NBYTES)
      {
      char* temp;

      if (! mem_chunks)
      mem_pos = mem_chunks = malloc(NBYTES * 100000000);

      temp = mem_pos;
      mem_pos += NBYTES;
      mem_chunks_nbr++;

      return temp;
      }

      void
      *my_free(void *APTR)
      {
      if (! --mem_chunks_nbr) {
      free(mem_chunks);
      mem_chunks = NULL;
      }

      return NULL;
      }

      • [^]Re: ...

        Posté par alenvers () le 25/04/2008 à 12:21. (lien). Évalué à 2.

        Bug :
        s/char* mem_chunks_nbr = 0;/int mem_chunks_nbr = 0;/

    [^]Re: ...

    Posté par Philippe Fremy (page perso, ) le 25/04/2008 à 10:25. (lien). Évalué à 3.

    Les tests sont intéressants, même si il faut les prendre avec des pincettes. Ca donne un aperçu du potentiel.

    Un autre indice que le C n'est pas la panacée est arrivé par python. La version .NET de python (IronPython) est arrivé soit à égalité, soit a été légèrement plus rapide que la version en C de l'interpréteur python sur une série de benchmark officiels.

    Ca veut bien dire que on peut faire plus vite que du C. Je pense que c'est vrai en particulier sur des projets complexes, où le compilateur peut prendre une décision plus informée que l'être humain.

    Sinon pour lisaac, si je me souviens bien, lisaac analyse l'ensemble du programme pour en optimiser tous ses aspects. Ca veut dire que sur un petit programme, il peut enlever des contraintes que le programmeur en C garderait. Après, sur un très gros programme, on peut imaginer qu'il pourra enlever beaucoup moins de contraintes et donc aura plus de mal à générer du code performant. Ou peut-être au contraire, il découvrira des optimisations inaperçues à la vue du programmeur.

    L'absence de notion de bibliothèque est aussi un problème. Si j'ai bien compris les dernières explications sur le sujet, la notion de bibliothèque va justement réduire les capacités d'optimisation de lissac, puisque celui-ci ne pourra pas optimiser la partie du code externe.

    Si tout le monde migrait a lissac, ce serait un peu comme passer à une gentoo en stage 1. Un truc de geek quoi.

    • [^]Re: ...

      Posté par Mildred (Jabber id, page perso, ) le 25/04/2008 à 12:19. (lien). Évalué à 3.

      Le système de bibliothèques sur lequel je travaille n'enlève rien aux optimisations ... Car ce sont des bibliothèques sources (il n'est pas encore possible de compiler les bibliothèques séparément).
      Reste à soumettre ça dans le tronc principal :)

      Sinon, pour l'avenir, on peut très bien imaginer des modules binaires (donc compilation séparée et possibilité de chargement runtime) qui utilise une interface bien définie quelque part. Et dans ce cas, il paraît évident que certaines optimisations vont partir. Mais comme en général on se débrouille pour avoir une interface minimale entre des modules, ça ne devrait pas être gênant je pense.