CHAPITRE 1 : POURQUOI LE CHRONOMÈTRE MENT

Vous avez deux programmes qui font la même chose. Lequel est le meilleur ? La réponse paraît simple : on les lance, on chronomètre, et le plus rapide gagne. C'est exactement ce qu'il ne faut pas faire.

Une expérience qui tourne mal

Deux étudiants écrivent chacun un programme qui cherche un nom dans une liste. Awa parcourt la liste du début à la fin. Bello, lui, trie d'abord puis coupe la liste en deux à chaque étape.

Ils testent sur 20 noms. Le programme d'Awa répond en 3 millisecondes, celui de Bello en 11. Awa a gagné, c'est net.

Le lendemain, le professeur teste les deux programmes sur le fichier réel de l'établissement : 40 000 étudiants. Awa met 4 secondes. Bello met 9 millisecondes. Le classement s'est inversé.

Que s'est-il passé ? Rien d'anormal. Le chronomètre n'a pas menti sur ce qu'il mesurait : il a menti sur ce qu'on croyait mesurer.

Ce que le chronomètre mesure vraiment

Quand vous chronométrez un programme, vous mesurez un mélange :

  • la méthode employée : la seule chose qui vous intéresse ;
  • la vitesse du processeur de la machine du jour ;
  • le langage, et la qualité du compilateur ;
  • ce que faisait l'ordinateur en même temps ;
  • et surtout : la taille des données du test.

Changez n'importe lequel de ces éléments, le verdict change. Une mesure qui dépend de la machine sur laquelle on la prend n'est pas une mesure, c'est une anecdote.

Le vrai problème. Awa et Bello n'ont pas comparé deux méthodes. Ils ont comparé deux méthodes sur 20 noms. Or ce qui compte, quand on choisit un algorithme, ce n'est pas comment il se comporte sur les données d'aujourd'hui, c'est comment il se comportera quand elles auront grossi.

Changer de question

La complexité abandonne la question « combien de temps ? » pour une autre, qui a une réponse stable :

Si les données doublent, le travail double-t-il aussi ? Ou bien quadruple-t-il ?

Reprenons nos deux étudiants avec cette question-là.

  • Awa parcourt toute la liste. Deux fois plus de noms, deux fois plus de comparaisons. Le travail suit la taille, proportionnellement.
  • Bello coupe en deux à chaque étape. Doubler la liste n'ajoute qu'une seule coupe de plus. Passer de 1 000 à 2 000 noms lui coûte une comparaison supplémentaire. Une.

Cette réponse-là ne dépend ni du processeur, ni du langage, ni de l'humeur du système d'exploitation. Elle est vraie sur un vieux portable comme sur un serveur. C'est elle qu'on appelle la complexité.

Pourquoi cela décide de tout

Un écart de vitesse entre deux machines, c'est un facteur 2, 5, peut-être 10. Un écart de complexité, c'est un facteur qui grandit avec les données. Sur un million d'éléments, la méthode d'Awa demande un million de comparaisons ; celle de Bello en demande vingt.

Aucun processeur ne rattrape cela. Acheter une machine dix fois plus rapide ne vous fera pas gagner le facteur 50 000 qui sépare les deux méthodes. Le choix de l'algorithme pèse plus lourd que le choix du matériel, et c'est le seul des deux qui ne coûte rien.

Ce qu'on va faire dans ce cours

Trois choses, dans cet ordre :

  1. Compter le travail d'un algorithme, en fonction de la taille des données.
  2. Classer ce compte dans une famille de croissance, avec une notation que tout le monde comprend.
  3. Décider : choisir entre deux méthodes, et savoir quand l'optimisation en vaut la peine.

À retenir

  • Le temps mesuré dépend de la machine ; la complexité, non.
  • On ne compare pas deux algorithmes sur un jeu de données, mais sur la façon dont ils réagissent quand les données grandissent.
  • Un bon algorithme sur une machine lente bat un mauvais algorithme sur une machine rapide, dès que les données deviennent sérieuses.

Exercices d'application

Exercice 1
Un programme traite 1 000 enregistrements en 2 secondes. On lui en donne 2 000 et il met 8 secondes. Que pouvez-vous en déduire ?
Voir le corrigeMasquer le corrige

Les données ont doublé et le temps a été multiplié par quatre. Le travail croît donc comme le carré de la taille : c'est le signe d'une double boucle imbriquée.

Prévision pour 4 000 enregistrements : encore quatre fois plus, soit 32 secondes. Pour 100 000, on serait à près de 6 heures.

Noter qu'une seule mesure n'aurait rien dit. C'est la comparaison entre deux tailles qui révèle la complexité.

Exercice 2
Votre collègue affirme : « j'ai optimisé, le programme est deux fois plus rapide ». Pourquoi cette phrase ne suffit-elle pas à vous rassurer ?
Voir le corrigeMasquer le corrige

Parce qu'elle ne dit pas sur quelle taille de données. Diviser le temps par deux est un gain constant : il reste de deux, que les données fassent cent ou cent millions d'éléments.

Si le programme est quadratique, ce facteur deux sera englouti dès que les données auront été multipliées par 1,5. L'optimisation utile n'est pas celle qui divise le temps par un nombre, c'est celle qui change la forme de la montée.

Cherchez avant d'ouvrir le corrige : c'est en butant sur les difficultes que l'on progresse.

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam