Question

Je voudrais voir le code source ou peut-être un lien vers certains qui donne au moins un talon pour écrire des pierres précieuses rubis dans les langues C (C ++ ?? est-ce possible aussi?)

En outre, certains d'entre vous savez peut-être que Facebook compile une partie de leur code natif comme des extensions PHP pour une meilleure performance. Quelqu'un est-il fait cela dans Rails? Si oui, quelle a été votre expérience avec elle? Avez-vous trouvé qu'il était utile?

Merci.

Edit: Je suppose que je vais répondre à ma propre question avec quelques trucs que j'ai appris aujourd'hui, mais je vais laisser la question ouverte pour une autre réponse, parce que je voudrais voir ce que les autres ont à dire sur ce sujet

Était-ce utile?

La solution

Ok, donc je me suis assis un de mes amis qui est bon avec C. J'ai été lui montrant Ruby et il creuse il. Lorsque nous avons rencontré hier soir, je lui ai dit que vous pourriez écrire des gemmes Ruby en C, qui l'intriguait. Voici ce que nous avons trouvé:

Tutoriels / Exemples

http://www.eqqon.com/index.php/Ruby_C_Extension

http://drnicwilliams.com/2008/04 / 01 / écriture-c-extensions-en-rubygems /

http://ruby-doc.org/doxygen/1.8. 4 / ruby_8h-source.html

Voici un code source que nous avons écrit pour le tester ainsi:

Ouvrir un terminal:

prompt>mkdir MyTest
prompt>cd MyTest
prompt>gedit extconf.rb

Ensuite, vous mettez ce code dans extconf.rb

# Loads mkmf which is used to make makefiles for Ruby extensions
require 'mkmf'

# Give it a name
extension_name = 'mytest'

# The destination
dir_config(extension_name)

# Do the work
create_makefile(extension_name)

Enregistrez le fichier puis écrire MyTest.c

#include "ruby.h"

// Defining a space for information and references about the module to be stored internally
VALUE MyTest = Qnil;

// Prototype for the initialization method - Ruby calls this, not you
void Init_mytest();

// Prototype for our method 'test1' - methods are prefixed by 'method_' here
VALUE method_test1(VALUE self);
VALUE method_add(VALUE, VALUE, VALUE);

// The initialization method for this module
void Init_mytest() {
MyTest = rb_define_module("MyTest");
rb_define_method(MyTest, "test1", method_test1, 0);
rb_define_method(MyTest, "add", method_add, 2);
}

// Our 'test1' method.. it simply returns a value of '10' for now.
VALUE method_test1(VALUE self) {
int x = 10;
return INT2NUM(x);
}

// This is the method we added to test out passing parameters
VALUE method_add(VALUE self, VALUE first, VALUE second) {
int a = NUM2INT(first);
int b = NUM2INT(second);
return INT2NUM(a + b);
}

De l'invite, vous devez ensuite créer un Makefile en exécutant extconf.rb:

prompt>ruby extconf.rb
prompt>make
prompt>make install

Vous pouvez ensuite le tester:

prompt>irb
irb>require 'mytest'
irb>include MyTest
irb>add 3, 4 # => 7

Nous avons fait un test de référence et avait rubis ajouter 3 et 4, ainsi que 10 millions de fois, puis faire un appel à notre C extension de 10 millions de fois aussi. Le résultat est que en utilisant seulement rubis il a fallu 12 secondes pour terminer cette tâche en utilisant l'extension C seulement pris 6 secondes! Notez également que la plupart de ce traitement est la remise du travail hors de C pour terminer la tâche. Dans l'un de ces tutoriels l'auteur de récursivité utilisé (suite de Fibonacci) et a indiqué que l'extension C a 51 fois plus vite!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top