<?php
header ('Content-Type: text/html; charset=utf-8');
?>
<html>
<head>
<style type="text/css">
body
{
padding : 16px;
margin : 0px;
}
table
{
margin : auto;
border-collapse : collapse;
border : 1px solid gray;
color : #FFFFFF;
font : normal normal normal 10px verdana, arial, helvetica, sans-serif;
}
td
{
padding : 0.4em;
color : #363636;
text-align : center;
vertical-align : top;
}
td:nth-child(1)
{
padding : 0.4em 0.8em;
background : #C2D3D4;
text-align : left;
}
th
{
padding : 0.6em 1.2em;
background : #5C443A;
color : #FFFFFF;
text-align : center;
text-transform : uppercase;
vertical-align : top;
}
tr
{
background : #D3E4E5;
border : 1px dotted gray;
}
tr:nth-child(2n)
{
background : #FFFFFF;
}
tr:hover
{
background : #99BCBF;
border : 1px solid #03476F;
color : #000000;
}
</style>
</head>
<body>
<table>
<tr>
<th>Test name</th>
<th>Loop #1</th>
<th>Loop #2</th>
<th>Loop #3</th>
<th>Average</th>
</tr>
<?php
function bench_perform ($name, $callback, $params = array ())
{
echo '
<tr>
<td>' . htmlentities ($name, ENT_COMPAT, 'utf-8') . '</td>';
$failed = false;
$sum = 0;
for ($i = 0; $i < 3; ++$i)
{
$time = microtime (true);
if (call_user_func_array ($callback, $params))
{
$diff = microtime (true) - $time;
$sum += $diff;
echo '
<td>' . round ($diff * 1000) . ' ms</td>';
}
else
{
$failed = true;
echo '
<td>failed</td>';
}
}
if ($failed)
echo '
<td>failed</td>
</tr>';
else
echo '
<td>' . round ($sum * 1000 / 3) . ' ms</td>
</tr>';
}
function bench_skip ($name)
{
echo '
<tr>
<td>' . htmlentities ($name, ENT_COMPAT, 'utf-8') . '</td>
<td>skipped</td>
<td>skipped</td>
<td>skipped</td>
<td>skipped</td>
</tr>';
}
function test_proc_loop ($loops)
{
for ($i = 0; $i < $loops; )
++$i;
return true;
}
function test_disk_o ($loops, $size)
{
$buffer = str_repeat ('$', $size);
for ($i = 0; $i < $loops; ++$i)
{
$f = fopen ('dummy', 'wb');
fwrite ($f, $buffer);
fclose ($f);
}
unlink ('dummy');
return true;
}
function test_disk_r ($loops, $size)
{
$f = fopen ('dummy', 'wb');
fwrite ($f, str_repeat ('$', $size));
fclose ($f);
for ($i = 0; $i < $loops; ++$i)
{
$f = fopen ('dummy', 'rb');
fread ($f, $size);
fclose ($f);
}
unlink ('dummy');
return true;
}
function test_disk_w ($loops, $size)
{
$buffer = str_repeat ('$', $size);
for ($i = 0; $i < $loops; ++$i)
{
$f = fopen ('dummy', 'wb');
fwrite ($f, $buffer);
fclose ($f);
unlink ('dummy');
}
return true;
}
function test_mem_alloc ($loops, $size)
{
for ($i = 0; $i < $loops; ++$i)
{
$buffer = str_repeat ('$', $size);
unset ($buffer);
}
return true;
}
function test_net_dl ($loops, $size)
{
for ($i = 0; $i < $loops; ++$i)
{
$ch = curl_init ('http://test-debit.free.fr/image.iso');
if ($ch === false)
return false;
curl_setopt ($ch, CURLOPT_RANGE, '0-' . ($size - 1));
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
if (curl_exec ($ch) === false)
return false;
curl_close ($ch);
}
return true;
}
function test_net_ul ($loops, $size)
{
$buffer = str_repeat ('$', $size);
for ($i = 0; $i < $loops; ++$i)
{
$ch = curl_init ('http://test-debit.free.fr');
if ($ch === false)
return false;
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, array ('buffer' => $buffer));
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
if (curl_exec ($ch) === false)
return false;
curl_close ($ch);
}
return true;
}
bench_perform ('Memory : allocate and release 1 MB, 100 times', 'test_mem_alloc', array (100, 1024 * 1024));
bench_perform ('Memory : allocate and release 8 MB, 10 times', 'test_mem_alloc', array (10, 8 * 1024 * 1024));
if (function_exists ('curl_init'))
{
bench_perform ('Network : download 100 B, 10 times', 'test_net_dl', array (10, 100));
bench_perform ('Network : download 10 KB, 5 times', 'test_net_dl', array (5, 10 * 1024));
bench_perform ('Network : upload 100 B, 10 times', 'test_net_ul', array (10, 100));
bench_perform ('Network : upload 10 KB, 5 times', 'test_net_ul', array (5, 10 * 1024));
}
else
bench_skip ('Network : cannot perform, cURL not available');
bench_perform ('Processor : empty loop, 10^5 iterations', 'test_proc_loop', array (100000));
bench_perform ('Processor : empty loop, 10^6 iterations', 'test_proc_loop', array (1000000));
bench_perform ('Storage : read 100 B from file, 20 times', 'test_disk_r', array (20, 100));
bench_perform ('Storage : read 10 KB from file, 10 times', 'test_disk_r', array (10, 10 * 1024));
bench_perform ('Storage : read 1 MB from file, 5 times', 'test_disk_r', array (5, 1024 * 1024));
bench_perform ('Storage : write 100 B without flush, 20 times', 'test_disk_w', array (20, 100));
bench_perform ('Storage : write 10 KB without flush, 10 times', 'test_disk_w', array (10, 10 * 1024));
bench_perform ('Storage : write 1 MB without flush, 5 times', 'test_disk_w', array (5, 1024 * 1024));
bench_perform ('Storage : write 100 B with flush, 20 times', 'test_disk_o', array (20, 100));
bench_perform ('Storage : write 10 KB with flush, 10 times', 'test_disk_o', array (10, 10 * 1024));
bench_perform ('Storage : write 1 MB with flush, 5 times', 'test_disk_o', array (5, 1024 * 1024));
?>
</table>
</body>
</html>