Skip to content

Instantly share code, notes, and snippets.

@kwatch
Created September 12, 2012 22:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kwatch/3710569 to your computer and use it in GitHub Desktop.
Save kwatch/3710569 to your computer and use it in GitHub Desktop.
php5.5 generator benchmark #2
<?php
///
/// generator benchmark
///
function create_datafile($filename, $filesize=1024) {
$str = "Haruhi\tFemale\t16\tTeam Leader\n"
. "Mikuru\tFemale\t17\tTime Traveler\n"
. "Yuki\tFemale\t16\tHumanoid Interface\n"
. "Itsuki\tMale\t16\tESPer Body\n"
. "Kyon\tMale\t16\tStory Teller\n"
;
$f = fopen($filename, 'w');
$size = 0;
do {
fwrite($f, $str);
$size += strlen($str);
} while ($size < $filesize);
fclose($f);
}
/// generator
function each_line($filename) {
$f = fopen($filename, 'r');
while (($line = fgets($f)) !== false) {
yield $line;
}
fclose($f);
}
/// Benchmark
function run_benchmark($title, $block) {
$begin = microtime(true);
$block();
$end = microtime(true);
printf("%-30s %8.4f (sec)\n", $title, ($end - $begin));
}
function run_benchmarks($filename) {
/// read file into disk cache
$f = fopen($filename, 'r');
do {
$line = fgets($f);
} while ($line !== false);
fclose($f);
/// not generator
run_benchmark("no generator", function() use ($filename) {
$f = fopen($filename, 'r');
while (($line = fgets($f)) !== false) {
// do nothing
}
fclose($f);
});
/// generator
run_benchmark("generator", function() use ($filename) {
foreach (each_line($filename) as $line) {
// do nothing
}
});
/// generator + explode()
run_benchmark("generator+explode()", function() use ($filename) {
foreach (each_line($filename) as $line) {
$arr = explode("\t", $line);
}
});
/// generator + explode() + array()
run_benchmark("generator+explode()+array()", function() use ($filename) {
foreach (each_line($filename) as $line) {
$arr = explode("\t", $line);
$assoc = array('name'=>$arr[0], 'gender'=>$arr[1],
'age'=>0+$arr[2], 'desc'=>$arr[3]);
}
});
}
$filename = "example.data";
if (! file_exists($filename)) {
create_datafile($filename, 15*1024*1024);
}
run_benchmarks($filename);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment