2009-02-10 1 views
2

J'ai un algorithme assez intensif qui doit être exécuté assez souvent (plusieurs fois par seconde) dans mon application RoR. Considérant comment slow Ruby is avec ce genre de choses, je ne pense pas que ce serait bien de faire le travail dans Ruby.Travail algorthmique lourd dans Ruby on Rails?

Vous pensez peut-être que je devrais l'ajouter à une file d'attente de travail et qu'une application C++ fonctionne, mais j'ai besoin que le résultat soit renvoyé instantanément. Y at-il un moyen d'étendre RoR avec un plugin C++ ou quelque chose? Et si je me connectais à l'application C++ via une socket? Ou serait-ce juste être fou?

+0

Cela semble un peu argumentatif ... – GEOCHET

+0

Comment ça va? Ruby étant lent pour le calcul des nombres n'est même pas un débat, c'est un fait. – ryeguy

Répondre

6

Une autre alternative est RubyInline qui vous permet d'écrire du code C/C++ dans votre code Ruby. Cela correspond parfaitement avec suggestion de Jonas Kölker pour écrire l'algorithme dans Ruby d'abord, puis trouver les goulots d'étranglement. Vous pouvez ensuite utiliser RubyInline pour optimiser les goulots d'étranglement.

+0

Je ne savais pas à ce sujet. Ça a l'air génial. +1 – DanSingerman

+0

Voir "Utiliser RubyInline pour l'optimisation" par Eric Hodel pour un exemple: http://segment7.net/projects/ruby/inline_optimization.html –

9

[...] Je ne pense pas [...]

Faire la mesure. C'est-à-dire, s'il est raisonnablement simple d'écrire en Ruby, implémentez-le dans ruby ​​et mesurez-le d'abord. Ensuite, si vraiment est trop lent, découvrez comment le contourner.

Même si vous avez besoin de réécrire l'algorithme dans une autre langue, vous avez un algorithme en ruby ​​que vous devez simplement copier, donc cela ne prendra pas autant de temps que de l'écrire en C++ la première fois .

Mais mesurez-le en premier.

+0

Je comprends ce que vous dites, mais je demande plus de COMMENT j'irais l'implanter dans une autre langue si j'en avais besoin. – ryeguy

+1

Ceci est un conseil crucial. Désolé mais on devrait toujours demander "devrais-je?" avant de demander "comment puis-je?", d'autant plus que l'utilisation de la rubyline rendrait plus difficile * de changer l'algorithme une fois que vous avez terminé. –

6

Plusieurs possibilités. Premièrement, voyez si vous pouvez passer à Ruby 1.9: c'est nettement plus rapide que 1.8. Deuxièmement, il est en effet possible d'écrire Ruby extensions in C. Troisièmement, vous pouvez en effet écrire un processus distinct dans n'importe quelle langue que vous trouvez pratique et l'utiliser. La meilleure approche est difficile à deviner, puisque vous ne donnez pas vraiment beaucoup de détails, mais pensez au fonctionnement de la popen.

1

Une autre possibilité (si votre configuration le permet) est d'utiliser JRuby. Ensuite, vous pouvez implémenter l'algorithme en Java.