GC / Sans GC => Performance vraiment différente ?

a marqué ce sujet comme résolu.

Hello les Z' :ange:

J’aimerai vous soumettres une problématique que je trouve plutôt intéressante !

Aujourd’hui les GC sont vraiment optimisé ( Par exemple : Scala, OCaml ), ont parlent beaucoup de performance et qu’il faut absolument faire du C++ / C / Rust pour des besoins critique

Mais finalement avec toutes les optimisation que les GC font est-ce vraiment utile ? ( Hors programme avec accès mémoire ) mais à part dans le cas de création d’un Kernel es-ce vraiment utile ?

Salut,

Les GC ont fait des progrès fantastiques, oui, ce qui fait que pour l’immense majorité des applications où ce qui est limitant est le temps de réaction de l’utilisateur, les implémentations de langages basées sur des GC font l’affaire. Ajoute à ça le fait qu’il est souvent possible de s’interfacer sur des libs C pour les choses critiques (je pense par exemple à ce que fait numpy pour rendre les calculs matriciels possible en Python), et tu lisses encore les différences entre un code écrit complètement en C et un code qui n’a que ces parties critiques écrites en C.

Par contre, il faut bien comprendre qu’utiliser un GC a toujours un coût au runtime, il est impossible de passer à côté de ça. Donc si les performances sont vraiment critiques (par exemple j’utilise et développe des codes de calculs pour mon boulot où les seuls facteurs limitant sont la RAM et le temps de calcul), tu as intérêt à utiliser un langage comme C ou rust qui minimisent à fond les surcout au runtime, dont la gestion de la mémoire.

Je comprend !

Mais j’ai souvent entendu dire ( cc @Lynix ) que faire un moteur 3d dans un langage avec GC était une mauvaise chose.. es-ce encore le cas ?

De plus quand on voit actuellement que la plus part des "nouveaux" langages donne une pente d’apprentissage facile et une syntaxe simple (Crystal, etc ) ;

Ne serait-il pas plus judicieux avec de trouver un moyen pour utiliser des libs C dans ce type de langage ? ( Je sent qu’il y a quelque choses de faux dans cette phrase haha :D )

Je sent aussi un besoin chez les débutants d’être productif rapidement.. hors l’apprentissage d’un langage comme Rust peut s’avérer très complexe et démotiver

+0 -0

Ce que je pense sur ces probleme la est que le langage sans GC (C, C++, Rust, etc) sera parfait pour faire la partie necessitant de hautes performances (trading, reseau, etc).

Le langage qui lui est plus lent s’interfacera avec cet outil pour utiliser cette puissance si besoin. (numpy par exemple)

Ben ce qui coince quand tu écrit un moteur 3D, c’est les performances, donc éviter un langage à GC semble judicieux.

De plus quand on voit actuellement que la plus part des "nouveaux" langages donne une pente d’apprentissage facile et une syntaxe simple (Crystal, etc ) ; Ne serait-il pas plus judicieux avec de trouver un moyen pour utiliser des libs C dans ce type de langage ? ( Je sent qu’il y a quelque choses de faux dans cette phrase haha  )

Je comprends pas ce que tu essayes de dire.

Je sent aussi un besoin chez les débutants d’être productif rapidement.. hors l’apprentissage d’un langage comme Rust peut s’avérer très complexe et démotiver

Un langage comme Rust ne répond clairement pas aux besoins d’un débutant. Ni un langage axé performances de manière générale, d’ailleurs. Faire un code efficace en terme de gestion mémoire n’est pas un truc qui s’improvise, quelque soit le langage. Par ailleurs, faire qu’un langage est simple à apprendre et utiliser, c’est un bon objectif en soit mais ce n’est pas le seul à remplir lors de l’élaboration d’un langage. L’équipe de Rust a mis ça dans un plan secondaire (même si ils font continuellement des efforts dans ce sens) au profit de la richesse de ce que l’on peut exprimer dans ce langage en terme de gestion de la mémoire et d’abstraction.

Justement, regarde des moteurs comme :

https://github.com/haskell-game/fungen

http://jmonkeyengine.org/

https://github.com/Schmavery/reprocessing

Ils ont pourtant des performances très acceptable…

