Ruby中使用SWIG编写ruby扩展模块实例
在使用ruby/rails的过程中,确实发现有时性能不尽人意,如生成一个拥有600项的item的3层树形结构目录要花去20ms,为提高性能在学习用c/c++写ruby模块的过程中,认识了swig,rubyInline等一系列帮助编写c/c++来提升ruby性能的辅助工具。
rubyInline用于内嵌c/c++程序,简单快捷,swig则帮助我们更容易地用c/c++写出独立的ruby模块。
swig的入门使用方法
目标:用swig/c++编写一个ruby模块Test,并提供add方法作加法运算。
相关文件:
(1).test.i 接口
(2).test.h 头文件
(3).test.cxx 函数实现
(4).extconf.rb 用于生成makefile
(5).(自动)test_wrap.cxx swig生成的test封装
(6).(自动)Makefile Makefile文件由ruby extconf.rb得到
(7).(自动)test.so ruby模块 由make得到
%module test
%{
//包含头文件
#include "test.h"
%}
//接口add
int add(int,int);
swig -c++ -ruby test.i
得到test封装文件test_wrap.cxx
//test.h
#ifndef _TEST_TEST_H
#define _TEST_TEST_H
extern int add(int,int);
#endif
//test.cxx
#include "test.h"
int add(int left,int right)
{
return left+right;
}
4、编写extconf.rb用于快速生成makefile
代码如下:
require 'mkmf'
dir_config 'test'
#stdc++库,add函数未用到
$libs = append_library $libs,'stdc++'
create_makefile 'test'
运行 ruby extconf.rb 得到 Makefile 文件
5、生成test模块
运行 make 得到模块 test.so
6、测试
irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> Test.add 3,4
=> 7
irb(main):003:0> Test.add 3333333333333333333333,44444444444444444
TypeError: Expected argument 0 of type int, but got Bignum 3333333333333333333333
in SWIG method 'add'
from (irb):3:in `add'
from (irb):3
from :0
irb(main):004:0>
测试成功
7、swig
swig支持很多c++的高级特性来编写ruby的模块,如类,继承,重载,模板,stl等。
8、相关链接
(1).swig
(2).swig/ruby 文档
9、备注
本文的add函数过于简单,对比ruby 3+4性能不升反降。
相关推荐
-
使用Ruby re模块创建复杂的正则表达式
例如,考虑下面的匹配日期的正则表达式: 复制代码 代码如下: /\A((?:19|20)[0-9]{2})[\- \/.](0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])\z/ 使用Re之后,正则表达式可以短小易读的表达式为基础,一步一步地构建出来,例如: 复制代码 代码如下: require 're' include Re delim = re.any("- /.")century_prefix
-
Ruby中关于模块的一些基础知识
模块与类很相似,它也可以说成是"不能被实例化的类".由于Class类是Module类的子类,所以说成是"类=模块+实例化能力"也许更好. 所谓模块,究竟是用来干什么的呢?其作用主要有两大类:Mix-in和命名空间. Mix-in实际上是受限制的多重继承.利用实际做成的继承关系,可以实现对某些类进行一些"点缀"的目的.事实上,Mix-in这种说法就来自于在冰激凌上面的饼干或者坚果. 在面向对象设计的历史中,由多重继承机制造成的问题早已众所周知了.所
-
ruby 模块
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看下去吧. 模块有两种用法.其一是将相近的方法和实体放在一个相对集中的域里.Ruby标准包里的Math模块就扮演着这一角色: ruby> Math.sqrt(2) 1.41421 ruby> Math::PI 3.14159 ::操作符告诉 Ruby 解释器在哪里找常数的值(可以想像,Math外的
-
介绍Ruby中的模块与混合类型的相关知识
模块是组合在一起的方法,类和常量.模块两个主要好处: 模块提供了一个命名空间,并避免名称冲突. 模块实现混合工厂. 模块定义了一个命名空间,一个沙箱中方法和常量可以自由使用,而不必担心踩到其他的方法和常数. 语法: module Identifier statement1 statement2 ........... end 就像被命名为类常量模块中的常量,首字母大写.定义的方法看起来很相似,模块定义方法就像类的方法. 调用一个模块方法和类方法一样,通过模块的名称它名字前,引用一个常数使用该模块
-
Ruby中的block代码块学习教程
1.什么是代码块 在Ruby中,{}或do...end之间的代码是一个代码块.代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用.例如: [1,2,3,4,5].each { |i| puts i } [1,2,3,4,5].each do |i| puts i end 块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数. 竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一
-
详解Ruby中的块的知识
语法: block_name{ statement1 statement2 .......... } 在这里,将学习如何通过使用一个简单的 yield 语句调用块.还将学习使用yield语句具有参数调用块.将检查的示例代码,这两种类型的 yield 语句. yield 语句: 让我们来看看在yield语句的一个例子: #!/usr/bin/ruby def test puts "You are in the method" yield puts "You are again
-
深入理解Ruby中的代码块block特性
block是什么? 在Ruby中,block并不罕见.官方对block的定义是"一段被包裹着的代码".当然,我觉得这样的解释不会让你变的更明白. 对block的一种更简单的描述是"一个block就是一段存储在一个变量中的代码,它和其他的对象一样,可以被随时的运行" 然后,咱们通过看一些代码,之后再把这些代码重构成Ruby中的block形式.通过代码来实际的感受,更加直观. 比如,对两个数做加法? puts 5 + 6 # => 11 嗯,这样写是可以的.但是,
-
Ruby中编写类与模块的风格指南
在 class 定义里使用一致的结构. class Person # extend and include go first extend SomeModule include AnotherModule # constants are next SOME_CONSTANT = 20 # afterwards we have attribute macros attr_reader :name # followed by other macros (if any) validates :name
-
详解Ruby中的代码块对象Proc
Proc对象 Proc是由块转换来的对象.创建一个Proc共有四种方法,分别是: 示例代码 # 法一 inc = Proc.new { | x | x + 1} inc.call(2) #=> 3 # 法二 inc = lambda {| x | x + 1 } inc.call(2) #=> 3 # 法三 inc = ->(x) { x + 1} inc.call(2) #=> 3 # 法四 inc = proc {|x| x + 1 } inc.call(2) #=> 3
-
Ruby中使用SWIG编写ruby扩展模块实例
在使用ruby/rails的过程中,确实发现有时性能不尽人意,如生成一个拥有600项的item的3层树形结构目录要花去20ms,为提高性能在学习用c/c++写ruby模块的过程中,认识了swig,rubyInline等一系列帮助编写c/c++来提升ruby性能的辅助工具. rubyInline用于内嵌c/c++程序,简单快捷,swig则帮助我们更容易地用c/c++写出独立的ruby模块. swig的入门使用方法 目标:用swig/c++编写一个ruby模块Test,并提供add方法作加法运算.
-
Ruby中的字符串编写示例
优先使用 字符串插值 来代替 字符串串联. # bad email_with_name = user.name + ' <' + user.email + '>' # good email_with_name = "#{user.name} <#{user.email}>" # good email_with_name = format('%s <%s>', user.name, user.email) Consider padding string
-
Ruby中的集合编写指南
倾向数组及哈希的字面表示法(除非你需要传递参数到它们的构造函数中). # bad arr = Array.new hash = Hash.new # good arr = [] hash = {} 当你需要元素为单词(没有空格和特殊符号)的数组的时候总是使用 %w 的方式来定义字符串数组.应用这条规则仅仅在两个或多个数组. # bad STATES = ['draft', 'open', 'closed'] # good STATES = %w(draft open closed) 当你需要一个
-
Ruby中字符串左侧补零方法实例
最近有个需求,把数字显示成固定的位数,位数不足的在前面以零补充 比如 5 位: 复制代码 代码如下: 3 -> 00003 292 -> 00292 12422 -> 12422 发现 Ruby 很容易就可以实现了 复制代码 代码如下: irb> "%05d" % 12422 "12422" irb> "%05d" % 22 "00022" 上面的方法基本上是标准作法.如果是直接处理字符串,也可以
-
Android中使用DialogFragment编写对话框的实例教程
Android提供alert.prompt.pick-list,单选.多选,progress.time-picker和date-picker对话框,并提供自定义的dialog.在Android 3.0后,dialog基于fragment,并对之前版本提供兼容支持库,也就是说对于开发者而言,dialog是基于DialogFragment的,但此时需要在应用中加入相关的兼容库. 和Windows或者网页JS的Dialog不同,Android的dialog是异步的,而不是同步的.对于同步的dialog
-
浅析Ruby中的类对象的概念
面向对象的程序涉及类和对象. 一个类是蓝本,从个别对象被创建.在面向对象的术语,我们说小明的自行车是被称为自行车类的对象实例. 任何车辆的例子.它包括轮子,马力,燃油或燃气罐容量.这些特点形成的类车辆的数据成员.可以从其他车辆区分这些特征. 车辆也有一定的功能,如停止,驾驶,超速驾驶.即使这些功能形成的类车辆的数据成员.因此,可以定义一个类作为一个组合的特点和功能. 车辆类可以被定义为: Class Vehicle { Number no_of_wheels Number horsepower
-
进一步深入Ruby中的类与对象概念
Ruby是纯面向对象的语言,所有项目似乎要Ruby中为一个对象.Ruby中的每个值是一个对象,即使是最原始的东西:字符串,数字甚至true和false.即使是一个类本身是一个对象,它是Class类的一个实例.本章将通过所有功能涉及到Ruby的面向对象. 类是用来指定对象的形式,它结合了数据表示和方法操纵这些数据,转换成一个整齐的包.在一个类的数据和方法,被称为类的成员. Ruby类的定义: 定义一个类,定义的数据类型的草图. 这实际上并不定义任何数据,但它定义的类名字的意思什么,即是什么类的对象
-
实例解析Ruby中的数值类型以及常量
数值类型(Number) 整型(Integer) 整型分两种,如果在31位以内(四字节),那为Fixnum实例.如果超过,即为Bignum实例. 整数范围从 -230 到 230-1 或 -262 到 262-1.在这个范围内的整数是类 Fixnum 的对象,在这个范围外的整数存储在类 Bignum 的对象中. 您可以在整数前使用一个可选的前导符号,一个可选的基础指标(0 对应 octal,0x 对应 hex,0b 对应 binary),后跟一串数字.下划线字符在数字字符串中被忽略. 您可以获取
-
实例讲解Ruby中的五种变量
Ruby 全局变量 全局变量以 $ 开头.未初始化的全局变量的值为 nil,在使用 -w 选项后,会产生警告. 给全局变量赋值会改变全局状态,所以不建议使用全局变量. 下面的实例显示了全局变量的用法. #!/usr/bin/ruby $global_variable = 10 class Class1 def print_global puts "Global variable in Class1 is #$global_variable" end end class Class2 d
-
Ruby中的反射(Reflection)应用实例
在Java语言中,提供了发射机制,通过发射机制可以通过字符串构造出这个对象,可以获取对象的所有方法(包括私有方法),可以调用私有方法,可以更改成员变量的值(包括私有的成员变量).Ruby也是面向对象的高级语言,当然也提供了反射机制,今天我们讨论通过类名称构造类对象的功能. 一.通过类名称构造类对象 我们先看普通的构造: 复制代码 代码如下: module ModuleA #the class name, later we will use it to create the correspondi
随机推荐
- 自己动手打造ajax图片上传(网上没有的)
- 部分喷墨机初始化方法
- 我的正则
- iOS实现顶部标签式导航栏及下拉分类菜单
- Python3中的2to3转换工具使用示例
- 快速入门Vue
- PHP中使用CURL模拟登录并获取数据实例
- Python中的random()方法的使用介绍
- jquery 经典动画菜单效果代码
- 用vbs实现更改计算机的说明的代码
- filezilla server 0_9_34 最新版完全安装指南
- nginx学习总结五(nginx反向代理)
- php 模拟POST|GET操作实现代码
- Java并发之BlockingQueue的使用
- 详解Java基础篇--面向对象1(构造方法,static、this关键字)
- 详解Java冒泡排序
- Java中使用StackWalker和Stream API进行堆栈遍历
- 浅谈flask源码之请求过程
- 对Python 数组的切片操作详解
- 详解python3中的真值测试