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가 더 낫다고 볼 수 있겠다.
다른 점은 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