Top Description Interfaces Classes
[default module]

Package org.jruby.runtime.profile


The profile package contains the api to implement an profiler for jruby. In the sub-package builtin you can find the profiler implementation shipped with jruby. To implement your own profiler implement the ProfilingService interface, add your implementation to the classpath an add the command line argument --profile.service my.impl.class Example Profiling Service Impl.
public class MyProfiler implements ProfilingService {

  private final ConcurrentMap<Long, String> methods = new ConcurrentHashMap<Long, String>(1000);

  public ProfileCollection newProfileCollection(ThreadContext threadContext) {
    return new MyCollection();
  }

  public MethodEnhancer newMethodEnhancer(Ruby ruby) {
    return new MyMethodEnhancer();
  }

  public ProfileReporter newProfileReporter(ThreadContext threadContext) {
    return new MyReporter();
  }

  private class MyCollection implements ProfileCollection {

    private long serial;

    public void profileEnter(long method) {
      this.serial = method;
    }

    public void profileExit(long method, long time) {
      String name = methods.get(serial);
      serial = method;
      System.out.println(name + ": " + (System.nanoTime() - time));
    }
  }

  private class MyMethodEnhancer implements MethodEnhancer {

    public DynamicMethod enhance(String name, DynamicMethod delegate) {
      if ( isMyApp( delegate ) ) {
        methods.putIfAbsent(delegate.getSerialNumber(), name);
        return new ProfilingDynamicMethod(delegate);
      } else {
        return delegate;
      }
    }

    private boolean isMyApp( DynamicMethod method ) {
      //if( delegate.getRealMethod() instanceof PositionAware && ((PositionAware)delegate.getRealMethod()).getFile().contains(""))
      return method.getRealMethod().getImplementationClass().getId().startsWith("MyApp::");
    }
  }

  private static class MyReporter implements ProfileReporter {

    public void report(ProfileCollection profileCollection) {
      MyCollection collection = (MyCollection) profileCollection;
      // do nothing
    }
  }

}
 
Author
Andre Kullmann

Interface Summary

Modifier and TypeInterface and Description
public interface
MethodEnhancer

Implementations of this interface will be used to enhance methods with profiling information/ callbacks.

public interface
ProfileCollection

Each ThreadContext has an ProfileCollection property in profile mode.

public interface
ProfileReporter

The used ProfilingService will create an instance of this class at the end of each org.jruby.RubyThread or at jruby shutdown the org.jruby.runtime.profile.ProfileReporter#report(ProfileCollection) is called with the ProfileCollection associated with the current Thread.

public interface
ProfilingService

A ProfilingService is used to profile jruby programs.

Class Summary

Modifier and TypeClass and Description
public class
ProfilingServiceLookup

This helper is used to get the configured org.jruby.runtime.profile.ProfilingService for the current Ruby instance.