新しく質問する

$_ と local($_)

役に立った:0件
  • 質問者:ytse
  • 投稿日時:2005/02/12 02:45
  • 困り度:暇なときに回答をください
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

sub a1{
$x = "abcd";
&a2(\$x);
}
sub a2{
($_) = @_;
$$_ =~ s/a/z/g;
}

sub b1{
$x = "abcd";
&b2(\$x);
}

sub b2{
local($_) = @_;
$$_ =~ s/a/c/g;
}

で、a1とb2についてベンチマークをとった結果、なぜかb1の方が微妙に速いことがわかりました。a関数郡とb関数郡のソース上の位置を逆転させても結果は同じです。回数は、10000000 回カウントした結果です。期待とは違った結果に驚いています。
localは「$_等の特殊記号に一時的な変更を与える」という意味だ過去によんだ「らくだ本」に書いてあった気がするので、この余分な作業でlocalをしたほうが時間がかかると思っていたのですが・・。

これは内部でどういったことが起こっているのでしょうか? もしくはベンチマークするサブルーチンの例がまずかったでしょうか?

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:0件)
  • 参考になった:0件

No.1ベストアンサー20pt

  • 回答者:BLUEPIXY
  • 回答日時:2005/02/12 02:51

($_) = @_;
の左側は、一時的なリストを作るために余計に時間が掛かるのではないかと思います。

通報する

この回答へのお礼

ご指摘いただいた箇所を、 「$_ = $_[0]」と直した所、無事localを使わない方が速くなりました。これですっきりしました、ご回答ありがとうございます。

  
このQ&Aは役に立ちましたか?(役に立った:0件)

このページのトップへ

Facebook公式ページ

公式Twitter