FFI 테스트

FFI 모듈은 예전에 소개했던 P5NCI처럼 Perl에서 기존에 컴파일된 UNIX의 .so나 Windows의 .dll 같은 공유라이브러리를 호출할 수 있게 해주는 모듈이다

다른 점은 ffcall이라는 라이브러리를 사용하여 P5NCI처럼 호출시 인자의 개수에 제한이 없고 P5NCI가 Windows에서는 제대로 동작하지 않는 데 반해 FFI는 양쪽 모두에서 잘 작동한다.

일단 다음과 같은 과정을 거쳐서 테스트 해봤다.

<mylib.c>
#include<stdio.h>

int multiply_ints(int a, int b, int c, int d)
{
        return (a*b*c*d);
}

<컴파일및 공유라이브러리 생성>
gcc -fPIC -g -c -Wall mylib.c
gcc -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o

<테스트 코드 FFI.pl>
#!/usr/bin/perl
use strict;
use FFI::Library;

my $lib = FFI::Library->new("-lmylib");
my $func = $lib->function("multiply_ints", "ciiiii");

print $func->(1,2,3,4);

<결과>
24

이런식으로 동작한다.

그리고 P5NCI와 성능도 비교해 보았다.

<테스트 코드 P5NCI_vs_FFI.pl>
#!/usr/bin/perl
use strict;
use Benchmark;
use P5NCI::Library;
use FFI::Library;

my $lib = P5NCI::Library->new( library=>'m', path=>'/lib' );
my $lib2 = FFI::Library->new("-lm");

my $func = $lib->load_function("cos", "dd");
my $func2 = $lib2->function("cos", "cdd");

timethese( 1000000, {
        'P5NCI' => sub {
                $func->(3);
                },
        'FFI' => sub {
                $func2->(3);
                },
});

<결과>
Benchmark: timing 1000000 iterations of FFI, P5NCI...
       FFI:  1 wallclock secs ( 0.15 usr +  1.72 sys =  1.87 CPU) @ 534759.36/s (n=1000000)
     P5NCI:  0 wallclock secs ( 0.00 usr +  0.86 sys =  0.86 CPU) @ 1162790.70/s (n=1000000)

호출에 걸리는 속도는 P5NCI가 더 빠르다.

하지만 모듈객체를 생성하고 호출 함수를 등록하는 루틴을 밴치마크에 포함해서 테스트 해봤을 때는 비교할 수 없을 정도로 FFI가 훨씬 빨랐다. 따라서 전체적으로 볼 때 FFI가 더 낫다고 볼 수 있겠다.


0 TrackBacks

Listed below are links to blogs that reference this entry: FFI 테스트.

TrackBack URL for this entry: http://aero.sarang.net/cgi-bin/mt/mt-tb.cgi/46

Leave a comment

About this Entry

This page contains a single entry by aero published on December 27, 2007 4:28 PM.

Perl 5.10 추가된 기능 정리 was the previous entry in this blog.

가속이 붙기 시작하는 Parrot, Perl 6 프로젝트 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Creative Commons License
This weblog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en