Crystal est un nouveau venu dans le monde des langages de programmation. Le but de ce langage est d’avoir une synthaxe similaire à Ruby tout en ayant les performances du C. Dans cet article, je vous propose de faire une comparaison entre le langage populaire et rapide, Go, ce jeune langage, Crystal, et son inspiration, Ruby.
Resultats
Sans plus attendre, voici les résultats en image :
Comme Ruby a des performances bien en dessous de Go et Crystal, voici le même graphique en le retirant :
Plus de détails sur les tests par la suite.
Fibonacci
Comme premier programme, j’ai choisi de faire un benchmark avec un programme comptant selon la suite de Fibonacci. N’étant pas un développeur Go, j’ai trouvé le code ici et l’ai modifié pour faire ce que je souhaite, c’est-à-dire m’afficher uniquement le résultat selon la valeur passée en paramètre.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Voici une implémentation similaire en Ruby :
1 2 3 4 5 6 7 8 9 |
|
Et la voici avec Crystal :
1 2 3 4 5 6 7 8 9 |
|
Ne cherchez pas de différence entre Ruby et Crystal, il n’y en a pas. Dans ce cas, Ruby et Crystal sont totalement similaires.
Voici les résultats :
1 2 3 4 5 |
|
1 2 3 4 5 |
|
1 2 3 4 5 |
|
On peut voir que Go gagne suivi de Crystal et de Ruby. Cependant, dans ce test, les temps d’exécution sont tellement rapides que beaucoup d’autres facteurs peuvent entrer en jeu dans le temps d’exécution.
Fibonacci BigInt
Pour poursuivre les tests, j’ai voulu augmenter la valeur à calculer. Malheureusement, pour Go et Crystal, la taille des entiers n’est pas suffisante. Il a donc été nécessaire de modifier le code pour utiliser des BigInt.
Voici le code Go modifié :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Et la même chose avec Crystal :
1 2 3 4 5 6 7 8 9 10 11 |
|
Et voici les résutats :
1 2 3 4 5 |
|
1 2 3 4 5 |
|
1 2 3 4 5 |
|
Le résultat est un peu décevant. L’utilisation du BigInt en Crystal est lente. La raison de cette lenteur viens du faire que Crystal utilise GMP qui est manifestement plus lent que l’implémentation de Go. Vous pouvez voir une discussion sur la lenteur de Crystal ici.
Autres Benchmarks
Je n’ai pas voulu me laisser abattre au premier test et j’ai décidé d’en faire d’autres. J’ai trouvé ce projet. Malheureusement, les codes proposés ne fonctionnent pas toujours avec les dernières versions des langages. Je me suis contenté de faire une comparaison avec les scripts fonctionnant sans modifications.
Brainfuck
1 2 3 4 5 6 |
|
1 2 3 4 5 6 |
|
1 2 3 4 5 6 |
|
Havlak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
On peut voir que Crystal est deux fois plus rapide que Go. J’émets une petite réserve sur le code fait avec Crystal. Celui-ci a été fait à partir de celui fait en Python et ne respect pas la “Crystal way”.
Matmul
1 2 3 4 5 6 |
|
1 2 3 4 5 6 |
|
1 2 3 4 5 6 |
|
Encore une fois, Ruby est en retrait. Les performances entre Go et Crystal sont comparables bien que Go est légèrement plus rapide.
Conclusion
Pour conclure, je dirais que Crystal, bien que très jeune, offre des performances intéressantes. Le futur nous dira s’il s’agit d’un projet éphémère ou s’il fera ses preuves.
J’espère pouvoir faire d’autres tests sur Crystal très bientôt. Je pense essayer de faire une API. Suivez-moi sur Twitter pour rester au courant.