IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Les langages Python et AWK sont juste recommandables pour leur rapidité, Go et Rust pour leur rapidité et leur fiabilité,
Selon Ben Hoyt, Ingénieur logiciel chez Canonical

Le , par Bruno

44PARTAGES

8  0 
Ben Hoyt, Ingénieur logiciel chez Canonical, a publié sur son blog les résultats d’une expérience qu’il a menée dans le but d’évaluer certains langages de programmation. L’ingénieur logiciel qui a précédemment occupé des postes de responsabilité dans le secteur du génie logiciel a sur un cas d’école comparer les performances des langages Python, Go, C++, C, AWK, Forth et Rust. Grâce à un programme qui compte les fréquences des mots à partir de l'entrée standard, puis les affiche avec leurs fréquences, en commençant par les plus fréquents, Ben Hoyt est arrivé à la conclusion suivante : si vous avez juste besoin d'une solution rapide (ce qui est probable), Python et AWK sont recommandables, alors que Go et Rust sont recommandables pour les développeurs qui désirent avoir des solutions rapides et fiables.

Pour Ben Hoyt, écrire un programme ou un algorithme qui compte les fréquences des mots à partir de l'entrée standard, puis les affiche avec leur fréquence, en commençant par les plus fréquents est une bonne question pour un candidat à un poste de programmeur lors d’un entretien d’embauche. Pour lui, contrairement aux questions sur les arbres binaires par exemple, un aspirant au poste de programmeur pourrait être appelé à écrire des scripts de ce type dans la vie réelle et cela permettra d’évaluer sa compréhension des notions d’entrée/sortie de fichiers, des tables de hachage, et l’utilisation de la fonction de tri.


« Une fois que le candidat a une solution de base, vous pouvez l’orienter dans toutes sortes de directions : qu'en est-il des majuscules ? De la ponctuation ? Comment ordonne-t-il deux mots ayant la même fréquence ? Quel est le goulot d'étranglement en termes de performances ? Comment se comporte-t-il en termes de big-O ? Quelle est l'utilisation de la mémoire ? En gros, combien de temps votre programme prendrait-il pour traiter un fichier de 1 Go ? Votre solution fonctionnerait-elle encore pour 1 To ? etc. Vous pouvez aussi vous orienter vers le "génie logiciel" et parler de la gestion des erreurs, de la testabilité, de la transformation en un utilitaire de ligne de commande renforcé », a déclaré Ben Hoyt.

