2008-01-01から1年間の記事一覧

定数関数の威力

JPerl Advent Calendar 2008 第一日目でも紹介されているように,特殊な方法で宣言した関数*1は定数関数として特別に処理され,コンパイル時に展開される。しかし,定数の展開はコンパイル時にしか行われない。つまり,実行時に呼び出す実体が決まるメソッド…

Class::MOP::is_class_loaded()のXS版

書いた。これはまさにXSが最適なケースで,Pure Perl版より16-24倍ほど速い。 For "strict": Rate pp xs pp 3692/s -- -96% xs 90163/s 2342% -- For "Class::MOP::Method": Rate pp xs pp 2999/s -- -96% xs 75188/s 2407% -- For "Foo::Bar", which does n…

reduceの解釈

List::Utilのreduce()が何をするかやっと分かった気がする。http://perl-users.jp/articles/advent-calendar/2008/20.html でもって、reduce は初期要素、つまり $a の最初の値を指定できます。 つまりこういうことだね。 package Foo; use Moose; use List:…

モダンなXSの書き方

PerlのソースコードはPerl言語以上に変化が大きく,それに伴ってXSの書き方もだいぶ変わってきている。新しいAPIを使ったほうが可読性がよかったり高速だったり使いやすかったりする。たとえば,スカラー(SV)から文字列(PV: pointer valueつまりchar*)を得る…

Taintモードの振る舞い

Taintモードの振る舞いがよく分からない。 $ perl -Te 'eval "" if $^X' Insecure dependency in eval while running with -T switch at -e line 1. $ perl -Te 'require strict if $^X' Insecure dependency in require while running with -T switch at -e…

XSを書く難しさ

最近思うが,つくづくXSは難しい。いとも簡単にSEGVを起こし,デバッグが難しく,それゆえモジュール作者のやる気が失われたときのリスクが非常に大きい。そうやって多大なリスクを犯してXSを書いても,肝心の速度がPurePerl以上に遅いことも少なくない。最…

__PACKAGE__がうざいときにuse component;

DBIx::Classのシンタクスシュガーがほしいについて。とりあえずJifty::DBIとData::Modelについてはいずれ調べるとして,クラスメソッドのシンタクスシュガーを一般化するモジュールを書いた。CPANにあげるようなものではないけど。 http://svn.coderepos.org…

Shika XS accessor

ShikaにXS Accessorを実装したのでClass::XSAccessorと比較してみました。 Shika/trunk $ perl -Mblib benchmark/accessor.pl Perl 5.008005 on linux Shika/0.01_01 Moose/0.63 Class::XSAccessor/0.14 ------------------ new,set,get*10 Rate ShikaPP Moo…

Perlの数値処理

Data::Util::is_number()を実装すべく数値処理を調べていたらPerlの暗黒面を覗いてしまった。Perlの数値処理ルーチンは,Perl Parserが行うリテラルの処理と,Perl_grok_*を中心とした数値変換ルーチンが行う処理がある。この記事では便宜的に,前者で処理で…

DBIx::Classのシンタクスシュガーがほしい

Mooseに慣れた目でDBIx::Classを見てみると… package DB::Main::Artist; use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/PK::Auto Core/); __PACKAGE__->table('artist'); __PACKAGE__->add_columns(qw/ artistid name /); __PACKAGE__->set_pr…

XSでクロージャ

Perlのようにクロージャをサポートする言語では,eval()せずに実行時にサブルーチンを定義できるので大変便利である。しかし,Cではポータブルにクロージャを作る方法はないので,サブルーチンの動的定義とXSによる高速な実装は相容れないように見える。しか…

「Perl/XSが得意なこと」の補足

Perl/XSが得意なことはほとんどオレオレ用語といっていいくらい端折ったリストなので追々補足しておく。 まずひとつ,「注意を払う」というのは内部で呼ばれるmalloc()を極力減らすという意味と書いたが,よく考えてみればこれはmalloc()*1が遅いというのが…

Perl/XSが得意なこと

最近ひたすらXSを書いていて思ったのが,XSはやっぱり速いということ。ただ,いつでも無条件に速いというわけでもなく,何も考えずに書くとPurePerlのコードより遅くなることも珍しくない。実際,最近書いたShikaやMOPのXS版もいきなり高速だったわけではな…

Shibuya.pm #10 LT Acme::Don't 2.0 発表資料

LTの資料アップロードしました。 http://coderepos.org/share/browser/docs/gfx/Shibuya.pm-10/AcmeDont.pdf 初めてCodeRepos使ってみました。ついでに改めてちょっとだけ自己紹介します。まず名前ですが,gfxと書いてゴローとでも読んでください。専攻は心…

XSとPuerPerlの二つの実装を持つモジュールの書き方

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:…

Shika - Yet another class builder