Un langage comme Rust ne répond clairement pas aux besoins d’un débutant. Ni un langage axé performances de manière générale, d’ailleurs. Faire un code efficace en terme de gestion mémoire n’est pas un truc qui s’improvise, quelque soit le langage. Par ailleurs, faire qu’un langage est simple à apprendre et utiliser, c’est un bon objectif en soit mais ce n’est pas le seul à remplir lors de l’élaboration d’un langage. L’équipe de Rust a mis ça dans un plan secondaire (même si ils font continuellement des efforts dans ce sens) au profit de la richesse de ce que l’on peut exprimer dans ce langage en terme de gestion de la mémoire et d’abstraction.

Le problème c’est justement ça .. donc un débutant ne peut pas faire de jeux vidéo par ce qu’il n’est pas apte à apprendre Rust/C++ ?

Quand est-on vraiment apte ? J’ai environ 1,5 an de prog à mon actif ( pas mal de changement de langage même si je suis resté très longtemps sur JS / Java ce qui ma permit d’apprendre beaucoup de choses) En apprenant Rust… j’ai vraiment l’impression que je ne serai jamais productif tellement la charge de travail est importante pour assimiler certains concepts…

Le problème c’est justement ça .. donc un débutant ne peut pas faire de jeux vidéo par ce qu’il n’est pas apte à apprendre Rust/C++ ?

Un moteur de jeu vidéo. En 3D. Si tu veux faire un petit jeu 2D, même un langage aux performance déplorables comme Python suffit.

Quant à Rust, pour avoir essayé il y a 2 ans et m’y être remis récemment, je dirai qu’il n’est clairement pas accessible à un débutant. Si tu es autodidacte ou occasionnel, je dirai d’attendre plutôt 5 ans de pratique que 2.

+0 -0

Ils ont pourtant des performances très acceptable…

L’industrie du jeu vidéo ne veut pas quelque chose de "très acceptable", elle veut ce qui se fait de mieux. Tu peux coder un moteur 3D dans n’importe quel langage, qu’il soit effectivement utilisé par l’industrie sera une autre paire de manches. Si ton moteur est 5% plus lent qu’un autre en faisant exactement la même chose, le choix sera vite fait. Se priver par construction de performances parce qu’on utilise un langage à GC est un choix absurde, au moins à l’heure actuelle où les performances exigées sont à la limite de ce que fournit le matériel.

Le problème c’est justement ça .. donc un débutant ne peut pas faire de jeux vidéo par ce qu’il n’est pas apte à apprendre Rust/C++ ?

Un débutant ne peut pas coder de moteur de jeu, non. Du moins, pas de moteur de jeu sérieux qui demanderait effectivement d’utiliser un langage axé performances. Soyons réalistes, encore une fois écrire un programme axé performance ne s’improvise pas. Écrire un moteur sérieux qui tient la route, c’est un travail à plein temps pour des gens dont c’est le boulot. Clairement en étant un débutant isolé, le coût d’apprentissage de Rust est le dernier de tes soucis si tu souhaites écrire un moteur 3D sérieux. Un projet plus réaliste serait de reproduire un moteur à la DOOM. Et là, tu peux bien prendre le langage que tu veux vu les perfs de la moindre machine aujourd’hui.

Quand est-on vraiment apte ? J’ai environ 1,5 an de prog à mon actif ( pas mal de changement de langage même si je suis resté très longtemps sur JS / Java ce qui ma permit d’apprendre beaucoup de choses) En apprenant Rust… j’ai vraiment l’impression que je ne serai jamais productif tellement la charge de travail est importante pour assimiler certains concepts…

Ça dépend des gens. Il y a des gens qui apprendront autant en 1.5 ans que d’autre en 5. Un tremplin utile pour apprendre Rust est de passer par un langage fonctionnel vu que Rust emprunte pas mal de concept à ces langages, comme Haskell. D’ailleurs dans tous les cas, jouer avec un langage fonctionnel t’apprendra des choses utiles.

Je vois, je suis assez déçus

Je pensais qu’apprendre un langage tel que C++ / Rust ne demanderai pas autant d’expérience préalable

C’est regrettable mais une question me vient => Hors industrie est-ce vraiment important ?

De plus pourquoi les gens expérimenté ne font tout simplement pas de moteur en C++ utilisable dans d’autre langages ? (Mince ! Je crois que ça existe ? Genre Love2D etc mais en connaissez-vous utilisable via un langage de la JVM ( scala ) )

