|
|
|
Benchmarkklasse (v1.0.0)
Zurück zur Übersicht Erweiterte Laufzeit- und Performancemessung.
getestet mit: (5.1.+)]
Beschreibung:
Oft mals ist es notwendig, besonders bei größeren Anwendungen, die Laufzeit eines Scriptes zu ermitteln, um es auf seine Leistungsfähigkeit zu testen. Dies kann sehr einfach passieren, und ein Beispiel dazu findet ihr hier. Damit könnt ihr die Laufzeit eines Scriptes bestimmen oder nur eines Abschnittes. Problem ist, es werden keine Datenbankabfragen gezählt und deren Laufzeit ermittelt. Aber genau da sollte man eben so die Leistung ermitteln. Unnötige Datenbankabfragen oder schlecht gemachte Datenbankabfragen können sehr schnell die Leistung eines noch so guten PHP-Codes negativ beeinflussen. Nun um ein genaueren Laufzeitmessung zu bekommen, habe ich für die Entwicklung des XcBs eine statische Benchmarkklasse geschrieben, die folgenden Methoden bietet.
- benchmark::benchmarkStart() -> Start eine Laufzeitmessung. Dieser Befehl muss als erstes ausgeführt werden.
- benchmark::benchmarkEnd() -> Beendet eine Laufzeitmessung. Dieser Befehl muss vor der Ausgabe der Laufzeitstatistik ausgeführt werden.
- benchmark::queryStart() -> Start eine Laufzeitmessung für einen SQL-Befehl.
- benchmark::queryEnd($querystring = "") -> Beendet eine Laufzeitmessung für einen SQL-Befehl. Vor diesem Befehl muss die Funktion benchmark::queryStart() ausgeführt werden. Es kann der SQL-Befehl übergeben werden, um genauer Festzustellen welcher SQL-Befehl wieviele Sekunden benötigte.
- benchmark::getBenchmar() -> Gibt den Benchmark als formartierten HTML-Code wieder. Dieser Befehl sollte erst nach der Funtkion benchmark::benchmarkEnd() erfolgen.
Der PHP-Code sieht wie folgt aus:
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
|
<?php
class benchmark {
static protected $runTime = array("start" => 0, "end" => 0, "runTime" => 0);
static protected $queryTime = array("start" => 0, "end" => 0, "runTime" => 0, "queryCount" => 0);
static protected $queryInfo = array();
static protected $template = array();
static protected $timeprecision = 6;
static protected $percentprecision = 2;
static protected $stringout = "%s";
static protected $timeout = "%01.6f";
static protected $percentout = "(%01.2f%%) ";
static public function benchmarkStart() {
self::$runTime['start'] = (double) self::getTime();
}
static public function benchmarkEnd() {
self::$runTime['end'] = (double) self::getTime();
self::$runTime['runTime'] = self::$runTime['end'] - self::$runTime['start'];
self::$runTime['runTime'] = round(self::$runTime['runTime'], self::$timeprecision);
}
static public function queryStart() {
self::$queryTime['start'] = (double) self::getTime();
}
static public function queryEnd($queryString = "") {
self::$queryTime['end'] = (double) self::getTime();
$time = self::$queryTime['end'] - self::$queryTime['start'];
$time = round($time, self::$timeprecision);
self::$queryTime['runTime'] += $time;
self::$queryTime['queryCount'] += 1;
self::$queryInfo[] = array(
"queryString" => sprintf(self::$stringout, $queryString),
"queryTime" => sprintf(self::$timeout, $time)
);
}
static public function getBenchmark() {
$querytotime = (100 / self::$runTime['runTime']) * self::$queryTime['runTime'];
$querytotime = round($querytotime, self::$percentprecision);
$runTime = sprintf(self::$timeout, self::$runTime['runTime']);
$queryrunTime = sprintf(self::$timeout, self::$queryTime['runTime']);
$querypercent = sprintf(self::$percentout, $querytotime);
?>
<style type="text/css">
/*<![CDATA[*/
.benchBorder {
margin: 5px auto;
border: 1px solid #274469;
width: 400px;
}
.benchTable {
width: 100%;
padding: 0px;
border-left: 1px solid #FFF;
}
.benchTitle {
margin: 0px;
padding: 2px;
background-color: #012A5E;
border: 1px solid #FFF;
font-family: verdana, arial, sans-serif;
font-size: 11pt;
font-weight: bold;
color: #FFF;
}
.benchTh {
padding: 2px;
background-color: #274469;
border-bottom: 1px solid #FFF;
border-right: 1px solid #FFF;
font-family: verdana, arial, sans-serif;
font-size: 10pt;
color: #FFF;
}
.benchTd {
margin: 0px;
padding: 2px;
background-color: #ccc;
border-bottom: 1px solid #FFF;
border-right: 1px solid #FFF;
font-family: verdana, arial, sans-serif;
font-size: 8pt;
color: #000;
}
/*]]>*/
</style>
<script type="text/javascript">
/*<![CDATA[*/
function openCat(catId, link) {
var isOpen = document.getElementById(catId).style.display;
if (isOpen == "none") {
document.getElementById(catId).style.display = "block";
link.innerHTML = "<span>-</span>";
}
else {
document.getElementById(catId).style.display = "none";
link.innerHTML = "<span>+</span>";
}
}
/*]]>*/
</script>
<div class="benchBorder">
<div class="benchTitle">Benchmark (Time): <a onclick="openCat('info', this)"><span>-</span></a></div>
<div id="info" style="display: block">
<table class="benchTable" cellspacing="0">
<thead>
<tr>
<th class="benchTh" style="width: 60px;">Information</th>
<th class="benchTh">Time in seconds</th>
</tr>
</thead>
<tbody>
<tr>
<td class="benchTd">Scriptruntime</td>
<td class="benchTd" style="text-align: right;"><?php echo $runTime; ?></td>
</tr>
<tr>
<td class="benchTd">Queryruntime</td>
<td class="benchTd" style="text-align: right;"><?php echo $querypercent.$queryrunTime; ?></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="benchBorder">
<div class="benchTitle">Queryinfo (Queries:<?php echo self::$queryTime['queryCount']; ?>) <a onclick="openCat('query', this)"><span>-</span></a></div>
<div id="query" style="display: block">
<table class="benchTable" cellspacing="0">
<thead>
<tr>
<th class="benchTh" style="width: 60px;">Querystring</th>
<th class="benchTh">Time in seconds</th>
</tr>
</thead>
<tbody>
<?php
foreach (self::$queryInfo AS $query) {
$queryText = sprintf(self::$stringout, $query['queryString']);
$queryTime = sprintf(self::$timeout, $query['queryTime']);
?>
<tr>
<td class="benchTd"><?php echo $queryText; ?></td>
<td class="benchTd" style="text-align: right;"><?php echo $queryTime ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
</div>
<?php
}
static protected function getTime() {
return time()+microtime();
}
}
?>
|
|
Beispiel:
Das folgende Beispiel soll euch die Benutzung näher bringen. Der Aufruf könnte wie folgt aussehen:
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
|
benchmark::benchmarkStart();
$sqlQuery = "SELECT * FROM `test`";
benchmark::queryStart();
$sqlQueryid = mysql_query($sqlQuery);
benchmark::queryEnd($sqlQuery);
if (mysql_num_rows($sqlQueryid) != 0) {
while ($row = mysql_fetch_assoc($sqlQueryid)) {
foreach ($row AS $key => $val) {
echo $key.": ".$val."<br />";
}
}
}
benchmark::benchmarkEnd();
benchmark::getBenchmark();
|
|
Für weitere Informationen, besucht folgendes Thema: PHP-Benchmark (v1.0.0)
Kommentare
Zurück zur Übersicht
Autor GameR
|
|
|
|