frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

ネストが嫌い。

リファクタリングする機会が多いので

人様のルーチンを見ていると

いつも思う事がある。

ネストが深くって嫌だなぁ…。

この言い方、正しいのかわからんけど(笑)

私は入れ子の入れ子の入れ子…って状態が嫌い。

説明するより、例を書いた方が早いので

つまり、こーゆー状態↓

sub test {

if (条件A) {

if (条件B) {

実行内容C if (条件C);

} else {

実行内容B;

}

}

return;

}

あ"あ"あ、いやん(涙目)

何故なら、この状態だと

条件Aにあてはまらない場合、

どこを通過するのかを確認したいだけの場合でも

最後の行まで見ないといけないからです。

少ないメモリの私の脳ミソは、

すぐにパニック起こしますから勘弁してください(笑)

で、私はこーゆー時は、こう↓書きます。

sub test {

return if (!条件A);

if (!条件B) {

実行内容B;

return;

}

実行内容C if (条件C);

return;

}

・・・これが良いのか悪いのか、知りませんが(笑)

少なくともこれで条件Aにあてはまらない場合のルーチンが

一目でわかるようになったかなぁ、と思ったり。

感覚的にも、場合によっては

メモリの解放も速いんじゃないかなぁ?って

ボンヤリ想像してたりして。

それで、いつか実験しようと思ってたので、やってみました。

体調悪いから、めっさ適当ルーチンだけど(笑)

一応、期待してた結果が出ました。

main は↓これ。

#/usr/bin/perl -w

use Time::HiRes;

my $checkText = $ARGV[0] || 'a';

my $checkTimes = $ARGV[1] =~ /^[0-9]+$/ ? $ARGV[1] : 100;

my $timecheck = Time::HiRes::time;

&test($checkText) for(1..$checkTimes);

print Time::HiRes::time - $timecheck."\n";

exit;

mainで呼び出すサブルーチンは2種類。

パターン1

sub test($) {

my $check = shift;

return if $check ne 'a';

return if $check ne 'b';

return if $check eq 'c';

return;

}

パターン2

sub test($) {

my $check = shift;

if ($check eq 'a') {

if ($check eq 'b') {

return if ($check eq 'c');

} else {

return;

}

}

return;

}

これを$checkTimesを1000000にして

交互に呼び出すのを10回やって平均値を出したら…

■パターン1

 a: 1.303125

 b: 1.1046875

 c: 1.109375

■パターン2

 a: 1.4328125

 b: 1.134375

 c: 1.1265625

…結果、総合するとパターン1のが、

0.058854167 速かったのでした。

他にも1つ、実験したい事があるんだけど

それは明日、元気になったらやってみようっと。