Un développeur fait tenir un univers de fractales dans 4096 octets
Optimise-t-on encore suffisamment les codes ?

Le , par Gordon Fowler, Expert éminent sénior
A force de voir des effets spéciaux à plusieurs millions de dollars, on en oublierait presque que la vraie performance, celle qui suscite l’enthousiasme, réside aussi dans la capacité de faire plus avec moins. Beaucoup moins.

C’est une des leçons que nous rappelle un développeur qui vient de réaliser un véritable exploit en faisant tenir un monde de fractale dans un fichier de… 4096 octets.

Réalisé dans le cadre du concours Assembly 2012 (qu’il a gagné), le résultat est une scène baptisée Hartverdrahtet tout simplement hallucinante (à regarder en HD et en plein écran bien sûr).



Son auteur, Akronyme Analogiker, a passé deux mois à développer et surtout à optimiser le code avec des outils comme le compresseur Shade Minifier.

En visionnant cette démo, un ami a d'ailleurs eu une réflexion intéressante sur cette partie du travail. Pour lui, l'augmentation des capacités du hardware ferait que de plus en plus de développeurs ne se donneraient plus vraiment la peine d'optimiser leurs codes. « Du coup les programmes deviennent proportionnellement plus lents qu'avant ».

Quoiqu’il en soit, ces « 4k » de Hartverdrahtet prouvent que certains s’en préoccupent encore et illustrent à merveille cet adage anglo-saxon : « less is more ».

Source : Page du projet

Et vous ?

Que pensez-vous de cette démo d’un univers de fractales dans un fichier de 4k ?

Les développeurs se donnent-ils encore la peine d'optimiser leur code ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de sybil sybil - Inactif http://www.developpez.com
le 03/06/2012 à 9:39
Il faut pas oublier que minimiser son code doit aller de pair a le rendre plus rapide, sinon a quoi bon. ex:

ex.1
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    err = allocate_foo(); 
        if (!err) { 
                err = allocate_bar(); 
                if (!err) { 
                        err = allocate_baz(); 
                        if (!err) { 
                                ... 
                        } else { 
                                deallocate_bar(); 
                                deallocate_foo(); 
                        } 
                } else 
                        deallocate_foo(); 
        } 
        return err;
ex.2
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    err = allocate_foo(); 
        if (err) 
                return err; 
        err = allocate_bar(); 
        if (err) { 
                deallocate_foo(); 
                return err; 
        } 
        err = allocate_baz(); 
        if (err) { 
                deallocate_bar(); 
                deallocate_foo(); 
                return err; 
        }

ex.3

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 err = allocate_foo(); 
        if (err) 
                goto out; 
        err = allocate_bar(); 
        if (err) 
                goto out1; 
        err = allocate_baz(); 
        if (err) 
                goto out2; 
        ... 
 
out2: 
        deallocate_bar(); 
out1: 
        deallocate_foo(); 
out: 
        return err;

l'exemple 3 est le plus clair de lecture et le plus rapide a l'execution.
Avatar de Paul TOTH Paul TOTH - Expert éminent sénior http://www.developpez.com
le 03/06/2012 à 11:01
Citation Envoyé par sybil  Voir le message
l'exemple 3 est le plus clair de lecture et le plus rapide a l'execution.

