1<?php 2# Copyright (C) 2004 Brion Vibber <brion@pobox.com> 3# http://www.mediawiki.org/ 4# 5# This program is free software; you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation; either version 2 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License along 16# with this program; if not, write to the Free Software Foundation, Inc., 17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18# http://www.gnu.org/copyleft/gpl.html 19 20/** 21 * Approximate benchmark for some basic operations. 22 * 23 * @addtogroup UtfNormal 24 * @access private 25 */ 26 27/** */ 28if (isset($_SERVER['argv']) && in_array('--icu', $_SERVER['argv'])) { 29 dl('php_utfnormal.so'); 30} 31 32require_once 'include/Unicode/UtfNormal.php'; 33 34define('BENCH_CYCLES', 5); 35 36if (php_sapi_name() != 'cli') { 37 die("Run me from the command line please.\n"); 38} 39 40$testfiles = array( 41 'testdata/washington.txt' => 'English text', 42 'testdata/berlin.txt' => 'German text', 43 'testdata/bulgakov.txt' => 'Russian text', 44 'testdata/tokyo.txt' => 'Japanese text', 45 'testdata/young.txt' => 'Korean text' 46); 47$normalizer = new UtfNormal; 48UtfNormal::loadData(); 49foreach ($testfiles as $file => $desc) { 50 benchmarkTest($normalizer, $file, $desc); 51} 52 53# ------- 54 55function benchmarkTest(&$u, $filename, $desc) 56{ 57 print "Testing $filename ($desc)...\n"; 58 $data = file_get_contents($filename); 59 $forms = array( 60# 'placebo', 61 'cleanUp', 62 'toNFC', 63# 'toNFKC', 64# 'toNFD', 'toNFKD', 65 'NFC', 66# 'NFKC', 67# 'NFD', 'NFKD', 68 array( 'fastDecompose', 'fastCombiningSort', 'fastCompose' ), 69# 'quickIsNFC', 'quickIsNFCVerify', 70 ); 71 foreach ($forms as $form) { 72 if (is_array($form)) { 73 $str = $data; 74 foreach ($form as $step) { 75 $str = benchmarkForm($u, $str, $step); 76 } 77 } else { 78 benchmarkForm($u, $data, $form); 79 } 80 } 81} 82 83function benchTime() 84{ 85 $st = explode(' ', microtime()); 86 return (float) $st[0] + (float) $st[1]; 87} 88 89function benchmarkForm(&$u, &$data, $form) 90{ 91 global $utfCanonicalDecomp; 92 #$start = benchTime(); 93 for ($i = 0; $i < BENCH_CYCLES; $i++) { 94 $start = benchTime(); 95 $out = $u->$form($data, $utfCanonicalDecomp); 96 $deltas[] = (benchTime() - $start); 97 } 98 #$delta = (benchTime() - $start) / BENCH_CYCLES; 99 sort($deltas); 100 $delta = $deltas[0]; # Take shortest time 101 102 $rate = intval(strlen($data) / $delta); 103 $same = (0 == strcmp($data, $out)); 104 105 printf( 106 " %20s %6.1fms %12s bytes/s (%s)\n", 107 $form, 108 $delta * 1000.0, 109 number_format($rate), 110 ($same ? 'no change' : 'changed') 111 ); 112 return $out; 113} 114