Perl 5.10.0でswitch文が導入されたことにより,ifの連鎖はもっとわかりやすい構文に書き換えられるようになった。 use feature 'switch'; given($foo){ when("bar"){ ... } when("baz"){ ... } default{ ... } } switch文の導入で便利になった一方,このwhen()で使われるマッチングは「スマートマッチ」という特殊な演算子によって行われることのコストが懸念される。 そこで,switch文とif連鎖の速度を比較してみた。 また,かつて単純なif連鎖とよく比較されたのは,ハッシュテーブルを参照する方式である。if連鎖の複雑さがO(n)なのに対し,ハッシュテーブルの参照はO(1)であるため,連鎖が長くなるとハッシュテーブルの方が高速であるとされる。『Perlベストプラクティス』では,ハッシュテーブル
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
モジュールがMoose依存してた。別れたい… - Unknown::Programming id:tokuhiromさんにベンチうp頼まれたんだけども超個人的なBenchmarkコードなのでそのままCodeReposにあげれるような代物でもないということもあり取り急ぎエントリとしてあげておきますので自由に変更しちゃってください。 #!/usr/local/bin/perl -w use strict; use warnings; package MooseBuild; use Moose; has userid => ( is => 'rw', ); has agent => ( is => 'rw', required => 1, ); sub BUILD { my $self = shift; $self->userid(90); $self->userid($self->agent-
CPANにMoose版Catalystである5.8のdeveloper releaseが出ていたのでベンチマーク取って見ました。 なお、Catalyst::ClassDataがパッケージに含まれていなかったので、これだけリポジトリから持ってきて動かしてます。 テスト内容はcataltst.pl MyAppで出来るトップページをビルトインエンジンで起動して ab -n 1000 -c 100 http://localhost:3000/するだけ。 結果はこちら。 Catalyst 5.7014 Server Software: Server Hostname: localhost Server Port: 3000 Document Path: / Document Length: 5635 bytes Concurrency Level: 100 Time taken for tests:
と言う事で、連結する変数が多くなると途中から join が最速になる。"$a$b$c" のような形式は最適化されて $a . $b . $c となるようだがやはり数に関わらず最も遅いので使わない。 続・スカラーの文字連結 http://www.ibm.com/developerworks/jp/linux/library/l-optperl/ より 他にも色々拡張してみた。 #!/usr/bin/perl use strict; use warnings; use Benchmark qw(:all); my $limit = 100; my $sets = { concat1 => sub { my $string = 'abcdefghijklmnopqrstuvwxyz'; my $concat = ''; for (1..$limit) { $concat .= $string;
ハッシュに値を振り分ける時のコード 例えばCSVなファイルを読み込んで、それをハッシュの中に展開、格納と言った感じの動作をPerlで行いたかったとします。例えば 1,2,3 と言った行を my %hash = ( 'col1' => 1, 'col2' => 2, 'col3' => 3 ); のようなハッシュに展開する関数が欲しいわけです。皆さんはこれをどういう風に実装しますか?ぱっと思いつくのはforループですよね my @colums = ('a', 'b', 'c'); my @values = (1, 2, 3); # もちろん実際にはsplit(/,/, $line)とか、CSVパーサーを使う my %h; for (0..$#columns) { $h{ $columns[$_] } = $values[$_]; } 実はこのようなCっぽい書き方はPerlでは大概遅いです。D
仕事で Benchmark モジュールを使う機会があったので、使い方&結果情報の読み取り方をまとめてみました。基本的には perldoc 読めばオールオッケーでしょ?と思っていたのですが、docs では結果情報の読み方についてはあんまり触れられていなかった為、ガッツリ補足してみました。 基本 とある2種類のコードの実行速度を比較計測するには以下のようなソースを記述します: bench.pl #!/usr/bin/perl use strict; use warnings; use Benchmark qw(timethese cmpthese); sub hogeLoop1 { my $str; for my $i (1 .. 10000){ $str .= $i } } sub hogeLoop2 { my $str; for my $i (1 .. 20000){ $str .= $i
Perlで数有る$selfを取る手法をベンチマーク取った PerlでOOなコード書く時のコンテキストを取る方法は色々あります、最近audreyがselfvarsをリリースしたので、gugodのself.pmとingyのSpiffyそして、既存のmy $self = shift;やshift->や$_[0]->で$selfを取る方法それぞれのベンチマークを取ってみました。 テストコードのモジュール名は、それぞれのモジュールの作者名から取り、既存の手法はYAPC::Asiaでプレゼンした事のある日本を代表するPerlな企業のCTOからモジュール名を取らせていただきました。 コードは以下の通りです。 package Audrey; use strict; use warnings; use selfvars; sub new { bless { count => 0 }, shift } sub
なんか、CPAN探したら、clone系いっぱいあるんですね...。 Clone Clone::Fast Scalar::Util::Clone Class::MakeMethods::Utility::Ref いったいどれが速いんだってことで試してみた(Perl 5.8.4)。 Rate ref util dclone more fast normal ref 32.5/s -- -88% -89% -93% -93% -94% util 278/s 756% -- -4% -42% -43% -47% dclone 290/s 793% 4% -- -40% -41% -44% more 482/s 1384% 73% 66% -- -1% -7% fast 488/s 1402% 76% 68% 1% -- -6% normal 519/s 1500% 87% 79% 8% 6% --
Class::Accessor シリーズに 0.27 で Class::Accessor::Faster なるものが追加されていました(Fast と同様 Class::Accessor を普通に入れると一緒に入ります)。 This is a faster but less expandable version of Class::Accessor::Fast. C::A::Fast 「よりも」速いんですか?まじっすか。ということでベンチマークをとってみました。 幸いにも?トミーさんがhttp://e8y.net/blog/2006/05/26/p120.htmlでベンチマークしてらっしゃったので,スクリプトをインスパイアードコピーしました。つっても今回は他のアクセサに興味がなかったので,Class::Accessor 三兄弟と通常ハッシュ版,意外に速い Lvalue::Fast を含む C
前に書いた「配列から効率良くプレースホルダを作る」の続編です。。 TMTOWTDI な Perl だけあって、色々面白い解がありますね。 Powered By iwai.ug - [Perl] プレースホルダの作成って、こうすれば速いのか! ちなみに自分は、今までこんな感じでした↓ sub placeholder_from_array { return join(',', ('?') x @_); } 確かに、配列を作るのに map() を使うより、このほうが倍近く高速になりますね。 あと、もう一つ、 はてなブックマーク - 他人の切抜 / 2006年08月11日 よりobfuscatedな解: 「return @_?"?".",?"x$#_:"";」。 id:another さんの解をほんの少しだけ見やすくすると sub placeholder_from_array { return @
2006年06月16日00:00 カテゴリLightweight Languages書評/画評/品評 perl - 自動で /a|b|c/ を /[abc]/ にしてくれたら... 正規表現においては、/a|b|c/(alteration)は[abc](character class)にすべし、というのは、perlに限らない常識です。 Mastering Regular Expression Jeffrey E. Friedl [邦訳: 詳説 正規表現] qootas.org/blog - perl regex performance"|"(パイプ)を使った正規表現はめちゃくちゃ遅いから使わないように、ということです。確かにベンチマークを取ると32倍速いです。 どうせならPerl自身が内部で/a|b|c/を[abc]にしてくれたらと思ったことありませんか? 少なくとも、正規表現を仕事で使う
Perl で YAML と JSON のベンチマーク比較 YAML や JSON が軽い!速い!と言われているが、どれくらい速いのか Perl モジュールでベンチしてみた。 ※個人的に興味があったのがデータの読み込み (Load) だけだったので、データの書き出し (Dump) はテストしていない。 結果的には、YAML と 比べて JSON の方が 6倍〜8倍高速。ただし、これはデータ量が少ない場合で、データ量が大きくなると 0.5倍〜0.8倍 と差が縮まってしまう。 また、YAML::Syck と JSON::Syck で比べると、データ量にかかわらずその差は数パーセント程度になってしまう。 ちなみに、Data::Dumper でダンプしたデータを eval したものとも比べてみたが、YAML を基準にすると eval は約50倍速く、YAML::Syck (と JSON::Syck)
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く