Je pensais qu’apprendre un langage tel que C++ / Rust ne demanderai pas autant d’expérience préalable

De toute façon, c’est pas les apprendre qui est la partie difficile, c’est s’en servir correctement dans un code complexe. Si tu codes un moteur de jeu, la partie difficile est de le concevoir intelligemment pour que les perfs suivent, ce n’est pas parce que quelque chose est codé en Rust qu’il est automatiquement rapide.

C’est regrettable mais une question me vient => Hors industrie est-ce vraiment important ?

Non, du tout, c’est bien pour ça que je te conseille de te donner un objectif réaliste.

De plus pourquoi les gens expérimenté ne font tout simplement pas de moteur en C++ utilisable dans d’autre langages ? (Mince ! Je crois que ça existe ? Genre Love2D etc mais en connaissez-vous utilisable via un langage de la JVM ( scala ) )

Il suffit de taper "moteur jeu java" dans Google. Le premier lien est ce sujet.

Après, si les moteurs se contentent de tourner par exemple avec du C++, c’est parce que les gens capables de développer un jeu sont aussi capables d’apprendre le C++. Je ne dis pas ça pour te décourager, c’est juste qu’apprendre un langage est une tache dérisoire à coté de la conception et du développement d’un jeu vidéo.

La grande majorité des besoins de programmation, que ce soit dans l’industrie ou non, n’ont pas comme seul but d’avoir des performances maximales. En général on attache au moins autant d’importance au fait que le programme soit correct (et pas truffé de bugs), facile à maintenir, etc. C’est pour cela que plein de langages de programmations différents sont utilisés. (Sinon on écrirait tout en assembleur…)

Pour moi le fait de dire "un GC a toujours un coût" est un peu fallacieux. Les GCs ont des coûts et des gains, et finalement tous les programmes ont un GC, quand ce n’est pas dans le runtime de leur langage c’est leur allocateur mémoire (malloc) qui fait GC (et qui peut avoir un coût en performance aussi), le système d’exploitation qui aussi gère la mémoire. Un programme écrit dans un langage à GC qui fait la même chose qu’un programme dans un langage sans GC peut être plus rapide, à quantité d’effort d’optimisations équivalents. (Parce que le GC évite plein de petits appels à malloc plus coûteux, ou améliore la localité en déplaçant les objets…). Évidemment dans le cas général ce n’est pas ce qu’on observe, on voit plutôt (en général) des performances comparables mais une utilisation mémoire un peu supérieure. Mais l’idée de dire "ça a toujours un coût" n’a pas grand sens.

La vraie question serait plutôt : dans quels cas on a besoin de se passer de GC ? Est-ce qu’on peut le faire au sein d’un langage/système qui a un GC, ou est-ce que ça demande de passer par un langage sans GC ? Pour quelle partie du code de son application ?

Aujourd’hui les domaines où il faut absolument utiliser un langage sans GC sont assez restreints. Les noyaux systèmes d’exploitation semblent un bon candidat. Un autre c’est certaines parties des jeux vidéos, à cause des problèmes de latence introduite par la plupart des GCs (mais certains ont des latences acceptables pour les jeux vidéos, et dans tout les cas ce n’est pas un problème de performances brutes).

Dans tous les cas, si tu veux écrire des jeux vidéos, aujourd’hui les technologies les plus populaires sont presques toutes dans un langage à GC, donc la question ne se pose pas vraiment. "Love" est en Lua, Unity surtout en C#, les jeux pour Android sont tous en Java… Une exception est peut-être Unreal Engine 4, qui s’utilise surtout depuis C++, mais toutes les versions précédentes avaient leur propre langage d’utilisation maison, Unreal Script, et la version 4 a une grosse base d’utilisateurs (sérieux) qui utilisent un langage de script en plugin, Skookumscript.

+2 -0

J’avais pas mal de projets ( Navigateur, Emulateur CHIP8, Jeux )

Dommage :/

Absolute

Ben aucun de ces projets ne demande des performances incroyables, rien à voir avec coder un moteur 3D. Pour les jeux, si tu restes sur des projets raisonnables il n’y a aussi aucune raison pour que ça ne passe pas.

Ton message me réconforte dans la poursuite des choses

