Upload
sasha-koss
View
2.427
Download
1
Embed Size (px)
Citation preview
FFI:Библиотека FFI:
Использование расширенийC в Ruby
Александр Косс6 июня 2009
C + Ruby == ' ' ?
Зачем?
Скорость выполнения
● Интерпретируемые языки медленнее компилируемых
Функциональность
● Большие возможности● Готовый функционал на языке C
Что такое эф эф ай?FFI — foreign function interface — это интерфейс вызова функционала написанного на языке отличном от используемого
Pythonapplication
Camllib
Ruby FFI
● Автор — Wayne Meissner (+ 42 участника)● http://kenai.com/projects/ruby-ffi● sudo gem install ffi
AppС.so
Matz's Ruby
Rubinius
jRuby
Пример работы с Ruby FFI
Описание C функций
Типы данных
Описание C-struct
Проблемы с C-struct
Проблемы
● Различие между 32-bit и 64-bit платформами● Утечки памяти
Решения
● Явное указание размера указателя (4 / 8 бит)● «Деструкторы»
Ruby/DL
Почему FFI?
● Более красивый синтаксис
● Более быстрое обращение к библиотеке
● Несравнимо быстрый вызов функций из динамической библиотеки
Сравнение быстродействия
Как проводились тесты
● Сравнение быстродействия C и Ruby
● Сравнение вызова одной «медленной» функции
● Тест производительности вызова функции из динамической библиотеки
10 000 000 x
a×ba
a−ba
C vs Ruby
C Ruby0
5
10
15
20
25
30
35
40
4540,12
Вызов одной функции C
applicationС.so
● Из C и Ruby (FFI / DL) приложения вызывается «медленная» функция.
● Наглядно показывает нам потери скорости при вызове одной функции C
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
Большое количество вызовов
● 10 000 000 вызовов C функции
● Наглядно показывает задержку во время обращения к функции
application10 000 000 С
.so
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
Ruby/DL действительно
медлителен!
C + Ruby = ?
C + Ruby = ' ' !