home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / www / httpd / transperf.java < prev   
Text File  |  1995-08-11  |  4KB  |  153 lines

  1. /*
  2.  * @(#)TransPerf.java    1.1 95/04/03
  3.  * 
  4.  * Copyright (c) 1995 Sun Microsystems, Inc.  All Rights reserved Permission to
  5.  * use, copy, modify, and distribute this software and its documentation for
  6.  * NON-COMMERCIAL purposes and without fee is hereby granted provided that
  7.  * this copyright notice appears in all copies. Please refer to the file
  8.  * copyright.html for further important copyright and licensing information.
  9.  * 
  10.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  11.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  12.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  13.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  14.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  15.  * ITS DERIVATIVES.
  16.  */
  17.  
  18. package net.www.httpd;
  19.  
  20. import java.io.*;
  21. import net.www.html.URL;
  22.  
  23. /**
  24.  * A class to measure the transaction performance of an http server.
  25.  * @author  James Gosling
  26.  */
  27.  
  28. class TransPerf implements Runnable {
  29.     int ntrans;
  30.     long totbytes;
  31.     long totmillis;
  32.     long totconnmillis;
  33.     int stime;
  34.  
  35.     String protocol = "http";
  36.     String host = "tachyon.eng";
  37.     String port = "";
  38.     String ufile = "files.list";
  39.     String uprefix;
  40.  
  41.     String urls[] = new String[10];
  42.     int nurls;
  43.     int nproc = 20;
  44.  
  45.     synchronized void addSample(int nbytes, int nmillis, int cmillis) {
  46.     totbytes += nbytes;
  47.     ntrans += 1;
  48.     totmillis += nmillis;
  49.     totconnmillis += cmillis;
  50.     }
  51.     synchronized void clearStats() {
  52.     ntrans = 0;
  53.     totbytes = 0;
  54.     totmillis = 0;
  55.     totconnmillis = 0;
  56.     stime = System.nowMillis();
  57.     }
  58.     synchronized void printStats(PrintStream out) {
  59.     int etime = System.nowMillis();
  60.  
  61.     out.print("Results for "+uprefix+"   "+nproc+" threads\n");
  62.     out.print(ntrans + "\ttotal transactions\n");
  63.     out.print(totbytes / (1024. * 1024) + "\tMb transferred\n");
  64.     out.print((etime - stime) / 1000 + "\tseconds elapsed\n");
  65.     out.print((ntrans * 1000.) / (etime - stime) + "\ttransactions/second\n");
  66.     out.print(totbytes / ((double) (etime - stime)) + "\tKb/second\n");
  67.     out.print(totconnmillis / ntrans + "\taverage msec to first byte\n");
  68.     }
  69.  
  70.     void doTransaction(String uname, byte inbuf[]) {
  71.     URL u = new URL(null, uname);
  72.     int T0 = System.nowMillis();
  73.     InputStream in = u.openStream();
  74.     int T1 = System.nowMillis();
  75.     int nbytes = 0;
  76.     int n = 0;
  77.     while ((n = in.read(inbuf, 0, inbuf.length)) >= 0)
  78.         nbytes += n;
  79.     in.close();
  80.     int T2 = System.nowMillis();
  81.     addSample(nbytes, T2 - T0, T1 - T0);
  82.     }
  83.     public void run() {
  84.     byte inbuf[] = new byte[8 * 1024];
  85.     while (true) {
  86.         try {
  87.         doTransaction(uprefix + urls[(int) (Math.random() * nurls)], inbuf);
  88.         } catch(Exception e) {
  89.         e.printStackTrace();
  90.         }
  91.     }
  92.     }
  93.     void runTest(String argv[]) {
  94.     double t = 0.5;
  95.     for (int i = 0; i < argv.length; i++) {
  96.         String s = argv[i];
  97.         try {
  98.         if (s.equals("-t"))
  99.             t = Double.valueOf(argv[++i]).doubleValue();
  100.         else if (s.equals("-n"))
  101.             nproc = Integer.parseInt(argv[++i]);
  102.         else if (s.equals("-protocol"))
  103.             protocol = argv[++i];
  104.         else if (s.equals("-h"))
  105.             host = argv[++i];
  106.         else if (s.equals("-p"))
  107.             port = ":" + argv[++i];
  108.         else if (s.equals("-f"))
  109.             ufile = ":" + argv[++i];
  110.         else {
  111.             System.out.print("Illegal argument: " + s + "\n");
  112.             return;
  113.         }
  114.         } catch(Exception e) {
  115.         System.out.print("Error in argument: " + s + "\n");
  116.         return;
  117.         }
  118.     }
  119.     uprefix = protocol + "://" + host + port;
  120.     try {
  121.         InputStream in = new FileInputStream(ufile);
  122.         StreamTokenizer st = new StreamTokenizer(new BufferedInputStream(in));
  123.         st.resetSyntax();
  124.         st.wordChars(0, 0377);
  125.         st.whitespaceChars(0, ' ');
  126.         st.quoteChar('"');
  127.         st.quoteChar('\'');
  128.         while (st.nextToken() != StreamTokenizer.TT_EOF)
  129.         if (st.sval != null) {
  130.             if (nurls >= urls.length) {
  131.             String nu[] = new String[nurls * 2];
  132.             System.arraycopy(urls, 0, nu, 0, urls.length);
  133.             urls = nu;
  134.             }
  135.             urls[nurls++] = st.sval.charAt(0) == '/' ? st.sval : "/" + st.sval;
  136.         }
  137.         in.close();
  138.     } catch(Exception e) {
  139.         System.out.print("Error reading file list: " + ufile + "\n");
  140.         System.exit(-1);
  141.     }
  142.     clearStats();
  143.     for (int i = nproc; --i >= 0;)
  144.         new Thread(this).start();
  145.     Thread.sleep((int) (60000 * t));
  146.     printStats(System.out);
  147.     }
  148.     public static void main(String argv[]) {
  149.     new TransPerf ().runTest(argv);
  150.     System.exit(0);
  151.     }
  152. }
  153.