PHP::Varとは何か
- PerlのハッシュやリストをPHPのソースコードとしてエクスポートするためのPerlのライブラリです。
特徴
- 「Perlで作成したデータ構造をPHPのソースコードとして書き出す」ということに特化しているためエクスポートが高速です。
- インポートの際はPHP側でコードとして評価されるため、serializeしたものをunserializeするよりも低速です。
できないこと
- PHPのデータをPerlへインポートすることはできません。
- blessされたオブジェクトを意味のある形でエクスポートすることはできません。(qq("")がオーバーロードされている場合はスカラーとしてエクスポートされます。)
ベンチマーク
Perlで作成したデータ構造をPHPへ渡す機能をもつライブラリとしてPHP::Session::Serializer::PHP がありますので、これと比較しつつ、サンプルデータでベンチマークをとってみました。
(PHP::Session::Serializer::PHPはPHPでserializeしたデータをPerlのデータ構造にunserializeする機能もあったり、またPHPのclassも扱うこともできたりする高機能で汎用性のあるライブラリです。)
スクリプト
#!/usr/bin/perl
use strict;
use warnings;
use File::Temp qw/ tempfile /;
use PHP::Var;
use PHP::Session::Serializer::PHP;
my $serializer = PHP::Session::Serializer::PHP->new;
use Benchmark qw(cmpthese);
my %data = ();
foreach my $k1 ('a' .. 'z') {
$data{$k1} = {};
foreach my $k2 (1 .. 10) {
$data{$k1}{$k2} = [
'a' x 1000, 'b' x 1000, '"' x 20, "'" x 20, '\\' x 20,
],
}
}
sub php_session {
my $enc = $serializer->encode(@_);
}
sub php_var {
my $enc = PHP::Var::export(@_);
}
cmpthese(1_00, {
serialize => sub { &php_session(\%data) },
php_var => sub { &php_var(\%data) },
php_var_purity => sub { &php_var('purity' => 1, \%data) },
php_var_enclose => sub { &php_var('enclose' => 1, \%data) },
});
print("\n");
sub _tempfile {
my $data = shift;
my ($fh, $fn) = tempfile();
print($fh $data);
close($fh);
$fn;
}
my $sess_data = &_tempfile(&php_session(\%data));
my $sess = &_tempfile(
"<?php \$var = unserialize(file_get_contents('$sess_data')); ?>"
);
my $var_code = &_tempfile(&php_var('enclose' => 1, 'var' => \%data));
my $var = &_tempfile("<?php include('$var_code'); ?>");
my $eval_data = &_tempfile(&php_var(\%data));
my $eval = &_tempfile("<?php eval(file_get_contents('$eval_data')); ?>");
cmpthese(1_00, {
unserialize => sub { system("php $sess") },
code_embed => sub { system("php $var_code") },
code_include => sub { system("php $var") },
'eval' => sub { system("php $eval") },
});
結果
Rate serialize php_var_enclose php_var_purity php_var
serialize 34.6/s -- -22% -27% -27%
php_var_enclose 44.6/s 29% -- -5% -6%
php_var_purity 47.2/s 36% 6% -- -1%
php_var 47.6/s 38% 7% 1% --
Rate eval code_include code_embed unserialize
eval 30.4/s -- -1% -3% -32%
code_include 30.6/s 1% -- -3% -32%
code_embed 31.4/s 3% 3% -- -30%
unserialize 44.8/s 48% 47% 43% --
一般的なケースでは書き出しよりも読み込みの頻度の方が高いと思うので、PHP::Session::Serializer::PHP と比較して速度的には劣ることが多いです。
コメントする