ソートの比較

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秒前後であるのに対しPHP260秒前後だった
JITインタプリタだとやはり差がでるな、という感想

PHPの変数スコープ

forとかにつかった変数がそのあとも残るのがなんだか慣れない

<?php
for ($i = 0; $i < 10; $i++) {
    echo $i, PHP_EOL;
}
unset($i);

こんな感じに書くのが主流なのかな、どうなのかな