je n'en suis pas convaincu...les goto deviennent totalement illisibles quand le label est très éloigné et à vu de nez je dirais que tes trois exemples ont des temps d'exécution similaires...tu évites juste une redondance de code qui n'affecte en rien le temps d'exécution, il est même parfois recommandé de dérouler les boucles pour rendre le code plus rapide (sauf si la boucle tient dans le cache d'instructions du CPU) :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
 
{ 
  int tab[5]; 
// plus lent 
  for (int i = 0; i < 5; i++) 
   tab[i] := i; 
// plus rapide 
  tab[0] = 0; 
  tab[1] = 1; 
  tab[2] = 2; 
  tab[3] = 3; 
  tab[4] = 4; 
}
Avatar de MiaowZedong MiaowZedong - Membre émérite http://www.developpez.com
le 03/06/2012 à 11:18
Normalement, un bon compilateur optimisant rend inutile l'utilisation du Goto dans les sources pour la performance, le compilateur se chargeant de placer des Goto là où c'est pertinent dans le code machine.

N'oublions pas que le code machine executé n'est pas forcement le même que le code source écrit, et qu'une optimisation pour un language/compilateur peut être inutile, voire contre-productive pour un autre language/compilateur.

À titre d'exemple, dans certains language la recursion est à fuir comme la peste car elle peut entrainer un dépassement mémoire. Dans d'autres, une recursion peut être infinie sans prendre un octet de plus....
Avatar de Paul TOTH Paul TOTH - Expert éminent sénior http://www.developpez.com
le 03/06/2012 à 12:30
Citation Envoyé par MiaowZedong  Voir le message
Normalement, un bon compilateur optimisant rend inutile l'utilisation du Goto dans les sources pour la performance, le compilateur se chargeant de placer des Goto là où c'est pertinent dans le code machine.

N'oublions pas que le code machine executé n'est pas forcement le même que le code source écrit, et qu'une optimisation pour un language/compilateur peut être inutile, voire contre-productive pour un autre language/compilateur.

À titre d'exemple, dans certains language la recursion est à fuir comme la peste car elle peut entrainer un dépassement mémoire. Dans d'autres, une recursion peut être infinie sans prendre un octet de plus....

quel langage permet la récursivité infinie ?!
Avatar de MiaowZedong MiaowZedong - Membre émérite http://www.developpez.com
le 03/06/2012 à 13:21
Citation Envoyé par Paul TOTH  Voir le message
quel langage permet la récursivité infinie ?!

La plupart des languages fonctionnels; il n'y a pas d'application que je sache, mais c'est théoriquement possible.

E.g.
Code : Sélectionner tout
1
2
3
 
(defun (useless foo) 
  (useless (- foo 1) )
Bon, ce n'est pas vraiment infini parce que tu finis par avoir un int overflow. PAr contre, le coût en memoire et en place dans le stack est constant si la recursion est proprement gérée.

Par contre, la même chose en C te crée une nouvelle addresse sur le stack à chaque appel, donc stack overflow rapide. Edit: sauf si ton compilateur réécrit la fonction pour que ce soit une boucle (un while(true) par exemple).
Avatar de LLB LLB - Membre expérimenté http://www.developpez.com
le 03/06/2012 à 13:54
Citation Envoyé par Paul TOTH  Voir le message
quel langage permet la récursivité infinie ?!

La plupart des langages avec un compilateur correct (tail call optimization - l'appel de fonction peut être remplacé par un simple jump dans certains cas). C'est le cas de tous les compilos C et C++ que je connais par exemple. MiaowZedong : sur ce point, il n'y a pas de vraie différence entre les langages fonctionnels et les autres (si ce n'est qu'on s'en sert plus souvent en Lisp qu'en C).

Il faut pas oublier que minimiser son code doit aller de pair a le rendre plus rapide, sinon a quoi bon.

On parlait de démos en 4k ici. Les développeurs cherchent à réduire la taille du code (après compilation et compression), quitte à perdre en performance, quitte à utiliser un algo plus lent. Dans les démos en 64k, c'est très différent : il y a la place de coder les algos optimaux. Ton exemple est très mauvais : il ne donne d'amélioration notable ni en lisibilité, ni en taille de code, ni en performance (il faudrait utiliser un profiler pour le vérifier).
Quant à dérouler une boucle, il vaut mieux laisser le compilateur le faire (sauf éventuellement après profiling, si on a déterminé que c'était important). Le compilateur sait souvent mieux que le développeur si ça vaut le coup ou non.
Avatar de Paul TOTH Paul TOTH - Expert éminent sénior http://www.developpez.com
le 03/06/2012 à 13:56
ok mais dans ce cas c'est une Récursion terminale qui n'est qu'une manière d'écrire une simple itération.
Avatar de yohannc yohannc - Membre actif http://www.developpez.com
le 13/06/2012 à 19:10
Citation Envoyé par LLB  Voir le message
Et que penses-tu de ça ?
http://www.developpez.net/forums/d12...lixs-workshop/ (démo en 64k avec des dizaines de textures, modèles 3D, etc.)

J'ai regardé ll
Avatar de yohannc yohannc - Membre actif http://www.developpez.com
le 13/06/2012 à 19:17
Citation Envoyé par LLB  Voir le message
Et que penses-tu de ça ?
http://www.developpez.net/forums/d12...lixs-workshop/ (démo en 64k avec des dizaines de textures, modèles 3D, etc.)

J'ai regardé la vidéo sur youtube (les 2 exe de l'archives se supprimaient tout seul, considérés comme des virus j'imagine).
Je dirais que c'est pas mal. Comparé à kkrieger, j'ai bien aimé dans kkrieger le côté interactif et les jolies textures, par contre sur celle là il y a plus d'objets, ça semble moins "carré" et la taille de la démo est plus petite aussi. Disons que les 2 sont plutôt bien réussies.
Avatar de nnorm0145 nnorm0145 - Nouveau Candidat au Club http://www.developpez.com
le 23/08/2012 à 22:53
petite correction : c'étais pas à l'Assembly c'étais à la Revision 2012 (j'y étais)
Avatar de wax78 wax78 - Modérateur http://www.developpez.com
le 23/08/2012 à 23:15
Citation Envoyé par yohannc  Voir le message
(les 2 exe de l'archives se supprimaient tout seul, considérés comme des virus j'imagine).

A cause des "unpackers" qui décompresse l'archive ça je pense, a tort mais bon...
Offres d'emploi IT
Freelances pour developpement Robot de trading en C#
Scyware - Tunisie - Partout
Développeur php drupal #software #backend
MATIERE GRISE - Ile de France - Paris (75000)
Développeur php junior h/f
Linagora - Provence Alpes Côte d'Azur - Marseille (13000)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Accueil