From 5f6fb6d2816e7ffa0a0267875ce1b7b60a5fd8eb Mon Sep 17 00:00:00 2001 From: Hiroshi Nakamura Date: Thu, 5 Apr 2012 16:15:07 +0900 Subject: [PATCH] Add examples for JavaOne Tokyo 2012 slides --- javaone-tokyo-2012/indy_inline/1_string.rb | 9 +++++ javaone-tokyo-2012/indy_inline/1_string.txt | 27 +++++++++++++++ javaone-tokyo-2012/indy_inline/2_literal.rb | 9 +++++ javaone-tokyo-2012/indy_inline/2_literal.txt | 12 +++++++ javaone-tokyo-2012/indy_inline/3_constant.rb | 11 ++++++ javaone-tokyo-2012/indy_inline/3_constant.txt | 11 ++++++ javaone-tokyo-2012/indy_inline/4_ivar.rb | 24 +++++++++++++ javaone-tokyo-2012/indy_inline/4_ivar.txt | 32 ++++++++++++++++++ javaone-tokyo-2012/indy_inline/5_invoke.rb | 13 +++++++ javaone-tokyo-2012/indy_inline/5_invoke.txt | 18 ++++++++++ javaone-tokyo-2012/indy_inline/6_math.rb | 9 +++++ javaone-tokyo-2012/indy_inline/6_math.txt | 14 ++++++++ javaone-tokyo-2012/java-inline/Target.java | 19 +++++++++++ javaone-tokyo-2012/javacall/Command.java | 18 ++++++++++ javaone-tokyo-2012/jrubycall/main.dot | 13 +++++++ javaone-tokyo-2012/jrubycall/main.rb | 16 +++++++++ javaone-tokyo-2012/jrubycall/main_compile.rb | 11 ++++++ javaone-tokyo-2012/jrubycall/main_dot.rb | 3 ++ javaone-tokyo-2012/jrubycall/process.png | Bin 0 -> 25553 bytes javaone-tokyo-2012/mh_example/all.rb | 30 ++++++++++++++++ javaone-tokyo-2012/mh_example/fib.rb | 7 ++++ 21 files changed, 306 insertions(+) create mode 100644 javaone-tokyo-2012/indy_inline/1_string.rb create mode 100644 javaone-tokyo-2012/indy_inline/1_string.txt create mode 100644 javaone-tokyo-2012/indy_inline/2_literal.rb create mode 100644 javaone-tokyo-2012/indy_inline/2_literal.txt create mode 100644 javaone-tokyo-2012/indy_inline/3_constant.rb create mode 100644 javaone-tokyo-2012/indy_inline/3_constant.txt create mode 100644 javaone-tokyo-2012/indy_inline/4_ivar.rb create mode 100644 javaone-tokyo-2012/indy_inline/4_ivar.txt create mode 100644 javaone-tokyo-2012/indy_inline/5_invoke.rb create mode 100644 javaone-tokyo-2012/indy_inline/5_invoke.txt create mode 100644 javaone-tokyo-2012/indy_inline/6_math.rb create mode 100644 javaone-tokyo-2012/indy_inline/6_math.txt create mode 100644 javaone-tokyo-2012/java-inline/Target.java create mode 100644 javaone-tokyo-2012/javacall/Command.java create mode 100644 javaone-tokyo-2012/jrubycall/main.dot create mode 100644 javaone-tokyo-2012/jrubycall/main.rb create mode 100644 javaone-tokyo-2012/jrubycall/main_compile.rb create mode 100644 javaone-tokyo-2012/jrubycall/main_dot.rb create mode 100644 javaone-tokyo-2012/jrubycall/process.png create mode 100644 javaone-tokyo-2012/mh_example/all.rb create mode 100644 javaone-tokyo-2012/mh_example/fib.rb diff --git a/javaone-tokyo-2012/indy_inline/1_string.rb b/javaone-tokyo-2012/indy_inline/1_string.rb new file mode 100644 index 0000000..8671933 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/1_string.rb @@ -0,0 +1,9 @@ +def target + "Hello" +end + +idx = 0 +while idx < 50000 + target + idx += 1 +end diff --git a/javaone-tokyo-2012/indy_inline/1_string.txt b/javaone-tokyo-2012/indy_inline/1_string.txt new file mode 100644 index 0000000..fd3ab3d --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/1_string.txt @@ -0,0 +1,27 @@ +$1_string::method__0$RUBY$target (7 bytes) + @ 1 java.lang.invoke.MethodHandle::invokeExact (12 bytes) inline (hot) + @ 5 org.jruby.runtime.invokedynamic.InvokeDynamicSupport::newString (10 bytes) inline (hot) + @ 6 org.jruby.RubyString::newStringShared (22 bytes) inline (hot) + @ 6 org.jruby.Ruby::getString (5 bytes) inline (hot) + @ 11 org.jruby.RubyString:: (19 bytes) inline (hot) + @ 4 org.jruby.RubyString:: (35 bytes) inline (hot) + @ 3 org.jruby.RubyObject:: (7 bytes) inline (hot) + @ 3 org.jruby.RubyBasicObject:: (42 bytes) inline (hot) + @ 1 java.lang.Object:: (1 bytes) inline (hot) + @ 30 org.jruby.Ruby::isObjectSpaceEnabled (5 bytes) inline (hot) + @ 38 org.jruby.RubyBasicObject::addToObjectSpace (30 bytes) never executed + +$1_string::method__0$RUBY$target (8 bytes) + @ 4 org.jruby.ast.executable.AbstractScript::getString0 (11 bytes) inline (hot) + @ 7 org.jruby.ast.executable.RuntimeCache::getString (14 bytes) inline (hot) + @ 6 org.jruby.ast.executable.RuntimeCache::getByteList (7 bytes) inline (hot) + @ 10 org.jruby.RubyString::newStringShared (22 bytes) inline (hot) + @ 6 org.jruby.Ruby::getString (5 bytes) inline (hot) + @ 11 org.jruby.RubyString:: (19 bytes) inline (hot) + @ 4 org.jruby.RubyString:: (35 bytes) inline (hot) + @ 3 org.jruby.RubyObject:: (7 bytes) inline (hot) + @ 3 org.jruby.RubyBasicObject:: (42 bytes) inline (hot) + @ 1 java.lang.Object:: (1 bytes) inline (hot) + @ 30 org.jruby.Ruby::isObjectSpaceEnabled (5 bytes) inline (hot) + @ 38 org.jruby.RubyBasicObject::addToObjectSpace (30 bytes) never executed + diff --git a/javaone-tokyo-2012/indy_inline/2_literal.rb b/javaone-tokyo-2012/indy_inline/2_literal.rb new file mode 100644 index 0000000..533c2f7 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/2_literal.rb @@ -0,0 +1,9 @@ +def target + 10000 +end + +idx = 0 +while idx < 50000 + target + idx += 1 +end diff --git a/javaone-tokyo-2012/indy_inline/2_literal.txt b/javaone-tokyo-2012/indy_inline/2_literal.txt new file mode 100644 index 0000000..ac01688 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/2_literal.txt @@ -0,0 +1,12 @@ +$2_literal::method__0$RUBY$target (7 bytes) + @ 1 java.lang.invoke.MethodHandle::invokeExact (9 bytes) inline (hot) + @ 2 sun.invoke.util.ValueConversions::identity (2 bytes) inline (hot) + + + + @ 36 $2_literal$method__0$RUBY$target::call (13 bytes) inline (hot) + @ 9 $2_literal$method__0$RUBY$target::call (21 bytes) inline (hot) + @ 17 $2_literal::method__0$RUBY$target (9 bytes) inline (hot) + @ 5 org.jruby.ast.executable.AbstractScript::getFixnum0 (11 bytes) inline (hot) + @ 7 org.jruby.ast.executable.RuntimeCache::getFixnum (33 bytes) inline (hot) + diff --git a/javaone-tokyo-2012/indy_inline/3_constant.rb b/javaone-tokyo-2012/indy_inline/3_constant.rb new file mode 100644 index 0000000..9e49b72 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/3_constant.rb @@ -0,0 +1,11 @@ +DEFAULT = 1 + +def target + DEFAULT +end + +idx = 0 +while idx < 50000 + target + idx += 1 +end diff --git a/javaone-tokyo-2012/indy_inline/3_constant.txt b/javaone-tokyo-2012/indy_inline/3_constant.txt new file mode 100644 index 0000000..0ed6d1e --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/3_constant.txt @@ -0,0 +1,11 @@ +$3_constant::method__0$RUBY$target (7 bytes) + @ 1 java.lang.invoke.MethodHandle::invokeExact (25 bytes) inline (hot) + @ 3 java.lang.invoke.MethodHandle::invokeExact (16 bytes) inline (hot) + @ 2 java.lang.invoke.MethodHandle::invokeExact (9 bytes) inline (hot) + @ 2 java.lang.invoke.MutableCallSite::getTarget (5 bytes) inline (hot) + @ 12 java.lang.invoke.MethodHandle::invokeExact (5 bytes) inline (hot) + @ 1 sun.invoke.util.ValueConversions::identity (2 bytes) inline (hot) + @ 10 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 21 java.lang.invoke.MethodHandle::invokeExact (6 bytes) inline (hot) + @ 2 sun.invoke.util.ValueConversions::identity (2 bytes) inline (hot) + diff --git a/javaone-tokyo-2012/indy_inline/4_ivar.rb b/javaone-tokyo-2012/indy_inline/4_ivar.rb new file mode 100644 index 0000000..378db8b --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/4_ivar.rb @@ -0,0 +1,24 @@ +module Cache + def target + @cache + end +end +class Foo + include Cache + def initialize + @cache = 1 + end +end +class Bar + include Cache + def initialize + @cache = 2 + end +end + +idx = 0 +obj = [Foo.new] +while idx < 100000 + obj.sample.target + idx += 1 +end diff --git a/javaone-tokyo-2012/indy_inline/4_ivar.txt b/javaone-tokyo-2012/indy_inline/4_ivar.txt new file mode 100644 index 0000000..ea64f32 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/4_ivar.txt @@ -0,0 +1,32 @@ +$4_invoke::method__1$RUBY$target (7 bytes) + @ 1 java.lang.invoke.MethodHandle::invokeExact (25 bytes) inline (hot) + @ 3 java.lang.invoke.MethodHandle::invokeExact (7 bytes) inline (hot) + @ 3 org.jruby.runtime.invokedynamic.InvocationLinker::testRealClass (20 bytes) inline (hot) + @ 5 org.jruby.RubyBasicObject::getMetaClass (5 bytes) inline (hot) + @ 8 org.jruby.RubyClass::getRealClass (2 bytes) inline (hot) + @ 10 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 21 java.lang.invoke.MethodHandle::invokeExact (14 bytes) inline (hot) + @ 21 java.lang.invoke.MethodHandle::invokeExact (27 bytes) inline (hot) + @ 3 java.lang.invoke.MethodHandle::invokeExact (7 bytes) inline (hot) + @ 3 org.jruby.runtime.invokedynamic.InvocationLinker::testRealClass (20 bytes) inline (hot) + @ 5 org.jruby.RubyBasicObject::getMetaClass (5 bytes) inline (hot) + @ 8 org.jruby.RubyClass::getRealClass (2 bytes) inline (hot) + @ 10 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 23 java.lang.invoke.MethodHandle::invokeExact (14 bytes) inline (hot) + @ 3 java.lang.invoke.MethodHandle::invokeExact (8 bytes) inline (hot) + @ 10 org.jruby.javasupport.util.RuntimeHelpers::nullToNil (10 bytes) inline (hot) + @ 3 java.lang.invoke.MethodHandle::invokeExact (8 bytes) inline (hot) + @ 10 org.jruby.javasupport.util.RuntimeHelpers::nullToNil (10 bytes) inline (hot) + + +$4_invoke::method__1$RUBY$target (7 bytes) + @ 1 java.lang.invoke.MethodHandle::invokeExact (25 bytes) inline (hot) + @ 3 java.lang.invoke.MethodHandle::invokeExact (7 bytes) inline (hot) + @ 3 org.jruby.runtime.invokedynamic.InvocationLinker::testRealClass (20 bytes) inline (hot) + @ 5 org.jruby.RubyBasicObject::getMetaClass (5 bytes) inline (hot) + @ 8 org.jruby.RubyClass::getRealClass (2 bytes) inline (hot) + @ 10 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 21 java.lang.invoke.MethodHandle::invokeExact (14 bytes) inline (hot) + @ 3 java.lang.invoke.MethodHandle::invokeExact (8 bytes) inline (hot) + @ 10 org.jruby.javasupport.util.RuntimeHelpers::nullToNil (10 bytes) inline (hot) + diff --git a/javaone-tokyo-2012/indy_inline/5_invoke.rb b/javaone-tokyo-2012/indy_inline/5_invoke.rb new file mode 100644 index 0000000..c1a4a0d --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/5_invoke.rb @@ -0,0 +1,13 @@ +def stub + 1 +end + +def target + stub +end + +idx = 0 +while idx < 50000 + target + idx += 1 +end diff --git a/javaone-tokyo-2012/indy_inline/5_invoke.txt b/javaone-tokyo-2012/indy_inline/5_invoke.txt new file mode 100644 index 0000000..0d24c23 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/5_invoke.txt @@ -0,0 +1,18 @@ +$5_invoke::method__1$RUBY$target (9 bytes) + @ 3 java.lang.invoke.MethodHandle::invokeExact (33 bytes) inline (hot) + @ 5 java.lang.invoke.MethodHandle::invokeExact (20 bytes) inline (hot) + @ 2 java.lang.invoke.MethodHandle::invokeExact (9 bytes) inline (hot) + @ 2 java.lang.invoke.MutableCallSite::getTarget (5 bytes) inline (hot) + @ 16 java.lang.invoke.MethodHandle::invokeExact (5 bytes) inline (hot) + @ 1 sun.invoke.util.ValueConversions::identity (2 bytes) inline (hot) + @ 12 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 29 java.lang.invoke.MethodHandle::invokeExact (35 bytes) inline (hot) + @ 5 java.lang.invoke.MethodHandle::invokeExact (7 bytes) inline (hot) + @ 3 org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass (17 bytes) inline (hot) + @ 5 org.jruby.RubyBasicObject::getMetaClass (5 bytes) inline (hot) + @ 14 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 31 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 6 $5_invoke::method__0$RUBY$stub (7 bytes) inline (hot) + @ 1 java.lang.invoke.MethodHandle::invokeExact (9 bytes) inline (hot) + @ 2 sun.invoke.util.ValueConversions::identity (2 bytes) inline (hot) + diff --git a/javaone-tokyo-2012/indy_inline/6_math.rb b/javaone-tokyo-2012/indy_inline/6_math.rb new file mode 100644 index 0000000..63bb187 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/6_math.rb @@ -0,0 +1,9 @@ +def target + 42 - 2 +end + +idx = 0 +while idx < 50000 + target + idx += 1 +end diff --git a/javaone-tokyo-2012/indy_inline/6_math.txt b/javaone-tokyo-2012/indy_inline/6_math.txt new file mode 100644 index 0000000..5612c70 --- /dev/null +++ b/javaone-tokyo-2012/indy_inline/6_math.txt @@ -0,0 +1,14 @@ +$6_math::method__0$RUBY$target (14 bytes) + @ 3 java.lang.invoke.MethodHandle::invokeExact (9 bytes) inline (hot) + @ 2 sun.invoke.util.ValueConversions::identity (2 bytes) inline (hot) + @ 8 java.lang.invoke.MethodHandle::invokeExact (33 bytes) inline (hot) + @ 5 java.lang.invoke.MethodHandle::invokeExact (7 bytes) inline (hot) + @ 3 org.jruby.runtime.invokedynamic.MathLinker::fixnumTest (20 bytes) inline (hot) + @ 8 org.jruby.Ruby::isFixnumReopened (5 bytes) inline (hot) + @ 12 java.lang.invoke.MethodHandle::invokeExact (10 bytes) inline (hot) + @ 29 java.lang.invoke.MethodHandle::invokeExact (7 bytes) inline (hot) + @ 29 java.lang.invoke.MethodHandle::invokeExact (11 bytes) inline (hot) + @ 7 org.jruby.runtime.invokedynamic.MathLinker::fixnumOperatorFail (109 bytes) never executed + @ 3 org.jruby.runtime.invokedynamic.MathLinker::fixnum_op_minus_two (9 bytes) inline (hot) + @ 5 org.jruby.RubyFixnum::op_minus_two (35 bytes) inline (hot) + diff --git a/javaone-tokyo-2012/java-inline/Target.java b/javaone-tokyo-2012/java-inline/Target.java new file mode 100644 index 0000000..8041165 --- /dev/null +++ b/javaone-tokyo-2012/java-inline/Target.java @@ -0,0 +1,19 @@ +public class Target { + double addAllSqrts(int max) { + double accum = 0; + for (int i = 0; i < max; i++) { + accum = addSqrt(accum, i); + } + return accum; + } + + double addSqrt(double a, int b) { + return a + Math.sqrt(b); + } + + public static void main(String[] args) { + for (int i = 0; i < 100000; ++i) { + (new Target()).addAllSqrts(10); + } + } +} diff --git a/javaone-tokyo-2012/javacall/Command.java b/javaone-tokyo-2012/javacall/Command.java new file mode 100644 index 0000000..0f20e36 --- /dev/null +++ b/javaone-tokyo-2012/javacall/Command.java @@ -0,0 +1,18 @@ +public class Command { + void processOptions(String[] options) { + boolean result; + for (String opt : options) { + result = process(opt.concat("?!")); + } + } + boolean process(String opt) { ... } + + void run() { + String[] options = { "yes", "no", "maybe" }; + processOptions(options); + } + + public static void main(String[] args) { + (new Main()).run(); + } +} diff --git a/javaone-tokyo-2012/jrubycall/main.dot b/javaone-tokyo-2012/jrubycall/main.dot new file mode 100644 index 0000000..b859e10 --- /dev/null +++ b/javaone-tokyo-2012/jrubycall/main.dot @@ -0,0 +1,13 @@ +digraph AST { +1451324290 [label="def: target"]; +10775091 [label="arg: opt"]; +1264572433 [label="call: process"]; +1477525092 [label="call: concat"]; +698782006 [label="Local: opt"]; +622466907 [label="Str: '?!'"]; +1451324290 -> 10775091; +1451324290 -> 1264572433; +1264572433 -> 1477525092; +1477525092 -> 698782006; +1477525092 -> 622466907; +} diff --git a/javaone-tokyo-2012/jrubycall/main.rb b/javaone-tokyo-2012/jrubycall/main.rb new file mode 100644 index 0000000..4d68f45 --- /dev/null +++ b/javaone-tokyo-2012/jrubycall/main.rb @@ -0,0 +1,16 @@ +def process_options(options) + for opt in options + process(opt.concat("?!")) + end +end + +def process(opt) + puts opt +end + +mock = Object.new +def mock.concat(arg) + "tested!" +end +options = ["yes", "no", mock] +process_options(options) diff --git a/javaone-tokyo-2012/jrubycall/main_compile.rb b/javaone-tokyo-2012/jrubycall/main_compile.rb new file mode 100644 index 0000000..af1a611 --- /dev/null +++ b/javaone-tokyo-2012/jrubycall/main_compile.rb @@ -0,0 +1,11 @@ +def process(opt) + opt +end + +def process_options(opt) + process(opt.concat("?!")) +end + +20000.times do + process_options("yes") +end diff --git a/javaone-tokyo-2012/jrubycall/main_dot.rb b/javaone-tokyo-2012/jrubycall/main_dot.rb new file mode 100644 index 0000000..dfaab95 --- /dev/null +++ b/javaone-tokyo-2012/jrubycall/main_dot.rb @@ -0,0 +1,3 @@ +def target(opt) + process(opt.concat("?!")) +end diff --git a/javaone-tokyo-2012/jrubycall/process.png b/javaone-tokyo-2012/jrubycall/process.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ce6d7edb76d989325f076c4c2418b038fd949b GIT binary patch literal 25553 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 literal 0 HcmV?d00001 diff --git a/javaone-tokyo-2012/mh_example/all.rb b/javaone-tokyo-2012/mh_example/all.rb new file mode 100644 index 0000000..52bf20c --- /dev/null +++ b/javaone-tokyo-2012/mh_example/all.rb @@ -0,0 +1,30 @@ +message = "Hello" +message << name << "!" + +times = 10000 +matcher = /[A-Z][a-z]*/ + +DEFAULT = Container.new.freeze +comtainer = DEFAULT +DEFAULT = nil + +module Cache + def cache(value) + @cache = value + end +end +class Foo + include Cache +end +class Bar + include Cache +end + +$name = [:JRuby, "Ruby", 42] +def process(router) + router.say_hello($names.sample) +end + +fib(n - 2) + fib(n - 1) +display if (x >= 5) +elapsed = msec * 1000.0 diff --git a/javaone-tokyo-2012/mh_example/fib.rb b/javaone-tokyo-2012/mh_example/fib.rb new file mode 100644 index 0000000..28c6656 --- /dev/null +++ b/javaone-tokyo-2012/mh_example/fib.rb @@ -0,0 +1,7 @@ +def fib(n) + if n < 2 + n + else + fib(n - 2) + fib(n - 1) + end +end