タグ

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

  • ホットスポットを最適化する - Islands in the byte stream (legacy)

    最適化するのに相応しいサブルーチンのみ最適化できるように,optimizer::hotspotというモジュールを考えてみた。まだCPANクオリティではないのでgithubのみ。 http://github.com/gfx/Perl-optimizer-hotspot 仕組みとしては,PL_peeppをフックして,生成されるサブルーチンの頭にホットスポット計測のためのopcode*1を仕込み,そのopcodeが一定数呼ばれると,最適化器*2を起動するというものだ。 最適化の基は,いまのところ特定パターンをもつ構文木を高速な一つのノードに置き換えるというもの。少し実装してみたところ,以下のような結果となった。 benchmarks/arbit.pl # 's' represents 'single-threaded' $ sperl -Mblib benchmarks/arbit.pl Pe

    ホットスポットを最適化する - Islands in the byte stream (legacy)
  • XS基礎文法最速マスター - Islands in the byte stream (legacy)

    元ネタ:Perl基礎文法最速マスター(id:perlcodesample) XSを始めるための手順といくつかの要素の解説です。C言語をある程度知っている人でも,これを読んだだけでXSの基礎をマスターしてXSを書くことができるようにはなっていません。リファレンスでもありません。 XSとは,狭義ではPerlでエクステンションを書くためのマクロ言語の名前ですが,広義ではエクステンションを書くための技術の総称です。ここでは,広義のXSを俯瞰します。 XSはいろいろと特殊なのでテンプレは無視で行きます。 目次: h2xsで空のディストリビューションを作る XSファイルの構成 スレッドコンテキスト SVファミリ GCとスコープ さらなる学習のために h2xsで空のディストリビューションを作る 以下のコマンドで空のXSディストリビューションを作ることができます。 h2xs -A -b 5.8.1 -n

    XS基礎文法最速マスター - Islands in the byte stream (legacy)
  • What's your clone policy? - Data::Clone - Islands in the byte stream (legacy)

    複雑なデータ構造のコピーにはStorable::dclone()やClone::clone()がよく使われてきた。しかし,これらのクローンポリシーには疑問がある。そこで,新しいクローンモジュールを書いてみた。 Data::Clone - search.cpan.org Data::Clone - github.org さて,まずStorableのポリシーはおおむね以下の通り: リファレンスはすべて深いコピー(deep copy) スカラー値に対しては,Perlレベルでの代入に等しい操作を行い,マジックは無視する オブジェクトに対しては,フックが定義されていればそれを使い,未定義であればその他のリファレンスと同じように扱う 次に,Cloneのポリシーはおおむね以下の通り: リファレンスはすべて深いコピー スカラー値に対しては,マジックも含めて可能な限りコピーする オブジェクトもその他のリファ

    What's your clone policy? - Data::Clone - Islands in the byte stream (legacy)
  • 2009年を振り返る - Islands in the byte stream (legacy)

    今年の総括として、Perlとの関わりを振り返ってみる。 Perl Modules Pure PerlによるPerl5 Virtual Machineの実装がなんといっても思い出深い。おかげでPerlプログラムの実行が具体的にイメージできるようになった。 B::Foreach::Iteratorでforeachイテレータを進めるのはAcme::Perl::VMで培った知識によるハックである。 Test::LeakTraceはそこそこ有用だが、やや使いにくい。しかし、Devel::LeakTrace(::Fast)?を使うくらいならこちらのほうが高速で精度も高く、使いやすさもマシである。 Scalar::Aliasは面白い試みだが、黒魔術が過ぎるか。 ShipIt::Step::ChangeAllVersionsはModule::Setupのテンプレに組み込んであるので最近のモジュールでは必ず

    2009年を振り返る - Islands in the byte stream (legacy)
  • Set the entry point in PSGI - Islands in the byte stream (legacy)

    PSGIスクリプトはコードリファレンスを返さなければならないということで,スクリプトを以下のようなレイアウトにしなければならないと考えがちだ。 #!perl-w use strict; [モジュールのロード] [ユーティリティ関数群] sub { [メインルーチン] }; __END__ しかしPSGIの要求はコードリファレンスであって,必ずしも無名関数である必要はない。むしろ,メインルーチンにも名前が付いていたほうがデバッグ等がしやすいのではないかと思う。 そこで,以下のように名前付き関数をエントリポイントにするというレイアウトを提案する。 #!perl-w use strict; [モジュールのロード] sub psgi_main { [メインルーチン] } [ユーティリティ関数群] return \&psgi_main; __END__ ポイントは,最後の return \&psgi

    Set the entry point in PSGI - Islands in the byte stream (legacy)
  • Mouse 0.42 "Mouse::XS" released - Islands in the byte stream (legacy)

    I have released Mouse 0.42 "Mouse::XS". http://search.cpan.org/dist/Mouse/ From this version, Mouse generates constructors, destructors, and accessors in XS. These generated mehtods are much faster than pure Perl methods, especially in attributes with type constraints. How fast is it? Accoding to a benchmark for HTTP::Engine, Mouse::XS is about 100% faster than Mouse::PurePerl in command line appl

    Mouse 0.42 "Mouse::XS" released - Islands in the byte stream (legacy)
  • RFC: A new syntax to give a method an extra block - Islands in the byte stream (legacy)

    In Shibuya.pm#12, I have proposed a new syntax to Perl, which allows to give a method an extra block like Ruby. For example: File->open('<', $file) { my($io) = @_; $io->grep{ /^foo/ }->each{ say @_ }; }; This is simply interpreted as: File->open('<', $file, sub{ my($io) = @_; $io->grep(sub { /^foo/ })->each(sub { say @_ }); }); This is only a sugar to the Perl syntax. That is, we need not add any

    RFC: A new syntax to give a method an extra block - Islands in the byte stream (legacy)
  • Perl Advent Calendars 2009 - Islands in the byte stream (legacy)

    今年のPerl Advent Calendarをまとめてみました。 Perl Advent Calendar 2009 JPerl Advent Calendar 2009 Hacker Track - JPerl Advent Calendar 2009 Casual Track - JPerl Advent Calendar 2009 DBIx::Skinny - JPerl Advent Calendar 2009 Data::Model Track - JPerl Advent Calendar 2009 http://opensource.kayac.com/ja/projects/ark/advent/2009/ Catalyst Advent Calendar RJBS Advent Calendar 2010 Perl 6 Advent Calendar | Somethi

    Perl Advent Calendars 2009 - Islands in the byte stream (legacy)
  • Now Text::MicroTemplate is even faster than HTML::Template::Pro - Islands in the byte stream (legacy)

    前提:Text::MicroTemplateの速度を簡単にベンチマーク Text::MicroTemplateを最適化したので,ベンチマークをとってみた。 スクリプトはほぼ同じだが,loop countは-1*1にした。 http://github.com/kazuho/p5-text-microtemplate/blob/master/author/benchmark_templates.pl キャッシュを有効にした結果*2: $ perl benchmark_templates.pl Perl/5.10.1 (i686-linux) HTML::Template/2.9 HTML::Template::Compiled/0.94 HTML::Template::Pro/0.92 Template/2.22 Text::MicroTemplate/0.09 Benchmark: runn

    Now Text::MicroTemplate is even faster than HTML::Template::Pro - Islands in the byte stream (legacy)
  • How fast Mouse-XS in applications - Islands in the byte stream (legacy)

    v0.40_06から,Mouseが生成するコンストラクタとデストラクタもXSになった。Mouseが生成するアクセサはすでにXS化しているので,かなりのパフォーマンスが期待できるようになったはずだ。 しかし,いくらコンストラクタやアクセサといった部品が速くても,アプリケーションが高速にならなければ意味がない。 そこで,Any::Mooseを使ったモジュールであるHTTP::Engineで,PP版とXS版の速度差を比較してみた。 結果: Perl/5.10.1 (i686-linux) load HTTP::Engine, new(), and run() Rate PP XS PP 789/s -- -55% XS 1748/s 122% -- load HTTP::Engine, new(), and run() * 100 Rate PP XS PP 16.7/s -- -20% XS

    How fast Mouse-XS in applications - Islands in the byte stream (legacy)
  • eval "use $module" in Perl_call_sv() could segmentation faults - Islands in the byte stream (legacy)

    Data::Utilのmethod modifiersが落ちる件は,Perlコアのバグであるようだ*1。perlPerl_call_sv()でサブルーチンを呼び出すときに,そのサブルーチンがディレクティブを含んだeval()を実行し,そのuseディレクティブが例外を放出すると*2,setjmp(3)がSEGVを起こしたり黙って落ちたりするようだ。 この問題はPerl_call_sv()を使っているXSコードで起きやすいが,以下のコードで示すようにPure Perlでも発現する可能性がある。 再現コード: #!perl -w use strict; use Test::More tests => 3; { package T; use Tie::Hash(); use base qw(Tie::StdHash); sub FETCH{ my($self, $key) = @_; # XXX

    eval "use $module" in Perl_call_sv() could segmentation faults - Islands in the byte stream (legacy)
  • Perl 5.11.0 features on the syntax - Islands in the byte stream (legacy)

    Perl 5.11.0がリリースされたので,perl5110deltaから構文的な変更をいくつか拾ってみた。 Implicit strictures "use 5.11.0" はstrictも有効にするようになった The yada yada operator ('...') 未実装の機能を示す組み込み演算子が追加された each is now more flexible my($index, $value) = each @array ができるようになった keys @array, values @arrayもできるようだ delete local delete local $foo{bar} ができるようになった なお,これらは5.12.0へ向けた変更ではあるが,必ずしも5.12.0に入るとは限らない。 See also perl5110delta.

    Perl 5.11.0 features on the syntax - Islands in the byte stream (legacy)
    makamaka_at_donzoko
    makamaka_at_donzoko 2009/10/06
    Yada::Yada::Yada Acme::BlahBlahBlah
  • [Perl]UTF8-flagged strings affects regexps with the "i" modifier - Islands in the byte stream (legacy)

    HTML::FillInForm::Liteの使いどころという記事で,HTML::FillInForm::Liteが遅いということが取り上げられていた。 試しに記事内のベンチマークを行ったところ,確かに遅い。 # HTML::FillInForm 1.06 Benchmark: HTML::FillInForm vs. HTML::FillInForm::Lite Rate fillinall_lite fillinall fillinpart_lite fillinpart fillinall_lite 570/s -- -52% -76% -78% fillinall 1199/s 110% -- -49% -54% fillinpart_lite 2349/s 312% 96% -- -9% fillinpart 2595/s 355% 116% 10% --ところで,このベンチマー

    [Perl]UTF8-flagged strings affects regexps with the "i" modifier - Islands in the byte stream (legacy)
  • Results from JPA sponsorships of Moose/Class::MOP - Islands in the byte stream (legacy)

    Moose/Class::MOP開発スポンサー (JPA Sponsors Moose/Class::MOP Work)の報告です。 まずは現状ですが,Moose 0.90/Class::MOP 0.93のロード時間が約176msであるのに対し,ベースラインとしたMoose 0.88/Class::MOP 0.89のロード時間が約209msであるので,約18%高速になっています。当初の目的が20%以上であるので,目標値には達しなかったことになります。しかし,現状では作成中のブランチすべてが取り込まれたわけではないため,ゆくゆくはさらに高速になる見込みです。 今回行った高速化に大きく寄与したのは次の二点です。 ボトルネックであったget_method_map()をできるだけ使わないようにした(C::MOP) C::MOPが生成するコードの一部を手で展開し,実行時evalを減らした(C::MO

    Results from JPA sponsorships of Moose/Class::MOP - Islands in the byte stream (legacy)
  • My document for YAPC::Asia 2009 - Islands in the byte stream (legacy)

    まもなくYAPC::Asia 2009が開催しますね。私の発表の資料は以下の場所に置き,順次更新する予定です。 git://github.com/gfx/YAPC-Asia-2009-gfx.git よろしくお願いします。 (12日 追記) 順次更新とはいきませんでしたが,発表に使ったスライドを二つ(PerlMaigicIntroとMooseHackingGuide),MS Power Point形式でアップロードしました。

    My document for YAPC::Asia 2009 - Islands in the byte stream (legacy)
  • Mooseの速度が遅いという議論のまとめと感想 - Islands in the byte stream (legacy)

    Adam Kennedy (ADAMK)が「Array::CompareでMooseを使わないようにしてくれ」とRTでチケットを作成したことがきっかけとなり,Mooseの速度について議論が起きています。以下ラフなまとめ。 #49270: Remove the use of Moose - RT Array::CompareではMooseを使わないでほしい。Mooseを使いつづけるならばコマンドラインアプリケーションでは使うに堪えないし,PadreでもArray::Compare依存をなくすつもりだ。 Moose or No Moose - Perl Hacks (Array::Compareの作者ブログ) 最近いくつかのモジュールをMoose化しはじめたのだが,「Mooseを使うな」と言われてしまった。Mooseは楽なので使い続けたいが,どうしたものか。 Re: Moose Or No M

    Mooseの速度が遅いという議論のまとめと感想 - Islands in the byte stream (legacy)
  • Released CvGVs could cause SEGV - Islands in the byte stream (legacy)

    型グロブの内部表現であるGVは,そのシンボルで表現されるグローバルなスカラー(SV),配列(AV),ハッシュ(HV),サブルーチン(CV),ファイルハンドル(IO)などのオブジェクトを所有するオブジェクトである。 この「所有」とは,実際にSVへの参照(ポインタ)を持っているという意味のほかに,リファレンスカウントを管理する責任があるという意味もある。つまり,GVが解放された時には,所有しているすべてのSVのリファレンスカウントをデクリメントする。 ところで,他のSVファミリと異なり,CVだけはどのGVに所有されているかを知っている。つまり,CV構造体は所有者であるGVを参照するフィールドを持つ。これにより,Sub::Identityが提供するget_code_info()のようなことが可能となっている。 しかし,もしCVもまたGVを「所有」しているとすれば,それは循環参照になってしまう。こ

    Released CvGVs could cause SEGV - Islands in the byte stream (legacy)
    makamaka_at_donzoko
    makamaka_at_donzoko 2009/06/28
    "GVは","リファレンスカウントを管理する責任がある" / "CVだけはどのGVに所有されているかを知っている","つまり", "循環参照になってしまう。これを防ぐためには,GVへの参照は「弱い」","これが現在のperlの実装"
  • The history of wantarray() - Islands in the byte stream (legacy)

    void context + BEGIN の horror 的ななにかで指名されたので答えるよ。 疑問点をまとめると以下の二点ということでいいですか。 なぜ特殊コードブロックの呼び出しコンテキストは不定とされているのか なぜ特殊コードブロックが実際にはスカラーコンテキストで呼ばれるのか 結論からいうと,第一の疑問の答えは,特殊コードブロックを呼び出すcall_list()内のcall_sv()においてコンテキストフラグを与えていないからです。第二の疑問の答えは,call_sv()のデフォルトコンテキストがG_SCALARだからです。 まずそもそもwantarray()の歴史を振り返ると,初期のPerlにはvoid contextは存在しなかったわけですよ。 Perl 5.003_07のperlfunc -f wantarray: Returns TRUE if the context of

    The history of wantarray() - Islands in the byte stream (legacy)
  • Optimization of sort() - Islands in the byte stream (legacy)

    Perlの最適化器はかなり頑張ってsort()の最適化を試みている。具体的には,配列をその場で直接ソートする場合,数値または整数でソートする場合,ソートブロックの$aと$bを単純に入れ替えた場合において,最適化された高速なバージョンが使われる。 以下はすべて5.10.0で確認した。 配列を直接ソートする場合 ソート後のリストを元の配列に代入するケース(たとえば"@array = sort @array")では,sort()に渡された配列を直接並び替えるため,メモリと速度の両方で勝る。 確認コード: $ perl -MO=Concise,-exec -e '@a=sort@a' # ... 7 <@> sort lK/INPLACE # ... ソートオペレータにおける「INPLACE」というフラグがこの最適化の表れである。 数値でソートする場合 ソートブロックでの数値による比較(たとえば"

    Optimization of sort() - Islands in the byte stream (legacy)
  • サブルーチンのアトリビュートの信頼性 - Islands in the byte stream (legacy)

    Perl 5.6.0以降にはアトリビュート(Attribute)というメカニズムがあり,変数やサブルーチンの宣言時に呼び出されるコールバックを設定できる*1。 このアトリビュートは実験的に取り入れられたのちに放置されるという不幸な運命をたどってしまい,現状では活用するのが難しい。特に,サブルーチンアトリビュートの扱いは非常に難しく,使用に際しては様々な問題がある*2。 一つの大きな問題は,アトリビュートハンドラが呼び出されるタイミングである。アトリビュートハンドラはサブルーチンオブジェクトの構築中*3に呼び出されるのだが,サブルーチンオブジェクトの構築が不完全なため,そのままではアトリビュートハンドラ内でできることはほとんどないのだ。以下のスクリプトはこのことを示す。 #!perl -w use strict; use Devel::Peek; sub MODIFY_CODE_ATTRIB

    サブルーチンのアトリビュートの信頼性 - Islands in the byte stream (legacy)