Inline::C

最終更新日時:2010-05-25 18:43:41
Perl

概要


Inline C 宣言することにより、Perl 内にC言語コードを埋め込むことが出来ます。
これによりピンポイントで高速化ができますので、性能要件が厳しいプログラムを Perl で作成する際に非常に役立ちます。

使用方法


以下、Inline::C を使用した例です。

 use Benchmark;
 use Inline "C";
 
 my $VAL = 1;
 timethese(10000000, { increment   => \&test1_sub,
                       add         => \&test2_sub,
                       c_increment => \&test3_sub,
                       c_add       => \&test4_sub,
                     } );
 
 sub test1_sub {
    my $r = $VAL;
    for my $i (1..10) {
        $r ++;
    }
    return $r;
 }
 
 sub test2_sub {
    my $r = $VAL;
    for my $i (1..10) {
        $r = $r + 1;
    }
    return $r;
 }
 
 sub test3_sub {
    my $r = $VAL;
    return c_test3_sub($r);
 }
 
 sub test4_sub {
    my $r = $VAL;
    return c_test4_sub($r);
 }
 
 __END__
 __C__
 
 int c_test3_sub(int v) {
    int i;
    for(i=1; i <= 10; i ++) {
        v++;
    }
    return(v);
 }
 
 int c_test4_sub(int v) {
    int i;
    for(i=1; i <= 10; i ++) {
        v = v + 1;
    }
    return(v);
 }


ちなみに実行結果は以下のような感じ。
単純に10回インクリメントするようなプログラムでも驚くほどの差が出ますね。

         add: 26 wallclock secs (25.69 usr +  0.01 sys = 25.70 CPU) @ 389105.06/s (n=10000000)
       c_add:  3 wallclock secs ( 3.17 usr +  0.00 sys =  3.17 CPU) @ 3154574.13/s (n=10000000)
 c_increment:  3 wallclock secs ( 3.10 usr +  0.00 sys =  3.10 CPU) @ 3225806.45/s (n=10000000)
   increment: 23 wallclock secs (22.37 usr +  0.00 sys = 22.37 CPU) @ 447027.27/s (n=10000000)


お問い合わせは 掲示板 にて。