Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0a3208074846
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 4aa79cea35f3
Choose a head ref
  • 2 commits
  • 5 files changed
  • 1 contributor

Commits on Sep 17, 2015

  1. Copy the full SHA
    9ac1f33 View commit details
  2. [Truffle] Time metrics.

    chrisseaton committed Sep 17, 2015
    Copy the full SHA
    4aa79ce View commit details
5 changes: 2 additions & 3 deletions core/src/main/java/org/jruby/Ruby.java
Original file line number Diff line number Diff line change
@@ -548,9 +548,7 @@ public void runFromMain(InputStream inputStream, String filename) {
return;
}

Main.printTruffleTimeMetric("before-parse-initial");
ParseResult parseResult = parseFromMain(filename, inputStream);
Main.printTruffleTimeMetric("after-parse-initial");

// if no DATA, we're done with the stream, shut it down
if (fetchGlobalConstant("DATA") == null) {
@@ -844,8 +842,9 @@ public IRubyObject runInterpreter(ThreadContext context, Node rootNode, IRubyObj
if (getInstanceConfig().getCompileMode() == CompileMode.TRUFFLE) {
assert rootNode instanceof RootNode;
assert self == getTopSelf();
final TruffleContextInterface truffleContext = getTruffleContext();
Main.printTruffleTimeMetric("before-run");
getTruffleContext().execute((RootNode) rootNode);
truffleContext.execute((RootNode) rootNode);
Main.printTruffleTimeMetric("after-run");
return getNil();
} else {
16 changes: 11 additions & 5 deletions test/truffle/startup/process-times.rb
Original file line number Diff line number Diff line change
@@ -10,14 +10,20 @@
# Calculates where the time goes for important regions while running a program.

# For example:
# $ test/truffle/startup/jruby-timed -X+T -Xtruffle.metrics.time=true -e 'puts 14' 2>&1 | ruby test/truffle/startup/process-times.rb
# $ test/truffle/startup/jruby-timed -X+T -Xtruffle.metrics.time=true -e 'puts 14' 2>&1 | ruby test/truffle/startup/process-times.rb foo

NAME = ARGV[0]

def print_time(region, time)
puts "time-#{region}-#{NAME}: #{(time*1000).round} ms"
end

before_times = {}
after_times = {}
nesting = 0
accounted = 0

ARGF.each do |line|
$stdin.each_line do |line|
if line =~ /([\w-]+) (\d+\.\d+)/
id = $1.split('-')
relative = id.first
@@ -37,13 +43,13 @@
accounted += elapsed
end

puts "#{region} #{elapsed}"
print_time region, elapsed
nesting -= 1
end
end
end

total = after_times['launcher'] - before_times['launcher']

puts "accounted #{accounted}"
puts "unaccounted #{total - accounted}"
print_time 'accounted', accounted
print_time 'unaccounted', total - accounted
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.oracle.truffle.api.dsl.GeneratedBy;
import com.oracle.truffle.api.dsl.NodeFactory;
import com.oracle.truffle.api.object.DynamicObject;
import org.jruby.Main;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;

@@ -48,6 +49,7 @@ private void addPrimitive(String name, RubiniusPrimitiveConstructor constructor)
public void addAnnotatedPrimitives() {
final List<NodeFactory<? extends RubyNode>> nodeFactories = new ArrayList<>();

Main.printTruffleTimeMetric("before-load-rubinius-nodes");
nodeFactories.addAll(VMPrimitiveNodesFactory.getFactories());
nodeFactories.addAll(ObjectPrimitiveNodesFactory.getFactories());
nodeFactories.addAll(TimePrimitiveNodesFactory.getFactories());
@@ -70,6 +72,7 @@ public void addAnnotatedPrimitives() {
nodeFactories.addAll(ExceptionPrimitiveNodesFactory.getFactories());
nodeFactories.addAll(ThreadPrimitiveNodesFactory.getFactories());
nodeFactories.addAll(WeakRefPrimitiveNodesFactory.getFactories());
Main.printTruffleTimeMetric("after-load-rubinius-nodes");

// This comes last as a catch-all
nodeFactories.addAll(UndefinedPrimitiveNodesFactory.getFactories());
Original file line number Diff line number Diff line change
@@ -26,10 +26,7 @@
import jnr.posix.POSIXFactory;
import org.jcodings.Encoding;
import org.jcodings.specific.UTF8Encoding;
import org.jruby.Ruby;
import org.jruby.RubyNil;
import org.jruby.RubyString;
import org.jruby.TruffleContextInterface;
import org.jruby.*;
import org.jruby.ext.ffi.Platform;
import org.jruby.ext.ffi.Platform.OS_TYPE;
import org.jruby.runtime.Visibility;
@@ -167,6 +164,7 @@ public RubyContext(Ruby runtime) {
threadManager = new ThreadManager(this);
threadManager.initialize();


rubiniusPrimitiveManager = new RubiniusPrimitiveManager();
rubiniusPrimitiveManager.addAnnotatedPrimitives();

Original file line number Diff line number Diff line change
@@ -512,6 +512,7 @@ private void addCoreMethods() {
// Bring in core method nodes
CoreMethodNodeManager coreMethodNodeManager = new CoreMethodNodeManager(objectClass, node.getSingletonClassNode());

Main.printTruffleTimeMetric("before-load-truffle-nodes");
coreMethodNodeManager.addCoreMethodNodes(ArrayNodesFactory.getFactories());
coreMethodNodeManager.addCoreMethodNodes(BasicObjectNodesFactory.getFactories());
coreMethodNodeManager.addCoreMethodNodes(BindingNodesFactory.getFactories());
@@ -557,6 +558,8 @@ private void addCoreMethods() {
coreMethodNodeManager.addCoreMethodNodes(ZlibNodesFactory.getFactories());
coreMethodNodeManager.addCoreMethodNodes(ObjSpaceNodesFactory.getFactories());
coreMethodNodeManager.addCoreMethodNodes(EtcNodesFactory.getFactories());
Main.printTruffleTimeMetric("after-load-truffle-nodes");

coreMethodNodeManager.allMethodInstalled();

basicObjectSendMethod = Layouts.MODULE.getFields(basicObjectClass).getMethods().get("__send__");
@@ -715,29 +718,6 @@ private void initializeRubiniusFFI() {
Layouts.MODULE.getFields(rubiniusFFIModule).setConstant(node, "TYPE_VARARGS", RubiniusTypes.TYPE_VARARGS);
}

public void loadRubyCore(String fileName, String prefix) {
final Source source;

try {
// TODO CS 28-Feb-15 need to use SourceManager here so that the debugger knows about the core files
source = Source.fromReader(new InputStreamReader(getRubyCoreInputStream(fileName), StandardCharsets.UTF_8), prefix + fileName);
} catch (IOException e) {
throw new RuntimeException(e);
}

context.load(source, node, NodeWrapper.IDENTITY);
}

public InputStream getRubyCoreInputStream(String fileName) {
final InputStream resource = getClass().getResourceAsStream("/" + fileName);

if (resource == null) {
throw new RuntimeException("couldn't load Truffle core library " + fileName);
}

return resource;
}

public void initializeEncodingConstants() {
getContext().getRuntime().getEncodingService().defineEncodings(new EncodingService.EncodingDefinitionVisitor() {
@Override