ffi library: use c extensions in ruby

24
FFI: Библиотека FFI: Использование расширений C в Ruby Александр Косс 6 июня 2009

Upload: sasha-koss

Post on 16-Jan-2017

2.427 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: FFI Library: use C extensions in Ruby

FFI:Библиотека FFI:

Использование расширенийC в Ruby

Александр Косс6 июня 2009

Page 2: FFI Library: use C extensions in Ruby

C + Ruby == ' ' ?

Page 3: FFI Library: use C extensions in Ruby

Зачем?

Скорость выполнения

● Интерпретируемые языки медленнее компилируемых

Функциональность

● Большие возможности● Готовый функционал на языке C

Page 4: FFI Library: use C extensions in Ruby

Что такое эф эф ай?FFI — foreign function interface — это интерфейс вызова функционала написанного на языке отличном от используемого

Pythonapplication

Camllib

Page 5: FFI Library: use C extensions in Ruby

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

Пример работы с Ruby FFI

Page 7: FFI Library: use C extensions in Ruby

Описание C функций

Page 8: FFI Library: use C extensions in Ruby

Типы данных

Page 9: FFI Library: use C extensions in Ruby

Описание C-struct

Page 10: FFI Library: use C extensions in Ruby

Проблемы с C-struct

Проблемы

● Различие между 32-bit и 64-bit платформами● Утечки памяти

Решения

● Явное указание размера указателя (4 / 8 бит)● «Деструкторы»

Page 11: FFI Library: use C extensions in Ruby

Ruby/DL

Page 12: FFI Library: use C extensions in Ruby

Почему FFI?

● Более красивый синтаксис

● Более быстрое обращение к библиотеке

● Несравнимо быстрый вызов функций из динамической библиотеки

Page 13: FFI Library: use C extensions in Ruby

Сравнение быстродействия

Page 14: FFI Library: use C extensions in Ruby

Как проводились тесты

● Сравнение быстродействия C и Ruby

● Сравнение вызова одной «медленной» функции

● Тест производительности вызова функции из динамической библиотеки

Page 15: FFI Library: use C extensions in Ruby

10 000 000 x

a×ba

a−ba

Page 16: FFI Library: use C extensions in Ruby

C vs Ruby

C Ruby0

5

10

15

20

25

30

35

40

4540,12

Page 17: FFI Library: use C extensions in Ruby
Page 18: FFI Library: use C extensions in Ruby

Вызов одной функции C

applicationС.so

● Из C и Ruby (FFI / DL) приложения вызывается «медленная» функция.

● Наглядно показывает нам потери скорости при вызове одной функции C

Page 19: FFI Library: use C extensions in Ruby

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

Большое количество вызовов

● 10 000 000 вызовов C функции

● Наглядно показывает задержку во время обращения к функции

application10 000 000 С

.so

Page 21: FFI Library: use C extensions in Ruby

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

Ruby/DL действительно

медлителен!

Page 23: FFI Library: use C extensions in Ruby

C + Ruby = ?

Page 24: FFI Library: use C extensions in Ruby

C + Ruby = ' ' !