peterS.: Performancemessung einer Webanwendung

Beitrag lesen

gruss Marko,

ich suche ein Tool, mit dem ich die Antwortzeiten und
Übertragungszeiten einer Webanwendung ... Aufzeichnen
kann (auf Seite des Clients nicht des Servers).

Mein Ziel wäre in etwa ein LOG-Datei mit den Daten:
Zeitpunkt Request Nr X
Zeitpunkt der Antwort des Servers auf Request X
Ende der Übertagung für Request X

mit clientseitigem javascript koenntest Du ein messwerk-
   zeug schreiben, welches den response annaeherungsweise
   ermitteln kann und auch die anderen von Dir geforderten
   daten erhebt;

Du benoetigst z.b. eine datei "clientsideWebPerformance.html",
   die auf dem client eine testreihe Dir auf dem server bekannter
   seitenn zusammenstellt, d.h.: Du kennst die namen der webdoku-
   mente und deren groessen;

diese beiden parameter packst Du dann z.b in das array
   "testRequestArray" der datei "clientsideWebPerformance.html";

die zeitmessung beginnt mit dem aufruf einer dieser seiten
   aus dem array;
   eine zwischenzeit (die fuer den angenaehrten server-response)
   wird genommen, sobald die ersten zeilen dieser speziell prepa-
   rierten seiten eintrudeln;
   die zeitmessung stoppt mit dem eintreffen der letzten zeilen
   der angeforderten dokumente;

aus den zeitdifferenzen koennen z.b. die "responseTime" und
   die "sessionTime" (oder "totalTime") bestimmt, und im oben
   besprochenen array abgelegt werden;

nach dem komplettdurchlauf der testreihe kann man sich an
   die auswertung der im "testRequestArray" gespeicherten daten
   machen;

fuer die seite "clientsideWebPerformance.htm" koennte der
   code dann so aussehen:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
<title>clientsideWebPerformance.html</title>
<script type="text/javascript" language="JavaScript">
<!--
var testRequestArray = [[["testRequest01.html"],[171.32]],[["testRequest02.html"],[110.63]],[["testRequest03.html"],[302.25]]]; // beliebig fortfuehrbar;
var testRequestIndex = 0;

var timeRequestStarts = 0;
var timeRespondStarts = 0;
var timeRequestEnds = 0;

var testWin = null;

function startPerformanceTest() {
 if (testRequestIndex < testRequestArray.length) {
  if ((testWin == null) || (testWin.closed)) {
   testWin = window.open("","","width=375,height=385,status");
  }
  testWin.location.href = (testRequestArray[testRequestIndex][0].toString());
  timeRequestStarts = new Date().getTime();
 } else {
  endPerformanceTest();
 }
}
function endPerformanceTest() {
 if ((!testWin.closed) || (testWin != null)) {
  testWin.close();
 }
 testWin = window.open("","","width=670,height=215,scrollbars");
 testWin.document.open("text/html");
 testWin.document.write(getTestResult());
 testWin.document.close();
}

function writePerfomanceLog() {
 testRequestArray[testRequestIndex][2] = (timeRespondStarts-timeRequestStarts); // responseTime;
 testRequestArray[testRequestIndex][3] = (timeRequestEnds-timeRequestStarts); // requestTime / sessionTime / totalTime;
 ++testRequestIndex;
 startPerformanceTest();
}
function getTestResult() {
 var totalDocumentSize = 0;
 var totalSessionTime = 0;
 var text = '';
 text += '<html>\n\n<head>\n<title>performanceLog</title>\n</head>\n\n<body>\n<p align="center">\n';
 text += '<table cols="5" rows="' + (testRequestArray.length+1) + '" cellspacing="0" cellpadding="7" border="1" bordercolor="#000000">\n';
 text += '<tr>\n';
 text += '\t<td align="right"><b>document-name</b></td>\n';
 text += '\t<td align="right"><b>document-size</b></td>\n';
 text += '\t<td align="right"><b>response-time</b></td>\n';
 text += '\t<td align="right"><b>total-time</b></td>\n';
 text += '\t<td align="right"><b>document-capacity</b></td>\n';
 text += '</tr>\n';
 for (var i=0;i<testRequestArray.length;i++) {
  totalDocumentSize += parseFloat(testRequestArray[i][1]);
  totalSessionTime += parseFloat(testRequestArray[i][3]);
  text += '<tr>\n';
  text += '\t<td align="right">' + testRequestArray[i][0] + '</td>\n';
  text += '\t<td align="right">' + testRequestArray[i][1] + ' kByte</td>\n';
  text += '\t<td align="right">' + (Math.round(parseFloat(testRequestArray[i][2])/10)/100) + ' sec</td>\n';
  text += '\t<td align="right">' + (Math.round(parseFloat(testRequestArray[i][3])/10)/100) + ' sec</td>\n';
  text += '\t<td align="right">' + (Math.round(parseFloat(testRequestArray[i][1])/(parseFloat(testRequestArray[i][3])/1000)*100)/100) + ' kB/sec</td>\n';
  text += '</tr>\n';
 }
 text += '<tr>\n';
 text += '\t<td colspan="4" align="right"><b>average-session-capacity : </b></td>\n';
 text += '\t<td align="right"><b>' + (Math.round(totalDocumentSize/(totalSessionTime/1000)*100)/100) + '</b> kB/sec</td>\n';
 text += '</tr>\n';
 text += '</table>\n</p>\n</body>\n\n</html>';
 return text;
}
//-->
</script>
</head>

<body onload="startPerformanceTest()">
<br><br><br><br><br><br><br><br><br><br><br>
<p align="center">performance-test<br><br>das test-fenster waehrend der messung<br>bitte nicht schliessen - !!absturzgefahr!!</p>
</body>

</html>

eine Deiner testseiten muesste dann mit entsprechend viel text
   bepackt so aussehen, wobei die script-einlassungen sowohl am
   anfang als auch am ende dieser seiten bestehen bleiben muessen:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
<title>testRequest01.html</title>
<script type="text/javascript" language="JavaScript">
<!--
 if (self.opener) {
  opener.timeRespondStarts = new Date().getTime();
  var isOk = true;
 }
//-->
</script>
</head>

<body onload="if(isOk){opener.writePerfomanceLog();}">
<!--
 hier muss moeglichst viel text dazwischen,

so dass die datei "testRequest01.html" am
 besten zwischen 60 und 200 kByte gross ist;

die uebertragungszeit wird schon am dateiende gestoppt,
 da der "onload"-event ja erst mit dem vollstaendigen
 aufbau des dokuments gefeuert wird;
//-->
</body>
<script type="text/javascript" language="JavaScript">
<!--
 if (isOk) {opener.timeRequestEnds = new Date().getTime();}
//-->
</script>

</html>

damit Du das auch gleich mal testen kannst, habe ich das
   ergebnis des heutigen abends unter diese adresse gepackt:
   http://www.pseliger.de/themen/colorPicker/clientsideWebPerformance.html

die zugangsdaten lauten [ selfhtml / selfhtml ];

dabei handelt es sich um einen testdurchlauf ueber 3 reine
   html-files mit groessen von 171kByte, 111kByte und 302kByte;

viel spass - tschuess und by(t)e by(t)e - peterS.