[#390749] Why are there so many similar/identical methods in core classes — Kassym Dorsel <k.dorsel@...>

Let's look at the Array class and start with method aliases.

14 messages 2011/12/02

[#390755] Inverse Operation of Module#include — Su Zhang <su.comp.lang.ruby@...>

Hi list,

21 messages 2011/12/02
[#390759] Re: Inverse Operation of Module#include — Ryan Davis <ryand-ruby@...> 2011/12/02

[#390764] Re: Inverse Operation of Module#include — Isaac Sanders <isaacbfsanders@...> 2011/12/02

I would suggest an Adapter pattern use here. IF there is something that has

[#390876] black magical hash element vivification — Chad Perrin <code@...>

Ruby (1.9.3p0 to be precise, installed with RVM) is not behaving as I

12 messages 2011/12/05

[#390918] WEB SURVEY about Ruby Community — Intransition <transfire@...>

Did any one else get this survey request?

14 messages 2011/12/07

[#390976] Confusing results from string multiplication — Rob Marshall <robmarshall@...>

Hi,

19 messages 2011/12/08

[#391019] How can I do h["foo"] += "bar" if h["foo"] does not exist? — "Andrew S." <andrewinfosec@...>

Hi there,

13 messages 2011/12/09

[#391027] reading from file without end-of-lines — Janko Muzykant <umrzykus@...>

hi,

20 messages 2011/12/09
[#391028] Re: reading from file without end-of-lines — Gavin Sinclair <gsinclair@...> 2011/12/09

> i'm trying to read a few text values from single file:

[#391031] Re: reading from file without end-of-lines — Robert Klemme <shortcutter@...> 2011/12/09

On Fri, Dec 9, 2011 at 9:58 AM, Gavin Sinclair <gsinclair@gmail.com> wrote:

[#391042] Re: reading from file without end-of-lines — Gavin Sinclair <gsinclair@...> 2011/12/09

On Fri, Dec 9, 2011 at 8:18 PM, Robert Klemme

[#391135] I need advice on what to do next. — Nathan Kossaeth <system_freak_2004@...>

I am new to programming. I read the ebook "Learn to Program" by Chris

23 messages 2011/12/12

[#391216] perf optimization using profile results — Chuck Remes <cremes.devlist@...>

I need some help with optimizing a set of libraries that I use. They are ffi-rzmq, zmqmachine and rzmq_brokers (all up on github).

13 messages 2011/12/13
[#391218] Re: perf optimization using profile results — Chuck Remes <cremes.devlist@...> 2011/12/13

On Dec 13, 2011, at 9:57 AM, Chuck Remes wrote:

[#391234] Re: perf optimization using profile results — Charles Oliver Nutter <headius@...> 2011/12/14

A couple quick observations.

[#391238] Re: perf optimization using profile results — Chuck Remes <cremes.devlist@...> 2011/12/14

On Dec 13, 2011, at 7:03 PM, Charles Oliver Nutter wrote:

[#391324] ruby 1.9 threading performance goes non-linear — Joel VanderWerf <joelvanderwerf@...>

12 messages 2011/12/16
[#391325] Re: ruby 1.9 threading performance goes non-linear — Eric Wong <normalperson@...> 2011/12/16

Joel VanderWerf <joelvanderwerf@gmail.com> wrote:

[#391420] Accessing class instance variables from an instance? — "Shareef J." <shareef@...>

Hi there,

26 messages 2011/12/20
[#391454] Re: Accessing class instance variables from an instance? — Khat Harr <myphatproxy@...> 2011/12/21

Actually, now that I'm thinking about it the existing behavior sort of

[#391456] Re: Accessing class instance variables from an instance? — Josh Cheek <josh.cheek@...> 2011/12/21

On Tue, Dec 20, 2011 at 9:42 PM, Khat Harr <myphatproxy@hotmail.com> wrote:

[#391545] Kernel#exit raises an exception? — Khat Harr <myphatproxy@...>

While I was working on embedding an interpreter I wrote a function to

13 messages 2011/12/24

[#391618] rvmsh: An easy installer for RVM — Bryan Dunsmore <dunsmoreb@...>

I have recently begun work on a project called [rvmsh]

12 messages 2011/12/29

[#391783] Mailspam — Gunther Diemant <g.diemant@...>

Is there a way to stop this mailspam of Luca (Mail)?

12 messages 2011/12/29

[#391790] What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...>

Hi!

23 messages 2011/12/29
[#391792] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Gunther Diemant <g.diemant@...> 2011/12/29

I think you can't access instance variables from a class method, so

[#391793] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...> 2011/12/29

On Thu, Dec 29, 2011 at 15:52, Gunther Diemant <g.diemant@gmx.net> wrote:

[#391811] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Robert Klemme <shortcutter@...> 2011/12/29

On Thu, Dec 29, 2011 at 4:06 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#391812] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Nikolai Weibull <now@...> 2011/12/29

On Fri, Dec 30, 2011 at 00:26, Robert Klemme <shortcutter@googlemail.com> w=

[#391816] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Josh Cheek <josh.cheek@...> 2011/12/30

On Thu, Dec 29, 2011 at 5:47 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#391833] Re: What’s the standard way of implementing #hash for value objects in Ruby? — Robert Klemme <shortcutter@...> 2011/12/30

On Fri, Dec 30, 2011 at 12:47 AM, Nikolai Weibull <now@bitwi.se> wrote:

Re: perf optimization using profile results

From: Charles Oliver Nutter <headius@...>
Date: 2011-12-14 08:04:18 UTC
List: ruby-talk #391247
On Tue, Dec 13, 2011 at 8:03 PM, Chuck Remes <cremes.devlist@mac.com> wrote=
:
>> Three million new classes created. I'm sure it's singleton somewhere,
>> but that's often a big perf sink...not necessarily because it impacts
>> straight-line code a lot, but because a class object is a nontrivial
>> thing to be creating three million of.
>
> Is there a way for JRuby to output more detail on those classes? For exam=
ple, can it tell me how many of each class type have been allocated? If so,=
 I could use that information to figure out the critical path and try to re=
duce the amount of class creation there.
...
> Also, I'm not certain what you mean by "I'm sure it's singleton somewhere=
." I know what a singleton is, but I don't understand your use of it in thi=
s context. Elaborate, please.

Actually, it may not be a singleton object/class, now that I think
about it. Someone, somewhere is doing a Class.new {  } (or similar) in
critical path code.

> I'll take a shot at reducing my object allocation. More information on ho=
w many of each type of object is being allocated would be a wonderful stati=
stic to have. Also, if there were a way to trace that allocation back to a =
particular file and line number (for those cases where the same object is a=
llocated in multiple places), that would be a killer profiling feature. <hi=
nt, hint>

Indeed it would. Luckily, the JVM already provides it.

It will be very slow, but Sun/Oracle/OpenJDK has an object allocation
profiler built in. Examples:

jruby -J-Xrunhprof ... # run with object allocation profiling,
tracking allocation call stacks 5 deep
jruby -J-Xrunhprof:depth=3D10 ... # ... call stacks 10 deep

Running java -Xrunhprof:help will provide full help. As I say, it will
be *slow* but you don't need to run a long benchmark; you're looking
for aggregate numbers of objects for some number of iterations, which
won't change drastically over a long run. (There's also a full
instrumented performance profiler in "runhprof", but it's *dead* slow,
because it instruments every method in the system, including every JDK
class.)

The object allocation profiles will be dumped to a gigantic log file
called java.hprof.txt. The primary interesting bit of information is
at the end...a list of object types allocated plus numeric references
to the stack trace where they're allocated. Another example:

Command:

$ jruby -J-Xrunhprof:depth=3D20 -e "1_000.times { 'foo' + 'bar' }"

A few elements of interest:

   12  0.39% 14.11%     32000 1000     32000  1000 336225 org.jruby.RubyStr=
ing
   13  0.39% 14.51%     32000 1000     32000  1000 336226 org.jruby.RubyStr=
ing
   14  0.39% 14.90%     31968  999     31968   999 336239 org.jruby.RubyStr=
ing

(Most of the top 20 allocated elements are byte[], which doesn't tell you m=
uch)

Note that almost 3000 RubyString objects have been allocated. 1000 of
those are 'foo', 1000 of them are 'bar', and 999 of them are the
combined string. It's not exactly accurate because the script
terminates before the final allocation gets recorded.

The last number before the class name is the allocation trace. Looking
at 336225 (search in the same file):

TRACE 336225:
        org.jruby.RubyBasicObject.<init>(RubyBasicObject.java:219)
        org.jruby.RubyObject.<init>(RubyObject.java:94)
        org.jruby.RubyString.<init>(RubyString.java:396)
        org.jruby.RubyString.<init>(RubyString.java:424)
        org.jruby.RubyString.newStringShared(RubyString.java:522)
        org.jruby.ast.executable.RuntimeCache.getString(RuntimeCache.java:1=
05)
        org.jruby.ast.executable.AbstractScript.getString0(AbstractScript.j=
ava:165)
        ruby.__dash_e__.block_0$RUBY$__file__(-e:1)
        ruby$__dash_e__$block_0$RUBY$__file__.call(ruby$__dash_e__$block_0$=
RUBY$__file__:65535)
        org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:112)
        org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:95)
        org.jruby.runtime.Block.yield(Block.java:130)
        org.jruby.RubyFixnum.times(RubyFixnum.java:261)
        org.jruby.RubyFixnum$INVOKER$i$0$0$times.call(RubyFixnum$INVOKER$i$=
0$0$times.gen:65535)
        org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCall=
Site.java:302)
        org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSit=
e.java:144)
        org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite=
.java:153)
        ruby.__dash_e__.__file__(-e:1)
        ruby.__dash_e__.load(-e:Unknown line)
        org.jruby.Ruby.runScript(Ruby.java:731)

This takes us all the way back to runScript in org.jruby.Ruby. The
-e:1 lines are our inline script. RubyFixnum.times is the "times"
call. And the top seven lines are the parts of JRuby called to
allocate a new literal String. Looking at the 336239 trace...

TRACE 336239:
        org.jruby.RubyBasicObject.<init>(RubyBasicObject.java:219)
        org.jruby.RubyObject.<init>(RubyObject.java:94)
        org.jruby.RubyString.<init>(RubyString.java:396)
        org.jruby.RubyString.newString(RubyString.java:487)
        org.jruby.RubyString.op_plus(RubyString.java:1039)
        org.jruby.RubyString$INVOKER$i$1$0$op_plus.call(RubyString$INVOKER$=
i$1$0$op_plus.gen:65535)
        org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.jav=
a:167)
        ruby.__dash_e__.block_0$RUBY$__file__(-e:1)
        ruby$__dash_e__$block_0$RUBY$__file__.call(ruby$__dash_e__$block_0$=
RUBY$__file__:65535)
        org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:112)
        org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:95)
        org.jruby.runtime.Block.yield(Block.java:130)
        org.jruby.RubyFixnum.times(RubyFixnum.java:261)
        org.jruby.RubyFixnum$INVOKER$i$0$0$times.call(RubyFixnum$INVOKER$i$=
0$0$times.gen:65535)
        org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCall=
Site.java:302)
        org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSit=
e.java:144)
        org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite=
.java:153)
        ruby.__dash_e__.__file__(-e:1)
        ruby.__dash_e__.load(-e:Unknown line)
        org.jruby.Ruby.runScript(Ruby.java:731)

This is the String#plus call, org.jruby.RubyString.op_plus.

Incidentally, this is also where "class reification" comes in handy:

$ jruby -J-Xrunhprof:depth=3D20 -Xreify.classes=3Dtrue -e "class Foo; end;
1_000.times { Foo.new }"

...

   17  0.29% 15.50%     23616  984     23616   984 337103 rubyobj.Foo

TRACE 337103:
        org.jruby.RubyBasicObject.<init>(RubyBasicObject.java:219)
        org.jruby.RubyObject.<init>(RubyObject.java:94)
        rubyobj.Foo.<init>(<Unknown Source>:Unknown line)
        sun.reflect.GeneratedConstructorAccessor4.newInstance(<Unknown
Source>:Unknown line)
        sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Delegatin=
gConstructorAccessorImpl.java:27)
        java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        java.lang.Class.newInstance0(Class.java:355)
        java.lang.Class.newInstance(Class.java:308)
        org.jruby.RubyClass$3.allocate(RubyClass.java:142)
        org.jruby.RubyClass.allocate(RubyClass.java:223)
        org.jruby.RubyClass.newInstance(RubyClass.java:809)
        org.jruby.RubyClass$INVOKER$i$newInstance.call(RubyClass$INVOKER$i$=
newInstance.gen:65535)
        org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroOrNBloc=
k.call(JavaMethod.java:256)
        org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.jav=
a:133)
        ruby.__dash_e__.block_0$RUBY$__file__(-e:1)
        ruby$__dash_e__$block_0$RUBY$__file__.call(ruby$__dash_e__$block_0$=
RUBY$__file__:65535)
        org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:112)
        org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:95)
        org.jruby.runtime.Block.yield(Block.java:130)
        org.jruby.RubyFixnum.times(RubyFixnum.java:261)

runhprof is a very simple way to get allocation info, and I've used it
many times to trim allocation overhead.

If you find this information useful, perhaps you can reformat it for a
JRuby wiki page :)

- Charlie

In This Thread