ffi library: use c extensions in ruby
TRANSCRIPT
![Page 1: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/1.jpg)
FFI:Библиотека FFI:
Использование расширенийC в Ruby
Александр Косс6 июня 2009
![Page 2: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/2.jpg)
C + Ruby == ' ' ?
![Page 3: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/3.jpg)
Зачем?
Скорость выполнения
● Интерпретируемые языки медленнее компилируемых
Функциональность
● Большие возможности● Готовый функционал на языке C
![Page 4: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/4.jpg)
Что такое эф эф ай?FFI — foreign function interface — это интерфейс вызова функционала написанного на языке отличном от используемого
Pythonapplication
Camllib
![Page 5: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/5.jpg)
Ruby FFI
● Автор — Wayne Meissner (+ 42 участника)● http://kenai.com/projects/ruby-ffi● sudo gem install ffi
AppС.so
Matz's Ruby
Rubinius
jRuby
![Page 6: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/6.jpg)
Пример работы с Ruby FFI
![Page 7: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/7.jpg)
Описание C функций
![Page 8: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/8.jpg)
Типы данных
![Page 9: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/9.jpg)
Описание C-struct
![Page 10: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/10.jpg)
Проблемы с C-struct
Проблемы
● Различие между 32-bit и 64-bit платформами● Утечки памяти
Решения
● Явное указание размера указателя (4 / 8 бит)● «Деструкторы»
![Page 11: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/11.jpg)
Ruby/DL
![Page 12: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/12.jpg)
Почему FFI?
● Более красивый синтаксис
● Более быстрое обращение к библиотеке
● Несравнимо быстрый вызов функций из динамической библиотеки
![Page 13: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/13.jpg)
Сравнение быстродействия
![Page 14: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/14.jpg)
Как проводились тесты
● Сравнение быстродействия C и Ruby
● Сравнение вызова одной «медленной» функции
● Тест производительности вызова функции из динамической библиотеки
![Page 15: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/15.jpg)
10 000 000 x
a×ba
a−ba
![Page 16: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/16.jpg)
C vs Ruby
C Ruby0
5
10
15
20
25
30
35
40
4540,12
![Page 17: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/17.jpg)
![Page 18: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/18.jpg)
Вызов одной функции C
applicationС.so
● Из C и Ruby (FFI / DL) приложения вызывается «медленная» функция.
● Наглядно показывает нам потери скорости при вызове одной функции C
![Page 19: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/19.jpg)
C vs Ruby FFI vs Ruby/DL
C Ruby FFI Ruby/DL0,35
0,36
0,36
0,37
0,37
0,38
0,38
0,36 0,36
0,38
![Page 20: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/20.jpg)
Большое количество вызовов
● 10 000 000 вызовов C функции
● Наглядно показывает задержку во время обращения к функции
application10 000 000 С
.so
![Page 21: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/21.jpg)
C vs Ruby FFI vs Ruby/DL
C Ruby FFI Ruby/DL0
10
20
30
40
50
60
70
4,83
16,38
65,97
![Page 22: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/22.jpg)
Ruby/DL действительно
медлителен!
![Page 23: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/23.jpg)
C + Ruby = ?
![Page 24: FFI Library: use C extensions in Ruby](https://reader033.vdocuments.site/reader033/viewer/2022042907/587c2dbd1a28aba0118b5db3/html5/thumbnails/24.jpg)
C + Ruby = ' ' !