162 lines
3.6 KiB
PHP
162 lines
3.6 KiB
PHP
|
<?php
|
||
|
|
||
|
require_once '../library/HTMLPurifier.auto.php';
|
||
|
@include_once '../test-settings.php';
|
||
|
|
||
|
// PEAR
|
||
|
require_once 'Benchmark/Timer.php'; // to do the timing
|
||
|
require_once 'Text/Password.php'; // for generating random input
|
||
|
|
||
|
$LEXERS = array();
|
||
|
$RUNS = isset($GLOBALS['HTMLPurifierTest']['Runs'])
|
||
|
? $GLOBALS['HTMLPurifierTest']['Runs'] : 2;
|
||
|
|
||
|
require_once 'HTMLPurifier/Lexer/DirectLex.php';
|
||
|
$LEXERS['DirectLex'] = new HTMLPurifier_Lexer_DirectLex();
|
||
|
|
||
|
if (version_compare(PHP_VERSION, '5', '>=')) {
|
||
|
require_once 'HTMLPurifier/Lexer/DOMLex.php';
|
||
|
$LEXERS['DOMLex'] = new HTMLPurifier_Lexer_DOMLex();
|
||
|
}
|
||
|
|
||
|
// custom class to aid unit testing
|
||
|
class RowTimer extends Benchmark_Timer
|
||
|
{
|
||
|
|
||
|
public $name;
|
||
|
|
||
|
public function __construct($name, $auto = false)
|
||
|
{
|
||
|
$this->name = htmlentities($name);
|
||
|
$this->Benchmark_Timer($auto);
|
||
|
}
|
||
|
|
||
|
public function getOutput()
|
||
|
{
|
||
|
$total = $this->TimeElapsed();
|
||
|
$result = $this->getProfiling();
|
||
|
$dashes = '';
|
||
|
|
||
|
$out = '<tr>';
|
||
|
|
||
|
$out .= "<td>{$this->name}</td>";
|
||
|
|
||
|
$standard = false;
|
||
|
|
||
|
foreach ($result as $k => $v) {
|
||
|
if ($v['name'] == 'Start' || $v['name'] == 'Stop') continue;
|
||
|
|
||
|
//$perc = (($v['diff'] * 100) / $total);
|
||
|
//$tperc = (($v['total'] * 100) / $total);
|
||
|
|
||
|
//$out .= '<td align="right">' . $v['diff'] . '</td>';
|
||
|
|
||
|
if ($standard == false) $standard = $v['diff'];
|
||
|
|
||
|
$perc = $v['diff'] * 100 / $standard;
|
||
|
$bad_run = ($v['diff'] < 0);
|
||
|
|
||
|
$out .= '<td align="right"'.
|
||
|
($bad_run ? ' style="color:#AAA;"' : '').
|
||
|
'>' . number_format($perc, 2, '.', '') .
|
||
|
'%</td><td>'.number_format($v['diff'],4,'.','').'</td>';
|
||
|
|
||
|
}
|
||
|
|
||
|
$out .= '</tr>';
|
||
|
|
||
|
return $out;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function print_lexers()
|
||
|
{
|
||
|
global $LEXERS;
|
||
|
$first = true;
|
||
|
foreach ($LEXERS as $key => $value) {
|
||
|
if (!$first) echo ' / ';
|
||
|
echo htmlspecialchars($key);
|
||
|
$first = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function do_benchmark($name, $document)
|
||
|
{
|
||
|
global $LEXERS, $RUNS;
|
||
|
|
||
|
$config = HTMLPurifier_Config::createDefault();
|
||
|
$context = new HTMLPurifier_Context();
|
||
|
|
||
|
$timer = new RowTimer($name);
|
||
|
$timer->start();
|
||
|
|
||
|
foreach($LEXERS as $key => $lexer) {
|
||
|
for ($i=0; $i<$RUNS; $i++) $tokens = $lexer->tokenizeHTML($document, $config, $context);
|
||
|
$timer->setMarker($key);
|
||
|
}
|
||
|
|
||
|
$timer->stop();
|
||
|
$timer->display();
|
||
|
}
|
||
|
|
||
|
?>
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>Benchmark: <?php print_lexers(); ?></title>
|
||
|
</head>
|
||
|
<body>
|
||
|
<h1>Benchmark: <?php print_lexers(); ?></h1>
|
||
|
<table border="1">
|
||
|
<tr><th>Case</th><?php
|
||
|
foreach ($LEXERS as $key => $value) {
|
||
|
echo '<th colspan="2">' . htmlspecialchars($key) . '</th>';
|
||
|
}
|
||
|
?></tr>
|
||
|
<?php
|
||
|
|
||
|
// ************************************************************************** //
|
||
|
|
||
|
// sample of html pages
|
||
|
|
||
|
$dir = 'samples/Lexer';
|
||
|
$dh = opendir($dir);
|
||
|
while (false !== ($filename = readdir($dh))) {
|
||
|
|
||
|
if (strpos($filename, '.html') !== strlen($filename) - 5) continue;
|
||
|
$document = file_get_contents($dir . '/' . $filename);
|
||
|
do_benchmark("File: $filename", $document);
|
||
|
|
||
|
}
|
||
|
|
||
|
// crashers, caused infinite loops before
|
||
|
|
||
|
$snippets = array();
|
||
|
$snippets[] = '<a href="foo>';
|
||
|
$snippets[] = '<a "=>';
|
||
|
|
||
|
foreach ($snippets as $snippet) {
|
||
|
do_benchmark($snippet, $snippet);
|
||
|
}
|
||
|
|
||
|
// random input
|
||
|
|
||
|
$random = Text_Password::create(80, 'unpronounceable', 'qwerty <>="\'');
|
||
|
|
||
|
do_benchmark('Random input', $random);
|
||
|
|
||
|
?></table>
|
||
|
|
||
|
<?php
|
||
|
|
||
|
echo '<div>Random input was: ' .
|
||
|
'<span colspan="4" style="font-family:monospace;">' .
|
||
|
htmlspecialchars($random) . '</span></div>';
|
||
|
|
||
|
?>
|
||
|
|
||
|
|
||
|
</body></html>
|
||
|
<?php
|
||
|
|
||
|
// vim: et sw=4 sts=4
|