En 2018, j'ai pratiqué Advent of Code (vous pouvez regarder les streams de mes solutions ici ). Chaque jour en décembre, ils signalent un petit problÚme, et vous devez écrire un programme qui le résout. Cela prend généralement de quelques minutes à quelques heures et est assez amusant, je vous recommande de l'essayer. Lorsqu'une tùche est terminée, elle est toujours disponible, pas seulement en décembre.
J'ai rĂ©alisĂ© qu'il existe deux types de solutions : celles qui peuvent calculer la rĂ©ponse en quelques millisecondes et celles qui prendront la rĂ©ponse pendant plusieurs annĂ©es. Si vous obtenez la deuxiĂšme option, vous faites quelque chose de mal. Il ne sert Ă rien d'attendre, mĂȘme si, techniquement, cela pourrait aussi ĂȘtre correct.
Une autre observation intĂ©ressante est que le matĂ©riel que vous utilisez pour lancer n'a pas d'importance. Si la solution est rapide, elle le sera Ă la fois sur l'ordinateur portable et sur le poste de travail pompĂ©. Bien sĂ»r, cela pourrait ĂȘtre deux ou trois fois plus lent, mais la diffĂ©rence se situera entre 10ms et 30ms. Vous obtiendrez votre rĂ©ponse de toute façon, donc cela n'a pas vraiment d'importance.
En revanche, si la solution est lente, vous pouvez utiliser n'importe quelle puissance de traitement, et ce ne sera toujours pas suffisant. Cela pourrait réduire la durée d'exécution de trois ans (sur un ordinateur portable) à un an (sur l'ordinateur le plus puissant que je puisse construire). Quelle est la différence? C'est trop long de toute façon.
Passons maintenant au logiciel. Il est facile de qualifier les solutions d'Advent Of Code de mauvaises lorsqu'elles sont lentes, car nous savons qu'une solution rapide doit exister. Avec de vrais problĂšmes, personne ne le garantit.
Sauf dans certains cas.
Assez souvent, en fait.
En fait, je dirais presque toujours.
Voyons voir. J'ai une bibliothĂšque appelĂ©e Datascript . C'est une structure de donnĂ©es/base de donnĂ©es persistante et il se trouve qu'elle est implĂ©mentĂ©e pour deux plateformes : JS et JVM. De plus, il est en fait Ă©crit en Clojure et la majeure partie de sa base de code est utilisĂ©e par les deux plates-formes. Cela signifie que nous savons que les deux versions font toujours la mĂȘme chose. Il existe une petite couche qui couvre les dĂ©tails spĂ©cifiques Ă la plate-forme tels que les types de donnĂ©es et la bibliothĂšque standard, mais le reste est gĂ©nĂ©rique. Ce n'est pas qu'une version est l'originale et que l'autre est un port inefficace. Ils jouent tous les deux au mĂȘme jeu.
Vous pensez peut-ĂȘtre que s'ils se comportent de la mĂȘme maniĂšre, leurs performances devraient ĂȘtre les mĂȘmes, n'est-ce pas ? Il serait logique de le penser.
Jetons un coup d'Ćil au temps rĂ©el nĂ©cessaire pour compiler la base de code et exĂ©cuter la suite complĂšte de tests d'intĂ©gration. On parle d'une base de code qui compte un peu plus de 9000 LOCs, dont 4000 sont des tests :
Clojure 1.10 sur JVM :
- Temps de démarrage REPL : 1,5 seconde
- Temps de compilation : 6,5 secondes
- Temps de test : 0,45 s
ClojureScript 1.10.439 avec compilation avancée :
- Temps de compilation : 78 secondes
- Durée des tests : 1 seconde
ClojureScript 1.10.439 sans compilation Google Close :
- Temps de compilation : 24 secondes
- Durée des tests : 1,3 seconde
Alors que nous disent ces chiffres ? Fondamentalement, vous pouvez prendre environ 8 secondes, 24 secondes ou 78 secondes pour traiter le mĂȘme code. Le choix t'appartient. De plus, en exĂ©cutant le mĂȘme programme, vous pouvez obtenir le rĂ©sultat en une demi-seconde, une seconde ou presque une seconde et demie.
« Mais attendez, Tonsky, ils ne peuvent pas ĂȘtre comparĂ©s ! Ce sont deux grandes diffĂ©rences ! Ils sont conçus pour faire des choses complĂštement diffĂ©rentes ! L'un d'eux fonctionne dans un navigateur !"
Vous pouvez bien sĂ»r obtenir des rĂ©sultats. Permettez-moi de vous rappeler que nous compilons le mĂȘme code, conçu pour faire la mĂȘme chose, utilisant les mĂȘmes algorithmes et fonctionnant sur le mĂȘme matĂ©riel. Le rĂ©sultat final est le mĂȘme dans les deux cas : vous obtenez une rĂ©ponse Ă votre requĂȘte dans le data log en peu de temps ou sur une longue pĂ©riode. Soit vous passez la moitiĂ© de votre journĂ©e Ă attendre le compilateur, soit vous la passez Ă jouer au REPL, Ă construire quelque chose.
Que font les compilateurs ClojureScript / Google Closure depuis si longtemps ? Ils vous font perdre votre temps, c'est quoi. Bien sĂ»r, personne n'est Ă blĂąmer, mais en fin de compte, toute la dĂ©cision est tout simplement erronĂ©e. Nous pouvons faire la mĂȘme chose beaucoup plus rapidement, nous avons des preuves, nous avons les moyens de le faire, mais il se trouve que ce n'est pas le cas. Mais nous pourrions. Si tu voulais. Cet Ă©norme surcoĂ»t que vous payez, vous le payez en vain. Vous n'obtenez rien d'autre de JS que de doubler le temps d'exĂ©cution et les temps de construction astronomiques.
La mĂȘme chose est vraie pour toutes les langues avec des temps de construction terriblement longs. Ce n'est pas qu'ils ne pouvaient pas ĂȘtre plus rapides. Ils choisissent simplement de ne pas le faire. Un programme C++ ou Rust prend-il trop de temps Ă compiler ? Eh bien, OCaml pourrait probablement compiler un programme Ă©quivalent en moins d'une seconde. Et ce sera toujours aussi rapide au niveau de la voiture.
« Wow, wow, ralentissez ! C'est encore plus injuste ! Maintenant, ce ne sont pas seulement deux grandes différences, maintenant c'est comme les brosses à dents et les vaisseaux spatiaux. Vous ignorez complÚtement ce que chaque langue fournit. Il y a une raison pour laquelle ils passent autant de temps à compiler, tu sais ?"
Je connais. Mais encore, je pense que vous pouvez les comparer. AprÚs tout, ce sont tous des langages à usage général, et en fin de compte, ce qui compte, c'est de savoir si vous avez un programme de travail sous la main et pouvez fournir une réponse dans un délai raisonnable. Peu importe comment le développeur est arrivé là . Vous pouvez vous calmer en pensant que c'est le cas, mais personne ne s'en soucie.
Imaginez : un avion vole de Moscou Ă Novossibirsk, le cĆur de la SibĂ©rie, qui parcourt 2 800 kilomĂštres en 4 heures. Il y a aussi un train qui parcourt la mĂȘme distance en trois jours. Il n'y a pas de douche dans le train, de la mauvaise nourriture, des lits sur lesquels on ne peut pas dormir. Et un avion est un avion moderne et confortable. Lequel choisiriez-vous? Le mĂȘme prix. La seule diffĂ©rence est votre confort et votre temps.
Si nous prenons cela comme une mĂ©taphore du dĂ©veloppement logiciel, vous seriez surpris que les programmeurs prennent volontiers le train. Ils soutiennent mĂȘme jusqu'Ă l'enrouement qu'il existe des raisons irrĂ©futables de choisir un train. Non, cela ne les dĂ©range pas si le compilateur prend le temps de "travailler". Il existe cependant des moyens plus rapides d'arriver Ă la mĂȘme destination. Il est facile de se perdre lorsqu'on se dispute sur des dĂ©tails, mais rappelez-vous : nous nous retrouvons tous au mĂȘme endroit , quelle que soit la langue que nous parlons.
Navigateurs ? La mĂȘme histoire. HTML est un moyen plutĂŽt inefficace de positionner les pixels sur l'Ă©cran. Un ordinateur capable d'afficher des millions de polygones dans un cadre peut avoir du mal Ă charger une page Web. Comme pour les solutions Advent of Code, cela ne dĂ©pend pas de la puissance de votre ordinateur. Et mĂȘme un code Web hautement optimisĂ© basĂ© sur Canvas et WebAssembly ( Figma ) fait tourner mes fans de Macbook dans un silence complet lorsque je lance mon propre Sketch.
- *tapotements sur la couverture *Ce PC est capable de faire tourner Crysis 3 en 4K Ă 144fps.
- Mais peut-il faire tourner Atom ?
Il y a simplement des limites Ă ce que peut aller cette mauvaise dĂ©cision. Les Ă©diteurs de texte sur Electron ne peuvent pas redimensionner la fenĂȘtre en temps rĂ©el et s'affaisser dans les cadres lorsque vous dĂ©placez simplement le curseur. Slack sur l'iMac Pro sera aussi lent et gourmand en mĂ©moire que sur un Macbook 12 pouces.
L'ensemble de la dĂ©cision, la "pile Web", est gĂ©nĂ©ralement erronĂ©e . La mĂȘme chose pourrait ĂȘtre faite plus rapidement et plus efficacement - il y a tellement de potentiel gaspillĂ©. Il est temps de l'admettre et de recommencer. Il existe des Ă©diteurs de texte rapides et des programmes de communication qui sont facilement disponibles mĂȘme pour les netbooks les plus faibles.
Je peux continuer encore et encore. Gardez à l'esprit ceci : pensez à ce que vous en retirez. Le problÚme et les ressources dépensées sont-ils comparables ? Il est facile de trouver des excuses pour expliquer pourquoi les choses sont comme elles sont. Ils sont probablement tous valables, mais ce sont des excuses. Nous savons que des programmes plus rapides sont possibles et que tout le reste va mal.