Performance

Contents
  • Models
  • Eclipse
  • Profiling
  • Remote resources
  • Overview

    When a model is run, some run data is printed to stdout, such as:
    2212 ms. Memory: 31664K Free: 7107K (22%)
    
    This data is printed by ptolemy.actor.Manager, which has methods such as timeAndMemory()

    To measure the time of an execution within a model, you could use the WallClockTime actor, see

    The Expression Language also has totalMemory and freeMemory variables that can be accessed, though the values tend to get cached, so they are not always updated during the execution of a system. To do performance measurements, run models without a GUI and then do several runs, tossing out the times for the first run. $PTII/ptolemy/actor/lib/test/performance, has some scripts that might be of use.

    Models

  • ptolemy/actor/lib/test/performance/ - models that test performance
  • ptolemy/data/type/test/performance.xml - type system performance testing
  • ptolemy/domains/de/lib/test/Time.java - Simple DE domain test. To run it, do
    cd $PTII/ptolemy/domains/de/lib/test
    java -classpath $PTII ptolemy.domains.de.lib.test.Time
    
  • ptolemy/domains/de/test/auto/TwoSigmaDelta.xml - Test that runs the a version of the sigma delta demo. This test takes 3-7 seconds.
  • ptolemy/domains/wireless/test/performance.xml - Wireless domain test. Note that the Wireless domains extends the Discrete Event (DE) domain, so this is also a good DE test.
  • Eclipse

    In Eclipse, use the Test & Performance Tools Platform (TPTP) Project

    See the TPTP Documentation

    1. Use the update manager to install EMF
      Help
    2. Use the update manager to install tptp
      1. From the Help menu in Eclipse, select Software Updates > Find and Install.
      2. Select the Search for new features to install radio button. Click Next.
      3. Add a new update site by clicking on New Remote Site.
      4. Enter the following name and URL and click OK:
        • Name: TPTP Update site
        • URL: http://eclipse.org/tptp/updates/site.xml
      5. Click Finish.
      6. In the "Search Results" dialog box, select the features to install.
        1. Select TPTP 4.2.0
        2. Unselect the BIRT and Web profiling packages
        Then click Next.
      7. In the "Feature License" dialog box, accept the license and click Next.
      8. In the "Installation" dialog box, verify the features to be installed and change install location if necessary. Then click Finish.
      9. After you click Finish, you will be presented a confirmation about a digital signature. Click Install All.
      10. When done, restart your workbench.

    Java 1.5 profiler and Eclipse

    Profiling J2SW 5.0 based applications using Eclipse
    1. Install the New Technology Agent Controller version 4.2+.
      1. See the Agent Controller 4.2 Windows IA32 Getting Started Guide
      2. Download the TPTP New Technology Agent Controller version 4.2+. (Agent Controller 4.2.0.2 Windows-IA32) and unzip in any directory.
      3. Go to the bin/ directory of the Agent Controller and run SetConfig.bat.
      4. While in the Agent Controller bin/ directory, start the Agent Controller with ./ACServer.exe.
    2. Download the JVMTI Client and unzip it in the Eclipse directory
    3. Download the New Java Profiler and unzip it in the same directory as the New Technology Agent Controller.
    4. Restart Eclipse
    5. See 2.4 Configuring The Eclipse Client:
      The New Java Profiler works with the New Technology Agent Controller. The client should be configured to connect to the New Technology Agent Controller port. This is configured in the file "serviceConfig.xml" in the /config directory. The default client connection port number of the New Technology Agent Controller is 10006.

      To configure the hostname, navigate to the Preferences menu ( Window > Preferences ) in the Eclipse Workbench and click on "Profiling and Logging". Change the "Agent Controller local port" to 10006. You will also need to select "Host" under "Profiling and Logging" to add a localhost entry with port 10006. (fig 2.1)

    6. Do Run -> Profiler -> Monitor and select Java Profiling with Instrumentation.
    7. Run the profiler
    8. In the Profile view, you should be able to start and stop the profiler

    Problems

    org.eclipse.core.runtime.CoreException
    org.eclipse.core.runtime.CoreException
    The process launcher seems to be inactive.  Restart the Agent Controller and try again.
    
    org.eclipse.core.runtime.CoreException: The process launcher seems to be inactive.  Restart the Agent Controller and try again.
      at org.eclipse.tptp.trace.ui.internal.launcher.core.LauncherUtility.createCoreException(LauncherUtility.java:115)
      at org.eclipse.tptp.trace.ui.internal.launcher.core.LauncherUtility.createCoreException(LauncherUtility.java:123)
      at org.eclipse.tptp.platform.jvmti.client.internal.launcher.TIDelegateHelper.handleError(TIDelegateHelper.java:278)
      at org.eclipse.tptp.platform.jvmti.client.internal.launcher.TIDelegateHelper.launchProcess(TIDelegateHelper.java:264)
      at org.eclipse.tptp.platform.jvmti.client.internal.launcher.TIDelegateHelper.launch(TIDelegateHelper.java:173)
      at org.eclipse.tptp.platform.jvmti.client.internal.launcher.TIJavaLauncherDelegate.launch(TIJavaLauncherDelegate.java:37)
      at org.eclipse.tptp.trace.ui.provisional.launcher.PrimaryLaunchDelegate.run(PrimaryLaunchDelegate.java:249)
      at java.lang.Thread.run(Thread.java:595)
    
    1. In Window -> Preferences -> "Profiling and Logging", make sure that port 10006 is selected and click on the test button.
    2. In Run -> Profile -> Monitor, select "Java Profilin with Instrumentation" and click on the "Test availability" button.
       
      The JVMTI agent org.eclipse.tptp.jvmti is not available.
      Make sure that the agent's libraries are available and that
      it is configured properly
      

      See Re: jvmti agent

      It looks like the javaprofiler.all_platforms-TPTP-4.2.0.2.zip file should not be extracted in the Agent Controller home directory, it does not put the files in the plugin directory, instead it created a tptp directory that has platform specific files in it. In the Agent Controller directory, either

      • tptp/javaprofiler/win_ia32/plugins/org.eclipse.tptp.javaprofiler/ directory to plugins
      • or Download the JVMTI Agent controller extension for Windows-IA32 Runtime and unzip it in the Agent Controller directory.
      • In the Agent Controller bin directory, rerun SetConfig.bat and restart ACServer
      • In Eclipse: run -> Profile -> Monitor, select "Java Profilin with Instrumentation" and click on the "Test availability" button.

    Profiling

    In JDK1.3, try

    java -Xrunhprof:help
    

    Simple timing

    One simple way to time a run is to modify the run() method in ptolemy.actor.Manager so that System.out.println(new Date()).getTime()) is called at the start and the end of the run() method.

    You may also need to include the following at the top with the other import statements.

    import java.util.Date;
    

    Performance

    Measuring the performance of an Applet inside a browser is tricky.

    http://help.netscape.com/kb/consumer/19970907-1.html says

    To troubleshoot your Java applets in UNIX environment, you can start Communicator with the "-java" switch.
    
    
     #netscape -java
     Usage: -java [-options] class
    
     where options include:
         -help             print out this message
         -version          print out the build version
         -v -verbose       turn on verbose mode
         -debug            enable remote JAVA debugging
         -noasyncgc        don't allow asynchronous garbage collection
         -verbosegc        print a message when garbage collection occurs
         -noclassgc        disable class garbage collection
         -cs -checksource  check if source is newer when loading classes
         -ss<number>       set the maximum native stack size for any thread
         -oss<number>      set the maximum Java stack size for any thread
         -ms<number>       set the initial Java heap size
         -mx<number>       set the maximum Java heap size
         -D<name>=<value>  set a system property
         -classpath <directories separated by ':'>
                           list directories in which to look for classes
         -prof[:<file>]    output profiling data to ./java.prof or ./<file>
         -verify           verify all classes when read in
         -verifyremote     verify classes read in over the network [default]
         -noverify         do not verify any class
    

    And http://help.netscape.com/kb/consumer/19970907-2.html

    You can automatically startup the Java Virtual Machine as you launch
     Communicator. This will prevent Communicator from restarting the
     Java Virtual Machine each time you browse pages that have Java applets
     or audio files played by the liveaudio plugin.
    
     The command to use is :
     "C:\Program Files\Netscape\Communicator\Program\netscape.exe" -start_java
    
     You can edit the properties of your start icon of the Communicator
     to add the option. You can also start the messenger (or other
     component) the same way by :
     "C:\Program Files\Netscape\Communicator\Program\netscape.exe" -start_java -mail
    
     Note: This doesn't seem to work on NT3.51
    

    Memory Leaks

    Under C and C++, one must manage memory by hand.

    Java has a garbage collector, which helps, but memory leaks are still possible. Usually, an object is marked as being eligible for GC when it goes out of scope. Or, if the value of the object is null, then it may be GC'd. However, an object will not be garbage collected if the object has references to it. This is how we get memory leaks.

    We can ask that the garbage collector be run with

    System.gc();
    
    For example, we do this in the code generator after building the large AST that represents the java.lang and ptolemy.kernel classes.

    Finalization is what happens before an object is GC'd. We can force the system to run the finalize method on all objects that are waiting to be finalized with:

    System.runFinalization();
    
    For further information, see Java Tutorial Page about Garbage Collection and IBM page about memory leaks

    Increasing the size of the Heap

    Sometimes, as a workaround, all that is necessary is to increase the size of the Java heap. The java command takes non-standard commands like -Xmxsize to set the maximum stack size. For example, under Cygwin, to run with a 256 megabyte heap size:
    export JAVAFLAGS=-Xmx256m
    $PTII/bin/vergil
    
    To see what other -X commands are available, run
    java -X
    

    HP's JMeter

    HP's JMeter is a tool available as a free download after a quick registration from http://www.hp.com/products1/unix/java/hpjmeter/. HP's JMeter works with Java 1.2 through 1.5.

    To generate the profile, do c:/Program\ Files/java/jdk1.5.0_05/bin/java -Xmx256M "-Dptolemy.ptII.dir=c:/cxh/ptII" -Xrunhprof:heap=all,depth=30 -classpath "c:\cxh\ptII;c:\cxh\ptII\lib\diva.jar" ptolemy.vergil.VergilApplication To run the HP JMeter tool:

    java -Xmx256m -jar $PTII/vendors/hpjmeter/HPjmeter.jar
    
    Then open up the java.prof.txt

    JMeter reported a syntax error, I then had to edit v.hprof.txt and move two bogus lines:

    ROOT 50000105 (kind=, id=200000, trace=300000)
    ROOT 50000187 (kind=, id=200003, trace=300000)
    HEAP DUMP BEGIN (4250 objects, 298272 bytes) Tue Jun 08 11:23:54 2004
    
    became
    HEAP DUMP BEGIN (4250 objects, 298272 bytes) Tue Jun 08 11:23:54 2004
    ROOT 50000105 (kind=, id=200000, trace=300000)
    ROOT 50000187 (kind=, id=200003, trace=300000)
    

    Heap Analysis Tool

    Heap Analysis Tool (HAT) is a freely available tool from https://hat.dev.java.net/ that can process -Xrunhprof data. HAT works best with Java 1.2, it did not work for me with Java 1.4.2:
    java.io.IOException: Stack trace not found for serial # 0
    	at hat.parser.HprofReader.getStackTraceFromSerial(HprofReader.java:611)
    	at hat.parser.HprofReader.readArray(HprofReader.java:777)
    

    See the JDC Book that discusses Heap Analysis Tool for downloads and further information.

    Generate a hprof file:

     java -Xrunhprof:file=vergil.hprof,format=b -classpath $PTII/lib/diva.jar\;$PTII/ptolemy/vergil/vergil.jar\;$PTII/ptolemy/ptolemy.jar\;$PTII ptolemy.vergil.VergilApplication
    
    Run HAT:
    java -classpath hat.zip\;$PTII/lib/diva.jar\;$PTII/ptolemy/vergil/vergil.jar\;$PTII/ptolemy/ptolemy.jar\;$PTII -mx100m hat.Main vergil.hprof
    

    Java 1.5 Console

    Java 1.5 includes the Java Console, which can be used to monitor memory usage. http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
    1. In Cygwin bash, set the JAVAFLAGS property:
      export JAVAFLAGS=-Dcom.sun.management.jmxremote
      
    2. Start up vergil
      $PTII/bin/vergil &
      
    3. Start up jconsole
      jconsole
      

    Remote resources

    Commercial Profilers

  • IBM's HeapRoots (Free download after registration?)
  • JMP GPL'd, written in C, uses GTK
  • HP's JMeter (Free download after registration)
  • JProbe (Commercial tool)
  • JProfiler (Commercial tool, $199 University Pricing)
  • Purify - Case Study
  • Optimizeit Suite
  • Metrowerks
  • Sun's Forte For Java
  • Quantify
  • Java and Optimization

  • Java HotSpot FAQ
  • PerfAnal: A Performance Analysis Tool (March 2000 Java Developer Connection Article - The JDC requires registration, but is free to join)
  • JDC Book that discusses Heap Analysis Tool
  • Java.sun.com article - TechUsing Hprof to Tune performance
  • September 1998 Javaworld article - includes a benchmark applet
  • March 1997 Javaworld article - includes a benchmark applet
  • JavaSoft Tutorial garbage collection information
  • CMU Java optimization page
  • developer JDBC Book
  • "Some tips on Java Performance"
  • Benchmarks

  • Yahoo Java Benchmarks
  • Java Performance Report (1997)
  • Scripting and Java

  • Kernighan Scripting Benchmark paper
  • Ptolemy Group Scripting Benchmark paper
  • Last Updated: $Date: 2009-03-05 16:33:16 -0800 (Thu, 05 Mar 2009) $