15

C言語でRuby gemを書くための少なくともスタブを提供するいくつかのソースコードまたはリンクを見たいと思います(C++??それも可能ですか?)

また、パフォーマンスを向上させるために、Facebook がコードの一部を php 拡張機能としてネイティブにコンパイルしていることを知っている人もいるかもしれません。Railsでこれをやっている人はいますか?もしそうなら、あなたはそれについてどのような経験をしましたか? 便利だと思いましたか?

ありがとう。

編集: 今日学んだことで自分の質問に答えると思いますが、このトピックについて他の人が何を言わなければならないかを見たいので、別の答えのために質問を開いたままにします

4

1 に答える 1

20

わかりました、それで、私は C が得意な友人に会いました。私は彼に Ruby を見せており、彼はそれを掘り下げています。昨夜会ったとき、Ruby gems を C で書けると彼に話し、彼は興味をそそられました。これが私たちが見つけたものです:

チュートリアル/例

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

http://drnicwilliams.com/2008/04/01/writing-c-extensions-in-rubygems/

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

ruby-doc (ruby.h ソースコード)

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

これをテストするために作成したソース コードを次に示します。

ターミナルを開きます。

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

次に、このコードを 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)

ファイルを保存し、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);
}

プロンプトから、extconf.rb を実行して Makefile を作成する必要があります。

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

次に、それをテストできます。

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

ベンチマーク テストを実施し、Ruby で 3 と 4 を 1,000 万回追加し、C 拡張機能を 1,000 万回呼び出しました。その結果、Ruby だけを使用した場合、このタスクを完了するのに 12 秒かかりましたが、C 拡張機能を使用した場合は 6 秒しかかかりませんでした! また、この処理のほとんどは、ジョブを C に渡してタスクを完了することにも注意してください。それらのチュートリアルの 1 つで、筆者は再帰 (フィボナッチ数列) を使用し、C 拡張が 51 倍速くなったと報告しました!

于 2010-05-18T16:45:14.063 に答える