Une solution de base lit le fichier ligne par ligne, le convertit en minuscules, divise chaque ligne en mots et compte les fréquences dans une table de hachage. Une fois cette opération terminée, elle convertit la table de hachage en une liste de paires mot/compte, effectue un tri par compte (le plus grand en premier) et affiche. Pour la petite histoire, raconté par Ben, en 1986, Jon Bentley a demandé à Donald Knuth d'apporter une solution à ce problème, et il a produit un chef-d'œuvre Knuthien exquis de dix pages. Doug McIlroy (l'inventeur des pipelines Unix) lui a répondu par une version en une ligne du shell Unix utilisant tr, sort et uniq.

« Je décris un problème d'interview simple (compter les fréquences de mots uniques), je le résous dans différents langages, et je compare les performances entre elles. Pour chaque langage, j'ai inclus une solution simple et idiomatique ainsi qu'une approche plus optimisée via le profilage », a indiqué Ben Hoyt sur son blog.

Énoncé du problème et contraintes

Écrire en langage Python, Go, C++, C, AWK, Forth et Rust un programme qui compte les fréquences des mots. Chaque programme doit lire l'entrée standard et imprimer les fréquences de mots uniques, séparés par des espaces, dans l'ordre des plus fréquents au moins fréquent. Par exemple, avec cette entrée :

The foo the foo the
defenestration the


Le programme doit afficher ce qui suit :

the 4
foo 2
defenestration 1


Pour avoir des solutions simples et cohérentes, voici, ci-dessous, la liste de contraintes à prendre en compte :

  • threading : il doit s'exécuter dans un seul thread sur une seule machine ;
  • mots : tout ce qui est séparé par un espace, la ponctuation étant ignorée ;
  • Stdlib : utiliser uniquement les fonctions de la bibliothèque standard du langage ;
  • hachage : ne pas rouler notre propre table de hachage (à l'exception de la version C optimisée) ;
  • ordre : si la fréquence de deux mots est la même, leur ordre dans le résultat n'a pas d'importance ;
  • ASCII : il n'y a pas de problème à ne supporter que l'ASCII pour la gestion des espaces et des minuscules ;
  • fiable : même pour les variantes optimisées, ne pas utiliser des fonctionnalités de langage non fiables, et ne pas descendre en assembleur ;
  • la casse : le programme doit normaliser les mots en minuscules, donc "The the THE" doit apparaître comme "the 3" dans la sortie ;
  • texte : suppose que le fichier d'entrée est du texte dans une langue réelle et non un texte plein de mots uniques et aléatoires, avec des lignes de longueur "raisonnable". Plus courtes que la taille du tampon ;
  • mémoire : la mise en mémoire tampon ligne par ligne est acceptable, ou par morceaux avec une taille maximale de 64 KB. Ceci dit, il n'y a pas de problème à garder l'ensemble de la carte du nombre de mots en mémoire.

Le fichier d'entrée utilisé par Ben est un extrait de texte de King James Bible, concaténé dix fois. Les guillemets intelligents ont été remplacés par le caractère guillemet ASCII et l’utilitaire cat a été utilisé pour le multiplier par dix afin d'obtenir le fichier d'entrée de référence de 43 Mo.

Résultats des performances et enseignements

Ben a indiqué avoir exécuté chaque test cinq fois et a pris à chaque fois le temps minimum comme résultat. Les résultats présentés sur l’image ci-dessous prennent en compte la contribution apportée par les lecteurs. Les temps d’exécution sont en secondes, donc plus ils sont bas, mieux c'est, et la liste est ordonnée par le temps d'exécution de la version simple, la plus rapide en premier.


Au terme de l’expérience, Ben Hoyt est arrivé à la conclusion selon laquelle, les langages Python et AWK sont juste recommandables pour leur rapidité, Go et Rust sont recommandable pour les développeurs qui désirent avoir des solutions rapides et fiables. Cependant, en mars de l’année dernière, une étude réalisée par des chercheurs portugais a révélé que le langage C se positionne comme le langage de programmation le plus performant en termes de temps d’exécution et de faible consommation d’énergie (du CPU et de la RAM).

Source : BEN HOYT

Et vous ?

Que pensez-vous des conclusions de Ben Hoyt ? Pertinentes ou pas ?

Quel langage de programmation appréciez-vous ? Pourquoi ?

Si vous deviez changer pour un autre langage, lequel utiliseriez-vous ? Pourquoi ?

Que pensez-vous de l'exercice proposé par Ben Hoyt pour un entretien d'embauche ?

Quel est votre avis sur les performances des différents langages de programmation évalués ?

Voir aussi :

Recrutement IT : il crée un faux langage de programmation afin d'éliminer les candidats qui mentent sur leur CV, et cela a bien fonctionné

Le langage C ne sera-t-il jamais battu en termes de rapidité d'exécution et de faible consommation d'énergie ? Voici les résultats d'une étude sur 27 langages de programmation les plus populaires

Quels sont les meilleurs langages de programmation pour développer une application mobile ? Petit tour d'horizon sur les plus populaires

Le langage C ne sera-t-il jamais battu en termes de rapidité d'exécution et de faible consommation d'énergie ? Voici les résultats d'une étude sur 27 langages de programmation les plus populaires

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de grunk
Modérateur https://www.developpez.com
Le 22/03/2021 à 11:55
Ce que je vois surtout c'est que Python et AWK sont plutôt en bas de la liste en mode "normal". Combien de développeur prennent le temps de passer leur code au profiler quand il n'ya pas de réel problème ?

Comparer les performance sur un cas particulier (gestion de chaine) et déclarer que X ou Y est le meilleur me semble bien réducteur.
Et puis classer des langages avec des contraintes particulières qui pourraient potentiellement en pénaliser certains , c'est pas forcément très juste.

Bref encore un expert/fanboy qui veux vendre son langage de prédilection à toutes les sauces quand le meilleur langage est en fait celui qui répond le mieux aux problématique du projet.
7  0 
Avatar de MetalFlower
Nouveau Candidat au Club https://www.developpez.com
Le 22/03/2021 à 15:05
Python a un énorme avantage sur tous les autres langages: Il n'a pas besoin de profiler. Peut importe l'implémentation, ça sera toujours lent !
8  1 
Avatar de archqt
Membre émérite https://www.developpez.com
Le 22/03/2021 à 15:35
Ce qui vaut le coup est de regarder l’algorithme, car Grep est fait en C et explose le programme fait en C. Étonnant :-)
6  0 
Avatar de BSpirit
Futur Membre du Club https://www.developpez.com
Le 27/03/2021 à 11:49
Selon l'article :

Au terme de l’expérience, Ben Hoyt est arrivé à la conclusion selon laquelle, les langages Python et AWK sont à recommander pour leur rapidité, Go et Rust sont recommandable pour les développeurs qui désirent avoir des solutions rapides et fiables.
Cette traduction est un peu ambigüe, cette phrase laisse penser que le python est à préconiser parce qu'il serait performant, ce qui à mon avis n'est pas le cas.
Dans l'article original il est plus exactement dit :


If you want a fast version in a safe language, I’d recommend Go or Rust.

If you just need a quick solution (which is likely), Python and AWK are amazing for this kind of text processing.
A mon avis quand l'auteur parle de "quick solution", c'est plus en terme de rapidité de développement que de performance du langage.
6  0 
Avatar de kbadache
Membre confirmé https://www.developpez.com
Le 22/03/2021 à 22:53
Pourquoi interdire l'utilisation du multithreading si le support est dans la librairie standard du langage?
C'est pourtant ce qu'il va y avoir de plus important dans l'avenir sachant que l'évolution des processeurs est aujourd'hui tourné vers l'augmentation du nombre de coeur et non plus de la fréquence.
4  1 
Avatar de Fagus
Membre expert https://www.developpez.com
Le 23/03/2021 à 13:28
Citation Envoyé par MetalFlower Voir le message
Python a un énorme avantage sur tous les autres langages: Il n'a pas besoin de profiler. Peut importe l'implémentation, ça sera toujours lent !
C'est assez vrai, mais il y a plusieurs remarques :

  • le code python est assez lisible et assez concis (contrairement à d'autres), donc moins d'erreurs et plus rapide à rédiger.
  • la version optimisée de python ne demande pas un niveau de compétence fou (ajout d'un buffer de lecture) alors que dans d'autres langages ils passent par une table de hash optimisée
  • Si on veut que ça aille encore plus vite en python, on peut utiliser une compilation en cython juste en ajoutant le typage.
  • l'exercice de style ne correspond pas forcément à la vraie vie où l'on voudrait le support natif unicode, ce qui est offert d'emblée en python alors que la version c utilise des pointeurs de char ce qui rendrait son portage assez pénible. Une meilleure approche serait d'autoriser l'approche multi-thread : un langage où ce serait nativement simple aurait un gros avantage.


Je trouve que nim, malgré son code très simple et sûr ( https://github.com/benhoyt/countwords/pull/20 ) est aussi une bonne surprise car l'implémentation naïve est plutôt rapide.
1  0 
Avatar de grunk
Modérateur https://www.developpez.com
Le 25/03/2021 à 9:09
Citation Envoyé par Fagus Voir le message
le code python est assez lisible et assez concis (contrairement à d'autres), donc moins d'erreurs et plus rapide à rédiger.
Ca c'est très subjectif. Au contraire je trouve que l'utilisation des tabulations comme scope est un enfer à debugger et on à vite fait de faire une boulette difficile à trouver; là ou de simples accolades ne créer pas de problème. Après la syntaxe générale me plait pas, mais c'est surement parce que je suis plus habitué aux langages avec une syntaxe C
1  0 
Avatar de abriotde
Membre chevronné https://www.developpez.com
Le 22/03/2021 à 11:56
Il y a 2 choses qui m'étonnent :
1) La performance de Rust assez loin derrière C. Est-il aussi optimisé?
2) La performance de Zig, je ne connaissais pas ce langages et il semble le plus performant sans optimisation. Il vaut le coup de s'y intéressé.
0  0 
Avatar de abriotde
Membre chevronné https://www.developpez.com
Le 22/03/2021 à 12:04
Citation Envoyé par grunk Voir le message
Bref encore un expert/fanboy qui veux vendre son langage de prédilection à toutes les sauces quand le meilleur langage est en fait celui qui répond le mieux aux problématique du projet.
Non, non et non. Tu n'a pas lu l'article original en entier. C'est juste quelqu'un qui juge ce test intéressant. Il ne dit clairement pas que c'est l'alpha et l’oméga. En plus de ça, non, un langage n'est pas bon pour répondre a une problématique. Dans ce cas il te faudrait apprendre 200 langages. Tous ne se valent pas. Il est évident qu'ils n'ont pas tous les même but et un seul langage ne suffit pas. Il en faut un pour le dev rapide de prototype et un pour l'optimisation. On en rajoute quelques un pour des besoins spécifique (Bash, SQL ou VHDL) mais dans ce cas, ils n'ont pas vraiment de concurrents et puis c'est tout. Ce qui est vrai c'est que parfois certains sont plus utilisés dans un cadre spécifique, mais c'est réducteur. PHP peut faire des scripts, et Python du web de manière aussi efficace.
1  1 
Avatar de Fagus
Membre expert https://www.developpez.com
Le 26/03/2021 à 1:22
Citation Envoyé par grunk Voir le message
Ca c'est très subjectif. Au contraire je trouve que l'utilisation des tabulations comme scope est un enfer à debugger et on à vite fait de faire une boulette difficile à trouver; là ou de simples accolades ne créer pas de problème. Après la syntaxe générale me plait pas, mais c'est surement parce que je suis plus habitué aux langages avec une syntaxe C
Salut,
Je voulais dire que j'ai survolé les sources en compétition sur https://benhoyt.com/writings/count-words/ et mon commentaire s'appliquait à ces sources en particulier.
Le code python fait 10 lignes avec les importations. Les autres langages en l’occurrence sont pour beaucoup assez verbeux.

Pour le goût de la syntaxe, ayant débuté à la mauvaise époque du c/c++, j'ai aussi eu du mal à passer aux 4 espaces, mais j'ai tellement réinventé l'eau tiède et débogué des pointeurs fous, que pour l'amateur que je suis, un langage de très haut niveau vaut le coup pour mon usage. Même si le c est mon langage de coeur pour sa beauté (vénéneuse), je ne vois plus trop l'utiliser en pratique sauf pour de l'embarqué (j'aimais bien les programmes en GUI sous palm en c pur pesant quelques Ko seulement versus les monstres qu'on télécharge sous android) ou si j'avais un problème calculatoire.
Je suis d'accord pour les problèmes de scope de python qui ne sont pas intuitifs quand on vient du c, mais on s'y fait et avec un analyseur de syntaxe en temps réel on évite une bonne partie des boulettes.

0  0