Domanda

Mi piacerebbe vedere un po 'di codice sorgente o forse un link ad alcuni che dà almeno uno stub per la scrittura le gemme del rubino nelle lingue C (C ++ ?? è quello possibile anche?)

Inoltre, alcuni di voi sapranno che Facebook raccoglie alcuni dei loro codice nativo come estensioni PHP per migliori prestazioni. C'è qualcuno che sta facendo questo in Rails? Se sì, qual è stata la tua esperienza con esso? Avete trovato per essere utile?

Grazie.

Modifica Credo che risponderò alla mia domanda con alcune cose che ho imparato oggi, ma ho intenzione di lasciare la questione aperta per un'altra risposta perché mi piacerebbe vedere ciò che gli altri hanno da dire su questo argomento

È stato utile?

Soluzione

Ok, così mi sono seduto un mio amico che è buono con C. ho mostrato lo rubino e scava esso. Quando ci siamo incontrati ieri sera gli ho detto che si potrebbe scrivere le gemme del rubino in C, che lo ha incuriosito. Ecco cosa abbiamo trovato:

Esercitazioni / Esempi

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

http://drnicwilliams.com/2008/04 / 01 / scrittura-C-extensions-in-rubygems /

http://www.rubyinside.com/how-to-create-a-ruby-extension-in-c-in-under-5-minutes-100.html

ruby-doc (codice sorgente ruby.h)

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

Ecco qualche codice sorgente che abbiamo scritto di provarlo così:

Aprire un terminale:

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

Poi si mette questo codice in 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)

Salva il file quindi scrivere 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);
}

Dal prompt è quindi necessario creare un Makefile eseguendo extconf.rb:

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

È quindi possibile verificare il lavoro svolto:

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

Abbiamo fatto un test di benchmark e aveva rubino aggiungere 3 e 4 insieme 10 milioni di volte e poi effettuare una chiamata a nostra estensione C 10 milioni di volte pure. Il risultato è stato che utilizzando solo rubino ci sono voluti 12 secondi per completare questa operazione mentre si utilizza l'estensione C sono voluti solo 6 secondi! Inoltre nota che la maggior parte di questa elaborazione è di portare il lavoro fuori a C per completare l'operazione. In uno di questi tutorial scrittore ricorsione utilizzato (sequenza di Fibonacci) e segnalato che l'estensione C ha 51 volte più veloce!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top