Je vais expliquer brièvement comment appeler une bibliothèque écrite en C à partir de Ruby. Il y a quelques sites qui l'expliquent, y compris le site officiel, mais je voulais que vous me disiez plus simplement ...
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
Comme indiqué dans l'exemple code C ci-dessus. Définissez une classe avec une fonction Init (vous pouvez également définir un module), créez une définition de méthode et la fonction correspondante. Dans la méthode, il est écrit au début du document officiel, mais comme l'utilisation des types est différente entre Ruby et C, utilisez une fonction dédiée lorsque vous interagissez les uns avec les autres. En d'autres termes, cela ressemble à ce qui suit.
hello.c
return rb_str_new("Hello World", 11);
Je n'écris pas le Makefile moi-même. Vous pouvez le créer en créant extconf.rb puis ruby extconf.rb
. Ceci est également inclus dans l'exemple.
(Je pense qu'il peut être exécuté si Ruby est installé, mais peut-être que ruby-dev
est nécessaire?)
Le nom du module (nom de classe?) Spécifié par create_makefile ()
ne doit pas nécessairement correspondre à la casse du nom de fichier. J'ai donc utilisé «hello.c» dans le nom de fichier C inférieur et «Hello» dans le nom de classe comme nom de type.
ruby extconf.rb
et lorsque le Makefile est créé, make
.
En passant, même si vous écrivez extconf.rb avant de créer un fichier C, vous pouvez obtenir un Makefile que vous ne pouvez pas créer.
Comme c'est beaucoup, j'écrirai jusqu'au point où je vais l'essayer. Je l'ai écrit dans l'exemple, mais vous pouvez le faire comme suit.
require "./Hello"
hello = Hello::new
hello.methods
#=> [:say, :instance_variable_set, :instance_variable_defined?, ...
# ^Il y a une méthode que j'ai faite ici.
hello.say
#=> "Hello World"
hello.say.class
#=> String
Au début, je me demandais si je devais exécuter un programme écrit en C comme une commande de Ruby, mais j'ai appris que la surcharge de popen est assez importante, j'ai donc décidé de créer une bibliothèque partagée. Si vous ouvrez en un seul coup, vous ne verrez pas beaucoup de frais généraux. Cependant, je pense que cela fait une grande différence que vous l'exécutiez avec popen environ 1000 fois ou que vous chargiez la bibliothèque et l'exécutiez. (Je pense que cela dépend de l'environnement d'exécution) Voici le résultat de l'expérience.
Résultat de l'exécution du programme Hello World C 1000 fois avec popen:
user system total real
Case01 0.125000 0.296875 2.625000 ( 11.617396)
Le résultat de l'exécution de la bibliothèque que j'ai créée cette fois-ci 1000 fois:
user system total real
Case01 0.000000 0.000000 0.000000 ( 0.000436)
1000 bibliothèques que j'ai faites cette fois*Résultat de l'exécution de 1000 fois:
user system total real
Case01 0.109375 0.015625 0.125000 ( 0.130412)
En tant que personne qui utilise Ruby, vous pouvez essayer de trouver la cause de la forte pop de Ruby ...
Recommended Posts