Hello World avec la bibliothèque d'extension Ruby pour le moment

introduction

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 ...

référence

https://ruby-doc.org/core-2.5.3/doc/extension_ja_rdoc.html https://qiita.com/suketa/items/ab6b88093de4a54b3b06

Échantillon fait

https://github.com/hakua-doublemoon/rb_ext_hello

Je vais le faire à la fois

Créer une bibliothèque pour Ruby en C

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);

Créer un Makefile et faire

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.

Essayez de courir

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

Contexte que j'ai fait

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 conclusion

En tant que personne qui utilise Ruby, vous pouvez essayer de trouver la cause de la forte pop de Ruby ...

Recommended Posts

Hello World avec la bibliothèque d'extension Ruby pour le moment
Utilisez une bibliothèque Java externe pour le moment
"Hello world" pour ImageJ avec Eclipse
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment
Première programmation de ma vie Java 1st Hello World
Installez Amazon Corretto (préversion) pour le moment
Exécutez Dataflow, Java, Streaming pour le moment
Hello World avec Micronaut
Essayez d'exécuter Spring Cloud Config pour le moment
Commande pour essayer d'utiliser Docker pour le moment
Mémo à faire pour le moment lors de la construction de la série CentOS 6 avec VirtualBox
Hello World avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Bonjour tout le monde avec VS Code!
Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
Hello World avec Spring Boot
Hello World avec SpringBoot / Gradle
Avec le logiciel que je fais depuis longtemps ...
Bonjour tout le monde! Avec Asakusa Framework!
Modéliser Digimon avec DDD pour la première fois Partie 1
Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
Essayez HelloWorld avec la configuration minimale de Heroku Java spring-boot
Spring Boot pour la première fois
Hello World pour le plugin Java ImageJ
Jusqu'à "Hello World" avec Spring Boot
Programmation avec ruby (en route)
Bonjour tout le monde avec Kotlin et JavaFX
Hello World avec Docker et langage C
(Intellij) Hello World avec Spring Boot
Hello World avec GlassFish 5.1 + Servlet + JSP
Créez un PDF avec itext7 ~ HelloWorld ~
Spring AOP pour la première fois
Hello World avec GWT 2.8.2 et Maven
Expérimentons le flux d'octroi de code d'autorisation avec Spring Security OAuth-Partie 2: Créer une application pour le moment
Construire un serveur DLNA sur Ubuntu (il suffit de bouger pour le moment)
Java12 est sorti, alors j'ai essayé l'expression switch pour le moment
Liste de réglages de Glassfish que je souhaite conserver pour le moment
Premiers pas avec Ruby pour les ingénieurs Java
Introduction à Java pour la première fois # 2
Hello World avec Eclipse + Spring Boot + Maven
Bonjour tout le monde!
Bonjour tout le monde avec le moteur de modèle Java Thymeleaf
Développement Java avec Codenvy: Hello World! Run
"Hello, World!" Avec Kotlin + CLI en 5 minutes
Bonjour tout le monde avec Kotlin et Tornado FX
Apprendre pour la première fois java [Introduction]
Comment Spring Security fonctionne avec Hello World
(IntelliJ + gradle) Hello World avec Spring Boot
Utilisez la méthode l pour la notation temporelle
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Hello World, une application d'interface graphique multiplateforme avec Groovy fonctionnant sur la plate-forme Java
[Ruby] Définissez la hiérarchie en même temps que l'initialisation de Hash avec la méthode tap
[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle