Marko: Performancemessung einer Webanwendung

Hallo Forum,

ich suche ein Tool, mit dem ich die Antwortzeiten und Übertragungszeiten einer Webanwendung auf der Ebene des HTTPS 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

Brauch ich da einen Sniffer, ich hab mir mal den Ethereal installiert, weiss aber irgendwie nicht, wie ich an die benötigten Daten komme.
Kann mir jemand eine geignete Software nennen, die unter WIN NT 4 läuft, nach Möglichkeit Shareware oder Freeware, kann aber auch kommerziell sein.

Gruss und Danke

Marko

  1. 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.