Ich werde kurz erklären, wie man eine in C geschriebene Bibliothek von Ruby aufruft. Es gibt einige Websites, die dies erklären, einschließlich der offiziellen, aber ich wollte, dass Sie es mir einfacher sagen ...
https://ruby-doc.org/core-2.5.3/doc/extension_ja_rdoc.html https://qiita.com/suketa/items/ab6b88093de4a54b3b06
https://github.com/hakua-doublemoon/rb_ext_hello
Wie im oben gezeigten Beispiel C-Code gezeigt. Definieren Sie eine Klasse mit einer Init-Funktion (Sie können auch ein Modul definieren), erstellen Sie eine Methodendefinition und die entsprechende Funktion. Bei der Methode wird sie am Anfang des offiziellen Dokuments geschrieben. Da sich die Verwendung von Typen zwischen Ruby und C unterscheidet, verwenden Sie bei der Interaktion eine spezielle Funktion. Mit anderen Worten, es sieht wie folgt aus.
hello.c
return rb_str_new("Hello World", 11);
Ich schreibe das Makefile nicht selbst. Sie können es erstellen, indem Sie extconf.rb und dann ruby extconf.rb
erstellen. Dies ist auch im Beispiel enthalten.
(Ich denke, es kann ausgeführt werden, wenn Ruby installiert ist, aber vielleicht ist "Ruby-Dev" notwendig?)
Der durch create_makefile ()
angegebene Modulname (Klassenname?) Muss nicht mit dem Fall des Dateinamens übereinstimmen. Also habe ich hello.c
im unteren C-Dateinamen und Hello
im Klassennamen wie Typname verwendet.
ruby extconf.rb
und wenn das Makefile erstellt wird, make
.
Übrigens, selbst wenn Sie extconf.rb schreiben, bevor Sie eine C-Datei erstellen, erhalten Sie möglicherweise ein Makefile, das Sie nicht erstellen können.
Da es eine große Sache ist, werde ich bis zu dem Punkt schreiben, an dem ich es versuchen werde. Ich habe es in das Beispiel geschrieben, aber Sie können es wie folgt tun.
require "./Hello"
hello = Hello::new
hello.methods
#=> [:say, :instance_variable_set, :instance_variable_defined?, ...
# ^Es gibt eine Methode, die ich hier gemacht habe.
hello.say
#=> "Hello World"
hello.say.class
#=> String
Zuerst habe ich mich gefragt, ob ich ein in C als Befehl von Ruby geschriebenes Programm ausführen soll, aber ich habe gelernt, dass der Overhead von popen ziemlich groß ist, also habe ich beschlossen, eine gemeinsam genutzte Bibliothek zu erstellen. Wenn Sie in einem einzigen Schuss öffnen, sehen Sie nicht viel Overhead. Ich denke jedoch, dass es einen großen Unterschied macht, ob Sie es ungefähr 1000 Mal mit popen ausführen oder die Bibliothek laden und ausführen. (Ich denke, es hängt von der Ausführungsumgebung ab) Das Folgende ist das Ergebnis des Experiments.
Das Ergebnis der 1000-maligen Ausführung des Hello World C-Programms mit popen:
user system total real
Case01 0.125000 0.296875 2.625000 ( 11.617396)
Das Ergebnis der Ausführung der Bibliothek habe ich diesmal 1000 mal gemacht:
user system total real
Case01 0.000000 0.000000 0.000000 ( 0.000436)
1000 Bibliotheken habe ich diesmal gemacht*Ergebnis des 1000-maligen Laufens:
user system total real
Case01 0.109375 0.015625 0.125000 ( 0.130412)
Als Person, die Ruby verwendet, können Sie versuchen, die Ursache für den starken Pop von Ruby zu finden ...
Recommended Posts