August 2006
August 30, 2006
August 25, 2006
株式会社はてなにお勤めの id:secondlife さん (舘野・ぼうんどあれい・祐一) が作った livedoor クリップで、はてブのブックマークユーザ数を表示する greasemonkey は、mashup に見せかけた株式会社ライブドアに対する嫌がらせだということがこの程判明しました。

母数が違いすぎてワロタ
舘野・ぼうんd(ry・祐一の連載が読めるのは WEB+DB PRESS だけ!

母数が違いすぎてワロタ
舘野・ぼうんd(ry・祐一の連載が読めるのは WEB+DB PRESS だけ!
August 15, 2006
前に書いた「配列から効率良くプレースホルダを作る」の続編です。。
TMTOWTDI な Perl だけあって、色々面白い解がありますね。
Powered By iwai.ug - [Perl] プレースホルダの作成って、こうすれば速いのか!
あと、もう一つ、
はてなブックマーク - 他人の切抜 / 2006年08月11日
確かに obfuscate ですが、要するに
で、ちなみにこの方法の場合の処理速度は、だいたい末尾を置換するのより少し速いぐらいでした。
もしかして三項演算子というか、条件分岐が入っているぶん遅いのかもと思ったので、仮に「必ず引数が渡ってくる」という前提とした
ところで、前回は
よくよく考えれば、要素数が増えれば増える程この効率に差が出ます (※) ので、たった一回の処理でも差が出る可能性もあります。
むしろ滅多に書き換えないという前提であれば、「より高速なものを採用したほうが良い」のかも知れません。
以下に、仮に要素数が 1,000 個あった場合のベンチマーク結果 (1 秒間の処理回数) を掲載しておきますので、「可読性や保守性」を選ぶのか、「処理速度」を選ぶのか…。
自分で振ったネタながら、ちょっと真剣に考えたほうが良い気がしてきました。。。
続きを読む
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 @_ ? '?' . ',?' x $#_ : ''; }こんな感じ。
確かに obfuscate ですが、要するに
"?,"
を繋げて末尾を切り落とすのではなくて、"?"
の後ろに ",?"
を引数の要素数 - 1 個ぶん連続して結合するという方法ですね。で、ちなみにこの方法の場合の処理速度は、だいたい末尾を置換するのより少し速いぐらいでした。
もしかして三項演算子というか、条件分岐が入っているぶん遅いのかもと思ったので、仮に「必ず引数が渡ってくる」という前提とした
sub placeholder_from_array { return '?' . ',?' x $#_; }を試してみたのですが、これでも
substr()
を使ったものより若干遅いという結果になりました。ところで、前回は
my @a = qw(foo bar baz);を対象にしてベンチマークを取って、
だから、「一回の処理で数万回この処理を通る」とかじゃないなら、可読性や保守性の高い前者を取りますけどねwと書きましたが「要素数が少ないから」という前提があることを忘れていました。
よくよく考えれば、要素数が増えれば増える程この効率に差が出ます (※) ので、たった一回の処理でも差が出る可能性もあります。
むしろ滅多に書き換えないという前提であれば、「より高速なものを採用したほうが良い」のかも知れません。
以下に、仮に要素数が 1,000 個あった場合のベンチマーク結果 (1 秒間の処理回数) を掲載しておきますので、「可読性や保守性」を選ぶのか、「処理速度」を選ぶのか…。
自分で振ったネタながら、ちょっと真剣に考えたほうが良い気がしてきました。。。
続きを読む
August 10, 2006
my @a = qw(foo bar baz);こんな配列から
?,?,?という文字列を使いたい場合があります。
例えば、
SELECT * FROM hoge WHERE user_id IN (?,?,?);みたいな SQL にする場合のプレースホルダを作ると言った具合に。
社内 IRC で、clouder さんが言い出して、
18:27 <clouder>join(',', map('?', @a))と言う。
18:27 <clouder> こんなのしか思いつかない。。
まぁ、それが妥当というか、普通それが思い浮かぶよなーって思ってたら、会社の dos さんという人が
19:15 <dos> '?,' x @a; で s/,$//; というソリューションとか、異様なことを言い出した。
sub placeholder_from_array { return join(',', map('?', @_)); }こんなのと
sub placeholder_from_array { (my $str = ('?,' x @_)) =~ s/,$//; return $str; }こんなのでベンチマークを取ってみると、後者のほうが倍以上速い。
やべ。ずっと前者でやってたけど全部後者に書き換えたくなってきた。
こういう些細なことでも「いかにも perl らしい」方法で、より高速に動くというのは素敵です。
ただ、まぁ、ぶっちゃけ
「前者は 2.42 μ秒かかったけど後者は 0.95 μ秒で済んだ」
だから、「一回の処理で数万回この処理を通る」とかじゃないなら、可読性や保守性の高い前者を取りますけどねw
追記:
sub placeholder_from_array { chop(my $str = ('?,' x @_)); return $str; }置換するより
chop()
したほうが更に速いかも。更に追記:
sub placeholder_from_array { return substr('?,' x @_, 0, -1); }いやー、これのが速い。
最初のやつより 5 倍ぐらい速い。。。