Hmm - j'ai travaillé sur un projet il y a quelques années où j'ai raclé le baril avec Ruby performance, et je ne suis pas sûr que beaucoup de choses ont changé depuis. Maintenant, c'est le caveat emptor - vous avez à savoir pour ne pas faire certaines choses, et franchement les jeux / applications temps-réel serait l'un d'eux (puisque vous parlez de l'OpenGL).
Le coupable pour le meurtre de performance interactive est le garbage collector - autres ici mentionner que Java et d'autres environnements de collecte des ordures, mais Ruby a pour arrêter le monde à exécuter. C'est-à-dire, il doit arrêter l'exécution de votre programme, de numérisation à travers tous les registres et la mémoire du pointeur à partir de zéro, la marque de la mémoire qui est encore en usage, et gratuit le reste. Le processus ne peut pas être interrompu, tout ce qui se passe, et comme vous l'avez peut-être remarqué, il peut prendre des centaines de millisecondes.
Sa fréquence et sa durée d'exécution est proportionnel au nombre d'objets vous pouvez créer et détruire, mais à moins de désactiver complètement, vous n'avez aucun contrôle. Mon expérience a été il y avait plusieurs insatisfaisant des stratégies pour lisser mes Ruby boucle d'animation:
- GC.désactiver / GC.activer autour de la critique de l'animation des boucles et peut-être un opportuniste GC.départ pour le forcer à aller quand il ne peut pas faire de mal. (parce que ma plate-forme cible était à l'époque 64MO de l'ordinateur Windows NT, cela a provoqué le système à exécuter de mémoire de temps en temps. Mais fondamentalement, c'est une mauvaise idée, sauf si vous pouvez pré-calculer la quantité de mémoire dont vous pourriez avoir besoin avant de le faire, vous risquez de la mémoire de l'épuisement)
- Réduire le nombre d'objets que vous créez donc le GC a moins de travail à faire pour réduire la fréquence et la durée de son exécution)
- Réécrire votre animation en boucle dans C (un flic, mais celui que je suis allé avec!)
Ces jours-ci je ne serais probablement aussi voir si JRuby travail comme une alternative d'exécution, comme je le crois, il s'appuie sur Java est plus sophistiqué garbage collector.
L'autre grand problème de performance que j'ai trouvé est de base d'e/S lorsqu'il essaie d'écrire un serveur TFTP en Ruby a tout à l'arrière (ouais je choisir les meilleures de toutes les langues pour mes critiques des performances des projets de cet été était juste une expérience). L'absolu la plus simple, la plus serrée de la boucle pour simplement répondre à un paquet UDP avec un autre, contenant le morceau suivant d'un fichier, doivent avoir été sur 20x plus lent que le stock de C de la version. Je soupçonne qu'il y a eu quelques améliorations à y faire basée sur l'utilisation d'un faible niveau d'IO (sysread etc.) mais la lenteur est peut-être juste dans le fait il n'y a pas de bas niveau de type de données byte - chaque petite lecture est copié dans une Chaîne de caractères. Ce n'est que spéculation mais, je n'ai pas pris ce projet beaucoup plus loin, mais il m'a prévenu off en s'appuyant sur snappy I/O.
La principale vitesse de l'augmentation récente qui a été accompli, même si je ne suis pas complètement à jour, ici, est que la machine virtuelle de mise en œuvre a été refaite pour la 1.9, ce qui accélère l'exécution de code. Cependant je ne pense pas que le GC a changé, et je suis assez sûr il n'y a rien de nouveau sur le I/O avant. Mais je ne suis pas complètement à jour sur le saignement-bord Ruby si quelqu'un d'autre pourrait vouloir à puce d'ici.