ソートの比較
PHPでソート関数を試し書きしてるときに、ふと気になったのでPerlと速度を比べてみた
コードは以下
ActivePerl 5.12.2
use strict; use warnings; use Time::HiRes; sub str { my $str = ""; for (0..int(rand(10)+1)) { $str .= chr(65 + rand(25)%26); } return $str; } my @data = map{&str()} 1..3000; my @temp; my $t = Time::HiRes::time(); for (my $i = 0; $i < 10000; $i++) { @temp = sort {$a cmp $b} @data; } printf "%.2f\n", Time::HiRes::time() - $t;
PHP 5.3.10
<?php function str() { $str = ""; mt_srand(); $len = mt_rand(0, 10) + 1; for ($i = 0; $i < $len; $i++) { $str .= chr(65 + mt_rand(0, 25)%26); } return $str; } $data = array(); for ($i = 0; $i < 3000; $i++) $data[] = str(); $t = microtime(true); for ($i = 0; $i < 10000; $i++) { $temp = $data; usort($temp, function($a, $b) { return strcmp($a, $b); }); } printf("%.2f\n", microtime(true) - $t);
文字列3000個をユーザー定義で10000回ソートするのにかかる時間を測定した
なるべく似せて書いたつもりだけど、
配列の値が毎回ランダムなんで言語間の比較としては微妙かもしれない
何度か実行してみるとPerlは大体32秒前後であるのに対しPHPは260秒前後だった
JITとインタプリタだとやはり差がでるな、という感想
PHPの変数スコープ
forとかにつかった変数がそのあとも残るのがなんだか慣れない
<?php for ($i = 0; $i < 10; $i++) { echo $i, PHP_EOL; } unset($i);
こんな感じに書くのが主流なのかな、どうなのかな