要はMooseっぽい記法でプロパティ*1を定義できるクラスビルダーで、__PACKAGE__とかいらないのでClass::Accessorより簡単らしいよ。id:tokuhiromに呼ばれたのでXSコード書きます。そういうわけで、希望としては効率よりも可読性重視でよろしく。ところで、mr…

Shibuya.pm #10

LTで発表してきました。充実した半日でした!Acme::Don'tのソースコードあります。 資料はまた後ほど。

自分が書いたコードの品質を説明しなければならないとき

たとえば、新機能を提供するパッチを送るときなどに、どうやってコードの品質を説明したらいいんだろうか。今まではそういうことは少なかったけど、最近そういう機会が時々あるので、そろそろ考えておいたほうがよさそうだ。 既存のテストが通るか(既存のテ…

Fast Method Modifiers

Data::Util 0.29_01にcurry()とwrap_subroutine()*1,subroutine_modifier()*2を追加して,そのデモとしてData::Util::MethodModifiersを実装したよ! #!perl -w use strict; { package Foo; use Data::Util::MethodModifiers; before foo => sub{ print "be…

「パッチの拒否率をさげる10の方法」に照らして

Class::MOPのパッチを報告した後で,そういえばどこかにパッチを送る際の注意点を読んだな,ということを思い出した。 パッチの拒否率をさげる10の方法 (id:tokuhirom) チェックしてみると… svn HEAD でパッチをつくる -> △ CPANの最新版との差分にした 作者…

Class::MOP::Method::WrappedのXS化

コメントによれば,Class::MOP::Method::Wrapped->add_around_modifier()も最適化の候補らしいので,今XSで書いてます。 今のところサブルーチンの生成で50%以上,実行でも20-50%ほど高速化できた。ところが!PerlMagicを駆使したコードなのでメンテナンス性…

Class::MOP::Class->get_method_map()の挙動が不安定な件

get_method_map()は基本的にサブルーチンスタブ(宣言のみで実体なし)を拾わないようになっているんだけど,実際にはプログラムの状態によってスタブを拾ったり拾わなかったりと安定しない*1。特に,Devel::Coverの元で動かすとこの「拾ったり拾わなかったり…

Shibuya.pm #10行きます

id:TAKESAKOさんのご好意でShibuya.pm #10に行けることになりました。 ありがとうございます!!!というわけで,LTで話します。内容はAcme::Don't 2.0について。Acme::Don't 2.0はPerlの構文木を走査するコードなんですが,これが生まれたのはそもそも,前…

Class::MOP::Class->get_method_map()のXS版

Class::MOP::Class->get_method_map()書きました。add_method()は入れてません。 ベンチマーク(5.8.9 on linux, without threads, -DDEBUGGING): Initialization: Rate pp xs pp 2595/s -- -18% xs 3169/s 22% -- Looking into the stash: Rate pp xs pp 219…

Shibuya.pm #10行きたい(けど行けない)

Shibuya.pm行きたいなー。 Acme::Don't 2.0 - Bで覗くPerlの深淵 warnings::unused, warnings::method, indirect - コードの品質をチェックしながらプログラムを実行する XSを書くときの覚書 すぐにでも用意できるネタはこのくらいか。 でもお金がないから行…

Class::MOP::Class->add_method()のXS版のベンチマーク

Class::MOP::Class->add_method()のXS版のベンチマーク Perl/5.8.9 on linux, Class::MOP/0.7 Benchmark for add_method() For method object Rate pp xs pp 20096/s -- -17% xs 24093/s 20% -- For code reference Rate xs pp xs 5239/s -- -58% pp 12444/s…

Class::MOP::Class->add_method()のXS版

昨日XSで書くといったのはget_method_map()だったんだけど,ちょっとした勘違いでadd_method()をXSで書いてしまった…。せっかくだからあとでRTで報告しよっと。オリジナルと異なるのは,add_package_symbol()を呼ばずにサブルーチンをインストールしている*1…

Mooseのボトルネック

Mooseの速度改善の一助になればと思ってData::Utiを書いているのが,最近だいぶ機能が増えてきた。 今のところ,Params::Util+Sub::Identify+Sub::Install+Sub::Delete+Data::OptList+αという感じ。全て基本はXSで,コンパイラの無い環境のためのPurePerl実…

パッケージ名についてP5Pに投稿した件の覚書

パッケージ名の一貫性を求む!について。少し時間があったのでどうしても気になっていたことをP5Pに投稿した。…のだけど,いくつかの論点があったのだけどあまり整理し切れないまま投稿してしまったので整理しておく。論点は以下の3つ。 PerlQuiz - package…

perl 5.8.9 RC1

perl 5.8.9 RC1がきた。 しかし… $ ~/bin/perl -MO=Deparse,-p -e 'foreach my $a(1){}' foreach my($a) (1) { (); } -e syntax OKそういえばこのバグは報告してなかった。他にも報告したいことが数個あるけどこの段階ではもう無理かなあ。 いずれにせよレポ…