Dans tous les cas, si tu veux écrire des jeux vidéos, aujourd’hui les technologies les plus populaires sont presques toutes dans un langage à GC, donc la question ne se pose pas vraiment. "Love" est en Lua, Unity surtout en C#, les jeux pour Android sont tous en Java… Une exception est peut-être Unreal Engine 4, qui s’utilise surtout depuis C++, mais toutes les versions précédentes avaient leur propre langage d’utilisation maison, Unreal Script, et la version 4 a une grosse base d’utilisateurs (sérieux) qui utilisent un langage de script en plugin, Skookumscript.

Mais, Unity est écrit en C++ on l’interface uniquement avec du C# non ?

D’où les bonne performances non ?

Quel besoin à un Emulateur ? ( CHIP8 ? ) Un GC peut suffire ?

Les navigateurs ? ( Quant ont voient des navigateurs comme Chrome / Firefox ) écrit en C++/Rust est-ce un facteur ?

Quel besoin à un Emulateur ? ( CHIP8 ? ) Un GC peut suffire ?

Les navigateurs ? ( Quant ont voient des navigateurs comme Chrome / Firefox ) écrit en C++/Rust est-ce un facteur ?

C’est largement bon, heureusement que j’avais commencé mon tout premier message par

Les GC ont fait des progrès fantastiques, oui, ce qui fait que pour l’immense majorité des applications où ce qui est limitant est le temps de réaction de l’utilisateur, les implémentations de langages basées sur des GC font l’affaire.

Tant que ton programme n’a pas des besoins très intensifs, c’est bon. Tu cites Chrome et Firefox, j’ai envie de dire que là encore ce ne sont pas des projets à la portée d’un débutant. Ces trucs là ont un code de la taille de celui du noyau Linux et sont sur un marché difficile. Si tu codes toi un navigateur dans ton coin, leur arriver à la cheville en termes de performances et surtout versatilité sera le cadet de tes soucis. L’intérêt pour toi sera déjà d’avoir un truc qui marche, faire un navigateur compétitif sur le marché est juste impossible pour une personne seule.

Le conseil principal qu’on peut donner, c’est "essaye", tu verras bien ce que ça donne. Et ne te compare pas avec des projets gigantesques qui représentent l’état de l’art dans un domaine, ce n’est pas une bonne idée.

Le langage de développement est important, mais il ne fait pas tout. Un âne qui programme avec un langage hyper-puissant fera de toutes façons moins bien qu’un type brillant qui programme avec un langage même quelconque.

Et un gars isolé fera de toutes façons moins bien que l’équipe hyper-puissante/hyper-organisée qui fait Chrome.

Question : quel âge as-tu ? Je soupçonne que tu es collégien/lycéen. Tu parles de faire un moteur de jeu. Faire un moteur de jeu, ça demande des compétences en programmation, mais ça demande aussi des compétences en mathématiques, que tu n’imagines pas.

Le problème c’est justement ça .. donc un débutant ne peut pas faire de jeux vidéo par ce qu’il n’est pas apte à apprendre Rust/C++ ?

Absolute

Là, tu confonds 2 choses. Faire un moteur de jeu, et utiliser un moteur de jeu pour faire un jeu.

Un débutant peut parfaitement faire des jeux, en utilisant un moteur de jeu, sans même savoir si ce moteur de jeu a été fait en langage X ou Y ou Z.

La différence entre faire un moteur de jeu, et faire un jeu, c’est la même que la différence entre construire une voiture, et conduire une voiture.

Mon langage de prédilection personnel est OCaml, c’est un langage à GC, et pourtant il est utilisé pour faire de la programmation système (dans Docker, dans la plateforme Xen… pas des noyaux par contre) et des projets industriels ayant des besoins en performance (plateformes de trading, etc.). Je l’utiliserais sans hésiter si je voulais écrire un navigateur ou un jeu.

(Si je voulais un projet ayant pour but d’obtenir des performances maximales au détriment de la facilité de programmation, j’utiliserais plutôt Rust. Pour un émulateur de CPU genre QEMU, je pense que j’essaierais en Rust directement. Dans un navigateur ou pour un jeu, il y a des parties du code qui sont critiques pour les perfomrances, et pourquoi pas utiliser Rust pour ces parties spécifiquement.)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte