タグ

ブックマーク / gfx.hatenadiary.org (5)

  • Perl XS を書くようになったきっかけ - Islands in the byte stream (legacy)

    THE INTERVIEWS がサービス終了ということで、一つだけ消えるには惜しいというか懐かしい記事があったので少し加筆修正して転載します。JHackers でも似たようなことを話してますね。 Perl XS を書くようになったきっかけ、また、どのようにして今のような XS マジシャンになったのか。そのあたりの事をお聞かせください 2000年頃の話です。ぼくはCGIスクリプトでちょっとしたゲームデータの集計サイトをやりたくてプログラミングを覚えたのでした。これがそこそこ重い処理で、次第にもっと高速にしたいと考えるようになりました。一方、当時ぼくはお金もなくVPSも一般的でなかったので、CGIスクリプトしか選択肢はありません。そこで初心者ながらいろいろ調べることにしました。 とりかかったのは行指向のテキストで保存していたデータをSQLiteにすることでした。しかし当時はWindows上で開

    Perl XS を書くようになったきっかけ - Islands in the byte stream (legacy)
    sassano
    sassano 2013/12/04
  • Pure PerlによるPerl5 Virtual Machineの実装 - Islands in the byte stream (legacy)

    Perl VMの気持ちを知るには、PurePerlで実装してみるとよい。 コード例(PerlVM.pmのコードは記事の末尾にある): #!perl -w use strict; use PerlVM; my $x = shift || 42; PerlVM::call_sv(sub{ print "Hello,", " world!", "\n"; if($x){ print $x, " is true\n"; } else{ print $x, " is false\n"; } }); __END__ 実行結果: $ perl hello.pl Hello, world! 42 is trueむろん、PerlVM::call_sv()の中で引数を呼び出したりはしていない。 Hello, world!くらいならPerlVMの中身も比較的単純だ。そのメカニズムはBモジュールに依存している。B

    Pure PerlによるPerl5 Virtual Machineの実装 - Islands in the byte stream (legacy)
    sassano
    sassano 2009/03/30
  • Perl/XSが得意なこと - Islands in the byte stream (legacy)

    最近ひたすらXSを書いていて思ったのが,XSはやっぱり速いということ。 ただ,いつでも無条件に速いというわけでもなく,何も考えずに書くとPurePerlのコードより遅くなることも珍しくない。実際,最近書いたShikaやMOPのXS版もいきなり高速だったわけではなく,一番最初のコードはPurePerlのほうが10%-30%ほど高速だった。 いろいろベンチマークをとった結果の感触として,XSの得手・不得手が分かってきたのでメモしておく。ちなみに下記で「注意を払う」というのは内部で呼ばれるmalloc()を極力減らすという意味で使っている。SVの生成自体はmalloc()を伴わないことが多い*1が,文字列の生成/連結や配列の生成/push/unshiftでは内部でmalloc()が呼ばれる可能性が高く,速度を落とす原因となる。 得手分野 ループ - XSのループが早いというより,Perlのループ

    Perl/XSが得意なこと - Islands in the byte stream (legacy)
    sassano
    sassano 2009/02/16
  • XSとPuerPerlの二つの実装を持つモジュールの書き方 - Islands in the byte stream (legacy)

    XSとPurePerl(PP)両方の実装を持つモジュールは少なくない。たとえば: Data::Dumper List::Util/Scalar::Util (List-Scalar-Utils) List::MoreUtils Class::MOP Params::Util (>=0.35) Params::Validate Data::Util DBI JSON/JSON::XS Text::CSV/Text::CSV::XS このように一般的に使われることなのだが、その書き方は多様で定説がない。 Data::Dumperは関数を別の名前で用意し、実装を切り替えるインターフェイスを持つ。 List-Scalar-UtilsはXSがデフォルトで、さらにXSでのみ提供している関数があり、そのような関数はインストールの状態によっては利用できない。なお、そのためにTask::Weakenという特

    XSとPuerPerlの二つの実装を持つモジュールの書き方 - Islands in the byte stream (legacy)
    sassano
    sassano 2008/11/29
  • PerlでAssert - Islands in the byte stream (legacy)

    Perl5.9の時点では,assersionsと-Aコマンドラインスイッチという仕組みでCのassert(3)のようなことができるようになるはずだったらしい。しかし,そのメカニズムはPerl5.10には結局採用されなかった。 開発中はassert()が欲しい,しかし,リリース後の実行時パフォーマンスは落としたくない,というのがAssertを考えるときのジレンマというわけだ。そんななかで,CPANのCapr::Assertは関数呼び出しを完全に消し去ることができるので悪くない方法だと思う。 use Carp::Assert; assert($x > 1) if DEBUG; DEBUGはCarp::Assertの提供する定数関数で,その値が偽ならばこの一文はコンパイル時に完全に削除される。 $ PERL_NDEBUG=0 perl -MO=Deparse -MCarp::Assert \ >

    PerlでAssert - Islands in the byte stream (legacy)
    sassano
    sassano 2008/10/24
  • 1