summaryrefslogtreecommitdiffstats
path: root/vendor/ezyang/htmlpurifier/benchmarks/Lexer.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ezyang/htmlpurifier/benchmarks/Lexer.php')
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/Lexer.php161
1 files changed, 161 insertions, 0 deletions
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/Lexer.php b/vendor/ezyang/htmlpurifier/benchmarks/Lexer.php
new file mode 100644
index 000000000..d612fc3c5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/Lexer.php
@@ -0,0 +1,161 @@
+<?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 RowTimer($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