Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

L’art de compresser son code

Avant tout, je précise que ce post est complètement useless.

Comment juger de la qualité d’un code ?

En jugeant de sa rapidité d’exécution, de sa consommation en mémoire, parfois de la taille de celui-ci une fois compilé, très souvent de sa lisibilité.

Le problème avec ce dernier point est que la lisibilité est très relative. J’ai d’ailleurs un avis là-dessus très différent de celui de la plus part des développeurs que je cotoie. Certaines personnes (peut-être de mauvaise foie j’en conviens) vous expliqueront que plus un code est compact, plus il est rapide à relire donc plus il est lisible.

Ceci n’est pas uniquement le fruit de ma folie et / ou d’un moment de pure délire programmatique avec Roch. Des outils comme Resharper ont par exemple certaines règles qui vont en ce sens et que beaucoup trouveront hérétiques (comme l’utilisation systématique de var).

Prenons donc un exemple. Nous voulons afficher les 10 premiers multiples d’un nombre et la somme de ceux-ci :

using System;
 
class Program
{
     static void Main(string[] args)
     {
         int i = int.Parse(Console.ReadLine());
         int s = 0;
         for (int j = 1; j < 11; j++)
         {
             int s1 = i * j;
             Console.WriteLine(s1);
             s += s1;
         }
         Console.WriteLine(s);
     } }

Ce code pourrait être condensé de la façon suivante :

using i = System.Int32;
using c = System.Console;
 
class Program
{
     static void Main(string[] args)
     {
         i i=i.Parse(c.ReadLine()),s=0,s1;
         for(i j=1;j<11;c.WriteLine((s1=j++*i)),s+=s1);
         c.WriteLine(s);
     } }

De là à dire que c’est plus lisible, il y a un pas que je ne franchirai pas… Sourire

Un point intéressant maintenant : regardons l’IL généré.

Dans le second cas, nous avons :

.locals init
(
   [0]
int32 i,
   [1]
int32 s,
   [2]
int32 s1,
   [3]
int32 j,
   [4]
bool
CS$4$0000
)
L_0000: nop
L_0001: call string [mscorlib]System.Console::ReadLine()
L_0006: call int32 [mscorlib]System.Int32::Parse(string)
L_000b:
stloc.0
L_000c:
ldc.i4.0
L_000d:
stloc.1
L_000e:
ldc.i4.1
L_000f:
stloc.3
L_0010:
br.s L_0025
L_0012:
ldloc.3
L_0013:
dup
L_0014:
ldc.i4.1
L_0015:
add
L_0016:
stloc.3
L_0017:
ldloc.0
L_0018:
mul
L_0019:
dup
L_001a:
stloc.2
L_001b:
call void [mscorlib]System.Console::WriteLine(int32)
L_0020:
nop
L_0021:
ldloc.1
L_0022:
ldloc.2
L_0023:
add
L_0024:
stloc.1
L_0025:
ldloc.3
L_0026:
ldc.i4.s 11
L_0028:
clt
L_002a:
stloc.s CS$4$0000
L_002c:
ldloc.s CS$4$0000
L_002e:
brtrue.s L_0012
L_0030:
ldloc.1
L_0031:
call void [mscorlib]System.Console::WriteLine(int32)
L_0036:
nop
L_0037:
ret

Ce qui correspond à :

int i = int.Parse(Console.ReadLine());
int s = 0;
int j = 1;
while (j < 11)
{
     int s1;
     Console.WriteLine(s1 = j++ * i);
     s += s1; } Console.WriteLine(s);
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mardi 8 mars 2011 23:09 par Matthieu MEZIL

Classé sous : ,

Commentaires

# re: L’art de compresser son code @ mardi 8 mars 2011 23:20

Hmm

"Certaines personnes (peut-être de mauvaise foie j’en conviens) vous expliqueront que plus un code est compact, plus il est rapide à relire donc plus il est lisible."

Tu veux dire que les requêtes linq de 20 lignes c'est pas terrible? :)

azra

# re: L’art de compresser son code @ mercredi 9 mars 2011 00:22

Les requêtes de 50 lignes c'est mieux :P

Tout dépend du contexte et de l'utilité d'une telle requête. Mais je ne considère pas qu'une requête LINQ soit un moyen de condenser le code.

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Microsoft Regional Director 2.0 ! par Le blog de Patrick [MVP Office 365] le 02-23-2015, 22:10

- TechDays Paris 2015: Malware unchained par Blog Technique de Romelard Fabrice le 02-12-2015, 22:58

- TechDays Paris 2015: La transformation du SI avec le Cloud Microsoft, quel sera le rôle de la DSI demain, comment le Cloud MS accompagne cette transfo... par Blog Technique de Romelard Fabrice le 02-12-2015, 22:51

- TechDays Paris 2015: L’intranet social avec Office 365 et Yammer - quelles possibilités d’intégration ? par Blog Technique de Romelard Fabrice le 02-12-2015, 22:46

- TechDays Paris 2015: Plenière jour 3 - Vers une technologie invisible et une intelligence omniprésente ? par Blog Technique de Romelard Fabrice le 02-12-2015, 10:59

- TechDays Paris 2015: Geek is in da {new} House par Blog Technique de Romelard Fabrice le 02-12-2015, 01:13

- TechDays Paris 2015: Windows Server vNext - Virtualisation et Stockage par Blog Technique de Romelard Fabrice le 02-12-2015, 00:26

- TechDays Paris 2015: Quoi de neuf dans Windows 10 ? par Blog Technique de Romelard Fabrice le 02-11-2015, 23:37

- TechDays Paris 2015: Réussir sa migration vers Office 365 en formant les uilisateurs par Blog Technique de Romelard Fabrice le 02-11-2015, 14:32

- TechDays Paris 2015: Windows 10 et PowerShell 5.0 par Blog Technique de Romelard Fabrice le 02-11-2015, 13:10