PHP-Einfach.de PHP lernen leicht gemacht

Navigation
» Startseite
» Newsübersicht
» Kontakt
» Impressum

Community
» Forum
» Gästebuch

Tutorial
» PHP Tutorial
» MySQL Tutorial
» PHP
» MySQL
» Codeschnipsel

Downloads
» Einführung
» Scripts
» Command Board

Sonstiges
» md5-Generator
» Generator
» Wissenswertes

PHP lernen


Dieses Projekt wird unterstützt von
Lichteffekte Shop

 
Partner:
PHP Forum
Mathe Nachhilfe
Suchmaschinenoptimierung

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($timeself::$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($querytotimeself::$percentprecision);
        
$runTime      sprintf(self::$timeoutself::$runTime['runTime']);
        
$queryrunTime sprintf(self::$timeoutself::$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

News
13.08 - » Spam im Gästebuch
Endlich Schluss mit dem Spam

08.12 - » Clanletter 2.0
Clanletter wurde komplett neu programmiert

01.09 - » Command Board 1.0 - 2.0
Das Command Board 1.0 Beta 2.0 ist erschienen


Mehr

Forum
» Entwickler Forum

» insert nach login

» Tabellenzelle zu groß







© PHP-Einfach.de 2003 - 2012