Index

Show enters and exits. Hide enters and exits.

00:00:03evanneed to just introduce a simple way to do the check
00:01:23evanMRI is 2.77 for this
00:01:28evanI should note.
00:07:12HaPKbrixen: it didn't help... installed ruby 1.8.7-p160 from ports and it still behaves improperly
00:09:00brixenHaPK: not sure how to solve it, rbx is behaving correctly when invoked correctly
00:10:20HaPKbrixen: did a simple test ruby file that just calls "exec" with proper params to call mspec/bin/mspec-run and it works ok
00:10:55dgtizedevan: which benchmark is that, on bm_array_each I'm seeing we were already faster then MRI
00:10:58HaPKbrixen: so, the problem seems to be in mspec runner code
00:12:20brixenHaPK: could be, but I can't repro it, so you'll have to dig some more
00:13:25brixenI wonder why no one else has reported this
00:13:38brixenI'm sure folks have custom installs of mri
00:14:41brixenHaPK: you should try to trace the exec args through
00:16:08HaPKbrixen: I have commented out entire spec/default.mspec and run "bin/mspec ci -B full"... Many tests fail because of some libraries weren't found, but profiler doesn't show up
00:16:26HaPKbrixen: seems like the problem is in that settings file
00:16:45HaPKbrixen: or the spec/custom/util/script.rb
00:17:24headiusbrixen, evan: that guy updated http://jira.codehaus.org/browse/JRUBY-3646 with information about where he ran into the clone/uniq/etc issue
00:17:26headiusfyi
00:17:42HaPKbrixen: ah.. no.. it's just rbx wasn't called
00:17:45evandgtized: hm, one sec.
00:20:20rueHaPK: By the by, that is not exactly _vanilla_ :P
00:20:32rue(Not that Apple's is, but hey)
00:20:45brixenheadius: ah cool, thanks
00:26:09dgtizedevan: also I just remembered, we are still doing two array bounds checks for every call to Array#at, one in the Array primitive, and then a second one in the Tuple primitive
00:29:41evanprobably
00:30:01evanbut it's never been shown that that is a reason we're slow
00:31:39dgtizedno I suppose not -- if you profile an array#each benchmark though Array#at is still pretty high on the list
00:32:01dgtizedso since it's a multiplier on the cost of the access ...
00:32:17evanbut that doesn't say anything about the cost of checking the bounds
00:32:34evani've changed Array#each locally here to get at @tuple directly
00:32:38evanrather than going through Array#at
00:32:41dgtizedk
00:32:52dgtizedthat would help too
00:32:55evanbecause then I can have the JIT inline the code for Tuple#at directly into each
00:33:14evanthe code for Tuple#at, btw, is one x86 instruction :D
00:33:32dgtizedat present or in the JIT?
00:33:35slavaevan: now try to get it down to 0 in some cases
00:33:37evanin the JIT
00:33:44evanslava: :D
00:33:50dgtizedok, well then that means the JIT is addressing my concerns on this
00:34:24dgtizedbecause presently it's a bounds check followed by the dereference
00:34:58evani don't yet have the JIT performing the bounds check
00:35:01evanso i still need to add that
00:35:11evanbut by inlining, it should be able to it better
00:35:14slavaplanning on doing bounds check elimination?
00:35:27evanwe'll see
00:35:29evanit's low on the list
00:35:35evanwe'll see what LLVM can do without me trying
00:35:42evanit's pretty fucking smart
00:45:49HaPKHave figured out some facts about problems with mspec: mspec calls rbx with absolute path to mspec-ci or mspec-run files. And rbx complains (exceptions, etc). If change it to pass path relative to rubinius directory, then exceptions are not raise, but the profiler is still active.
00:46:19HaPKbrixen: any ideas ?
00:46:59headiusI'm curious how well llvm will help cases that aren't obviously monomorphic or that are polymorphic
00:47:09HaPKbrixen, seems it still a problem with rbx, not mri
00:47:13headiusmacruby does great on monomorphic call performance, but it's slower than 1.9 on things like richards
00:47:58HaPKbrixen: tried manually running "bin/rbx /full/path/to/mspec/bin/mspec-ci" - exceptions... if run like "bin/rbx mspec/bin/mspec-ci" - no exceptions
00:54:47HaPKevan: I have traced a problem
00:55:11evanoh?
00:55:14HaPKevan: seems that rubinius doesn't like directories with capital letters
00:55:24evanthats weird
00:55:32evanwhats the directory in question?
00:55:34HaPKevan: I started with "bin/rbx mspec/bin/mspec-ci"
00:55:51evanwhats the whole directory?
00:55:58HaPKevan: that worked... then I did "bin/rbx ../rubinius/mspec/bin/mspec-ci"
00:56:03evansmells a facepalm upcoming
00:56:32HaPKevan: that worked too... but when I went one directory upper (which is Projects) - it blowed
00:56:55evani need the EXACT cli you used.
00:56:58HaPKevan: when I renamed Projects to projects, it began to work
00:57:18HaPKevan: "bin/rbx ../../Projects/rubinius/mspec/bin/mspec-ci"
00:57:28HaPKevan: that didn't work
00:57:36evanbrixen brixen brixen
00:57:47evanyou're gonna slap yourself in the face.
00:57:59evani see the exact problem.
00:58:00HaPKevan: this worked: "bin/rbx ../../projects/rubinius/mspec/bin/mspec-ci" (after renaming to lowercase projects)
00:58:06evanand it's pretty funny.
00:58:18evanok
00:58:19evanhold on
00:58:22evanpushing a fix.
01:00:15evanok, compiling to double check.
01:00:22evanshouldn't be but another minute
01:00:56HaPKevan: so, what was the problem ?
01:01:03evanyou'll see
01:01:07evani don't want to ruin the surprise!
01:01:12HaPK=)
01:01:39HaPKevan: did you have a chance to get a repro ?
01:01:49evanno
01:01:50evanbut no need.
01:01:52HaPKok
01:01:59evanyou'll see why.
01:02:14HaPKI'm excited =)
01:02:14evanthis underscores another issue that we need to fix soon
01:02:27evanINCOMING
01:02:28boyscoutOnly check for P if it's followed by - at the beginning - e737ebe - Evan Phoenix
01:02:34evancheck that diff
01:02:37evanit's pretty hilarious.
01:03:39HaPKhuh =))))
01:04:01HaPKso, my profiler problems should automagically go away ?
01:04:12evanyep
01:04:46boyscoutCI: e737ebe success. 2684 files, 10335 examples, 32880 expectations, 0 failures, 0 errors
01:05:15HaPKevan: does rubinius' build system support incremental builds ?
01:05:25evansure
01:05:27HaPKevan: or should I do disclean ?
01:05:27evanrake build
01:07:23dgtizedevan: do we do custom command parsing for a reason or would it be worthwhile to switch that to OptParse or the like?
01:07:55evanyou can't use optparse there
01:07:59evanit's too early
01:08:06evanyou can't load anything in there.
01:08:13evanthats why.
01:09:47dgtizedwe do requires in the options, I guess it would clober our namespace though
01:10:10evanin the options?
01:10:36dgtizedthe first thing that happens in the task you just fixed is a require 'profile'
01:10:50evanoh that
01:11:02evanwell, thats actually late enough to do a require
01:11:19dgtizedoh late enough in listing of options?
01:11:25evanusing optparse or some big, heavy library to parse the options is out of the question
01:11:29evansorry.
01:11:37evana small, light library, perhaps.
01:12:54dgtizedI was just thinking something a little more robust, and perhaps something that generated the doc string side by side
01:13:09evanno frameworks.
01:13:09dgtizedcause i think our doc string keeps getting slightly out of tune with the list of options
01:13:20evanthis is at a level where we must have simplicity.
01:13:31HaPKevan: yay, it works!
01:13:46evanHaPK: yay!
01:13:53dgtizednot even just walking through a list of [name, doc_string, block] tuples?
01:14:18evanthat might be ok.
01:15:15dgtizedalso, shouldn't technically all of the match operators check to make sure they are at the beginning of the match?
01:15:26evanthere are no others
01:15:38dgtizedoh i see
01:15:47dgtizednm, I wasn't catching that was the only regex
01:16:16dgtizedI guess I should change emacs to make regex's a different color then string constants
01:16:24dgtizedthat would help the regex stand out a little
01:17:25evan:D
01:27:01headiushmm
01:27:07headius#rubyspec is dead quite
01:27:10headiusquiet
01:27:15headiuswhat's with these specs with "hash_class" in them
01:27:22headiuslike core/hash/allocate_spec.rb
01:27:33headiusthey don't work in MRI
01:27:35headiusthere's dozens of them
01:27:38evanthey're so brixen could test multiple classes that ack like Hash together
01:27:46headiusis this some mspec update required?
01:27:55evanperhaps
01:28:06headiusI don't get how to run these
01:28:42evani think brixen made it pretty easy
01:28:45evannot sure where he's at atm.
01:28:46headiusmust be mspec update, that seemed to get them to run
01:28:54headiusweird though...mspec is defining things like "hash_class" now?
01:29:05evan*shrug*
01:30:36headiusit's always jarring when I go to update specs and there's 100 failures suddenly
01:31:08evanme too
01:31:14evanbut i don't see them as often
01:31:17evanbecause of the CI set
01:31:20evanit's a blessing and a curse.
01:31:23headiuswe have a CI set as well
01:31:36headiusbut it includes almost everything in core
01:31:48headiuswell, it includes everything in core
01:31:58headiusso anything new I have to examine and tag
01:32:04evanmmm
01:32:10evanthis code is looknig sweet.
01:32:38evanthe JIT now inlines the Tuple#at primitive and uses a proper guard
01:32:40evanyay yay
01:32:50ezmobswanky
01:34:06headiusevan: how are you deciding to inline it?
01:34:23evanpersonal knowledge atm.
01:34:28evanit's NOT sophisticated.
01:34:38evan 0x2b8020c cmp $0x36, %edx 0x2b8020f jnz 0x242 ; 0x2b80252 0x2b80215 and $0x7ffffffe, %ecx 0x2b8021b mov 0x10(%eax,%ecx,2), %eax
01:34:40headiuscan you elaborate on that?
01:34:41evanack.
01:34:47evansure
01:34:59evanwe've got a number of core types
01:35:03evanTuple, ByteArray, etc.
01:35:23evanwith all the highlevel classes using them
01:35:38evanso it follows that the highlevel class performance is derived directly from the lowlevel class performance
01:35:52evanplus, the lowlevel classes only have a small number of fundemental operations
01:36:02evanin Tuple's case, #at, #put, #size
01:36:25evanfor ByteArray, #get_byte, #set_byte, #size
01:36:32headiussure
01:36:39evanthat being a small, very frequently used set
01:36:49evanit's easy to make the JIT knowledge about those 6 operations
01:37:21evanso the contents of inline caches provide type feedback
01:37:45evanallowing the JIT to, in those 6 methods cases, put the code to perform them directly in the calling stream
01:38:23headiusahh, so you're using the inline cache to know if it's the core version
01:41:47evanyep
01:41:55headiusso it still has a guard then, what are you guarding?
01:41:55evantrixy huh
01:41:56evan:D
01:42:11evanin these 6 cases
01:42:12headiusyeah, I have some of that in our compiler too, but not turned on
01:42:14headiusit helps a little
01:42:16evanthe type_id of the object
01:42:34headiusso not checking for override because you assume nobody will ever do such a thing
01:42:34evanwhich means you can't change those 6 things
01:42:35evanbut thats ok
01:42:45evanright
01:43:00evanif we want to allow for changing, that can be in the guard too
01:43:25headiusyeah, just more overhead
01:44:00evanyep
01:45:16headiuswell cool
01:45:39headiusthat ought to help some of the lower-level operations a lot
01:45:43evanyep
01:45:52evanfrom talking with john rose
01:46:05evani'm pretty sure this is what hotspot does for a number of things to
01:46:13evanbasically, intrinsic methods
01:46:22headiusthere's quite a few intrinsics, yes
01:46:31headiusSystem.arraycopy for example
01:46:57headiusbut it also aggressively inlines jitted java bodies the same way of course
01:47:09evancourse
01:47:18evanbut, nicely, i can do this in phases
01:47:30headiusyeah
01:47:32evancarving out performance in phases
01:48:09headiusI saw MRI equivalent performance is the current target on the roadmap
01:48:11headiusis that for 1.0?
01:48:12evani'm going to add a background compiling thread
01:49:10evanto reduce the compiler interfering with perfromance too much
01:49:18evanironically, now is a great time to do that
01:49:24evansince almost everyone has multiple cores
01:49:58headiusyeah, JVM has a compiler thread
01:50:26headiusplus some metrics for how much time you want it to spend compiling
01:50:50headiusgenerally you don't see any perf hit when it compiles as a result
01:51:09headiusmy compiler is still in line...I suppose I could shunt it to another thread but it's pretty fast
01:51:26headiusmaybe it will be slow enough we'll want to do that once we start optimizing
01:51:59evanthats quite interesting
01:52:08evanthat the interpreter performance doesn't dip when the compiler kicks in
01:52:16headiusat least I've never noticed
01:52:20evansure
01:52:25evanthats good enough for me!
01:52:37headiusit's hard to tell when it does the compile
01:52:54headiusif you turn on assembly dumping there's shit streaming out from the start
01:52:57evando you know what metrics it uses to determine when it should compile a method?
01:53:10headiusnot all of them....there's a lot
01:53:17evanah
01:53:35evani suspect i'll need at least 2 to begin with
01:53:39evan# of invocations
01:53:45evanand # of backward of branches
01:54:25evanon the long term roadmap is side entrace/exit
01:54:32evanto allow for on-stack replacement
01:54:41evanbut i highly doubt that will happen any time soon
01:55:31headiusyeah, I understand that's a bit trickier
01:56:11headiusany more thoughts on removing the GIL yet? I didn't see it on the roadmap
01:56:28evanyeah, that didn't make the roadmap
01:56:34evani'm guess we'll wait until after 1.0
01:56:52evanbecause removing now won't make performance better
01:56:59evanand will only make our 1.0 timeline longer
02:01:38evanatduskgreg: hey there greg
02:01:56atduskgregevan: hey
02:01:59evanand nicksieger
02:02:35nicksiegerhey
02:02:37evanatduskgreg: hows the AVR port going?
02:03:02atduskgregevan: haven't done too much on it since railsconf, but hoping to put some hours in this weekend
02:03:12evannice
02:03:29evanbeen doing a lot of LLVM
02:03:35atduskgregcool
02:04:12atduskgregevan: in the meantime I've been working on an epic blog post introducing the avr-gcc/arduino internals for noobs
02:04:29evancan't wait to read it
02:04:32evani saw your tweet about it
02:04:42atduskgregcool
02:05:04atduskgregI'll ping you when I put it up
02:05:53atduskgregI want to get smarter-than-me eyes on it to make sure I'm not sending people down wrong avenues at whatnot
02:06:57evansure
02:07:13evannot that i'm smarter-than-you :)
02:08:14atduskgregI'm pretty sure :)
02:16:56boyscoutAdd flow control instructions and a bunch more - 6a660c1 - Evan Phoenix (llvm-jit)
02:16:56boyscoutInline cache, Tuple#at snooping - a3fcc31 - Evan Phoenix (llvm-jit)
02:37:19evanhttp://gist.github.com/112016
02:37:25evanRunning the JIT on Array#each
02:37:29evandgtized: ^^
02:37:38evani have our Array#each almost 2x slower currently than MRI
02:42:02slavaroom for improvement :-)
02:49:08tarcieriweird
02:49:15tarcieristackless python's channels are synchronous
02:49:26tarcierisending to a channel on Rubinius won't ever block the sender, right?
02:49:38evantarcieri: nope
02:49:44evantarcieri: the channel buffers values
02:49:46tarcieriyeah, in stackless python it does
02:49:49tarcieristrange
02:49:50evanso the sender never blocks
02:49:58tarcieriasynchronicity ftw
02:49:59tarcieriheh
03:19:50ddubevan: does a channel have a max buffer size or does it infinitely buffer?
03:22:33evaninfinite
03:25:24ddubbuilding llvm and rubinius at the same time
03:25:31ddubI'm surprised my notebook still lets me type :)
03:28:30dduboh wait, now the heat is stopping me
03:32:43headiusRubinius and LLVM: So Hot Together!
03:37:58ddubapple makes their new machines out of aluminum so that the heat won't discolor and warp them
03:38:46ddubwell, thats interesting
03:38:46ddubResolv#getaddresses resolves localhost FAILED
03:39:17slavawhy did they name a class Resolv?
03:40:00ddubthe E is silent?
03:40:23ddub/etc/resolv.conf
03:41:32headiusI've always wondered why there's no e
03:41:40tarcierislava: pretty much everything dealing with I/O or networking kinda sucks in Ruby
03:45:34headiusthe new MBP stays pretty cool no matter what
03:48:18ddubI've been told my 28 month old MBP is 'ancient'
03:50:29tarcieriheh
03:50:41tarcierimy macbook is about that old
04:27:23ddubI've put all technology purchases (other than replacements for broken devices) on hold until USB 3 is out
04:29:13slavaI'm waiting for itanium to take off
04:32:49ddubI also want to skip SSD and go straight to holographic storage
04:37:44tarcierilol slava
04:52:30ddubwhats this roadmap task to split the compiler nodes out into files? won't that be like eighty files?
06:27:33evanslava: poke
10:09:44evanha ha!
10:09:46evansuccess!
10:09:57evandropped 2 seconds off the Array#each benchmark
10:10:05evanit's now a full second below MRI
10:24:21danlucraftevan: woo!
10:24:35danlucraftevan: is that with llvm?
10:24:53evanpartly, yes.
10:25:05evanpartly reorganizing how blocks get their arguments
10:25:37danlucraftmaybe I'll try and build again today
10:36:17kronos_vanoevan, where I can find this benchmark?
10:36:26boyscoutAdd config option to control JIT debug output - 6cd5d3d - Evan Phoenix (llvm-jit)
10:36:26boyscoutMinor Array#each refinement - ea9fb94 - Evan Phoenix (llvm-jit)
10:36:26boyscoutRemove redundent ways of calling a Block - ef3dc0c - Evan Phoenix (llvm-jit)
10:36:26boyscoutRemove generating a function per opcode - 4bce6a1 - Evan Phoenix (llvm-jit)
10:36:26boyscoutRemove cruft - 827b0e3 - Evan Phoenix (llvm-jit)
10:36:26boyscoutRework how blocks get their arguments - 33ffdf3 - Evan Phoenix (llvm-jit)
10:36:28boyscoutFurther revise block arg protocol - 49572e8 - Evan Phoenix (llvm-jit)
10:36:31evanit's benchmark/rubinius/bm_array_each.rb
10:37:03evanyou'll need svn llvm, soft linked into external_libs
10:37:14evanand applied with http://github.com/evanphx/llvm-patches/blob/master/jit-info.diff
10:37:18evanif you wanna try it
10:37:29evantomorrow and try and clean up the build process in this branch
11:13:41rueThe patch does not apply to trunk SVN
11:13:48rueUnless you changed it since yesterday
11:39:49rueOr, well, HEAD
17:31:01rueHm, actually, it does not apply cleanly on that revision either o.O
17:34:49rueWhat is gen/types.cpp?
18:40:28marcandrbrixen: do you know the reason why Array.== uses "i = 0, while (i<size) cur =at (i); ...; i+=1" instead of each_with_index?
18:41:17dgtizedmarcandr_: I do
18:41:34dgtizedtry doing a benchmark on each_with_index versus a manual loop
18:41:47marcandrOh, ok.
18:42:05dgtizednow that said we may be able to switch them back if evan's fancy JIT stuff inlines all that
18:42:10marcandrA manual loop will aslo win against a for loop?
18:42:22dgtizedfor just calls each last I checked
18:42:31dgtizedwell not quite, but essentially
18:42:34marcandrk
18:42:43marcandrThanks. I'll leave them as is then.
18:43:04dgtizedit's because there is an performance hit from use of yield
18:43:18marcandrI'll just change what I know for sure can be optimized.
18:43:30dgtizedwell run the array specs on them
18:43:39dgtizedand see if it makes it better or worse
18:43:45dgtizedsorry, not specs, the benchmarks
18:44:00marcandrNah, I'll just fix the recursive stuff.
18:45:19dgtizedjust check to see if running benchmark/rubinius/bm_array is slower or faster on a given change
18:45:31dgtizedspeaking of which that needs to be seperated into 186 / 187 as well i think
18:46:06marcandrWell, not really. I mean the old behavior (and the current one too!) is more a bug than a feature.
18:46:25marcandrrbx is already using recursion guards which are not present in MRI 1.8.6
18:47:24marcandrI'm just applying my MRI patch to rbx. It doesn't change anything for non-recursive arrays and hashes.
18:53:44rueJust a quick note: I am of the opinion that Array method implementations should not be using any Enumerable methods
18:53:53rueI think there was disagreement about the matter then
18:54:44evanthats probably a sensible statement
18:54:50marcandrrue: Haven't thought of that, but I think I see your point. I'm not changing anything major, just the way recursive guards are applied
18:54:55evanit's more performant, and more stable
18:55:30evanusing too many enumerable methods internally easily breeds strange behaviors when people get crazy
18:55:34evanand they will get crazy
18:55:42brixenevan: nice um catch on that regexp :)
18:55:47evanbrixen: :D
18:55:51evanthought you'd like that
18:55:54brixenyeah
18:55:57marcandrYeah, I can imagine.
18:56:31marcandrI'm porting http://redmine.ruby-lang.org/issues/show/1448 to rbx is all. I won't change much, promised :-)
18:58:51rueWaaaait
18:58:56dgtizedrue: each is not technically enumerable it's what enables enumerable to operate on array, but in general for the base classes, simple and in class is sometimes perferable to a slow DRY solution
18:59:59marcandrrue: me?
19:00:23ruedgtized: I am just philosophically opposed to Array relying on Enumerable
19:00:39ruemarcandr_: Well, sort of you. That bug is what I am trying to figure out
19:00:52marcandrlol
19:01:04dgtizedrue: yea I agree with that
19:01:49marcandrrue: What do you mean? You are trying to figure out how to solve recursive comparison or what I've done?
19:02:10rueSo it is saying that `x.should == [[x]]`?
19:02:36marcandrrue: Yep. Can you point me to a difference?
19:03:15marcandrBy difference I mean x[0][2] being different than y[0][2], for example.
19:04:05marcandrOr x[0][0] not having the same length as y[0][0] or something. If you can't find any difference, then I claim they are ==
19:04:40evanperhaps we should have an easter egg
19:04:43evanif you do
19:04:49evanx = []; x << x; p x
19:04:53evanit displays
19:04:59evan#<Blackhole>
19:04:59rueGFOOH?
19:05:18rueHm, OK, maybe #<Blackhole> is more polite
19:05:29evanwell, we could have it run
19:05:32evansystem("nethack")
19:05:33evantoo
19:05:50brixenheh, #<I have taken your computer and your are not getting it back>
19:06:02brixen-r
19:06:36evan>> p x
19:06:44evanCalculating answer, get some coffee...
19:07:11rueevan: No--we should implement it *iteratively* :D
19:08:03evanhow about pop up a picture of someone taking a picture into a mirror with a mirror behind them
19:08:31evanI wonder what humanity thought the first time they saw that
19:08:41evanOMG INFINITY
19:09:35marcandrXenon thought it was funky as hell
19:11:23ruemarcandr_: There is no access difference if there is only a single element
19:14:59marcandrrue: access difference?
19:17:26rue`x = [1]; x << x; y = [[x]]; y[1] != x[1]`
19:17:49marcandrIndeed. And in those cases, x != y
19:18:50marcandrIt's quite cute actually: if there is a difference, then x != y. If there is no difference, i.e. no "path" you can give so that x[...path...] != y [...path...] then they are ==, otherwise they are !=
19:19:45marcandrIt works for h = { :foo => [h] } too, BTW.
19:20:28marcandrI've put some pretty examples in rubyspecs/core/array/shared/eql and /core/hash/shared/eql
19:32:37dgtizedevan: I wonder what happens when you show an animal like a parrot that is aware enough to recognize a mirror images a mirror with a mirror behind it
19:33:48evanit's probably too complex of an idea for them to grasp
19:36:27dgtizedprobably, but I wonder ... it's not much of a switch on the mirror test, but definitely would be interesting
19:36:41evanyep
19:54:38ruemarcandr_: Hm. I have kind of a gut-level dislike of the semantic
20:03:45marcandrrue: what semantic exactly?
20:05:37rueThat equality
20:06:12ruePlus it has the somewhat dubious property that adding the exact same object to both makes them not equal any longer
20:06:31marcandrCan you give me an example?
20:07:41marcandrOh, you mean x=[x], y=[[[x]]]
20:08:06marcandrx == y, but x << 1 != y << 1 ? Is that what you mean?
20:08:55rueYes
20:09:34marcandrYou would rather have x != y ?
20:09:50rueProbably
20:10:10rueWhat I would _really_ like is to be able to stop worrying about silly corner cases like this :)
20:10:50marcandrWell, I'm certainly not forcing you to :-)
20:10:54rueDo away with RecursionGuard, the user will figure out they have a recursive structure soon enough
20:11:25marcandrWell, that's certainly not much of an improvement!
20:11:36rueBet it will run much faster
20:11:55rueAnd users will have less silly code ;)
20:12:34marcandrWell, you realize that some mathematicians might be glad to be able to compare structures like this.
20:12:58evanthen they should likely write their own inspect.
20:13:03rue^^
20:13:19brixenwell, == is the bigger issue
20:13:22brixennot inspect
20:13:27evani'd agree with that.
20:13:37brixenit is unfortunate that this is not a pay-per-use feature
20:13:42brixeneveryone pays for it
20:13:57marcandrBut in any case, I understand it's a matter of opinion if recursive handling should be done or not (I vote Yes), but if it does, I feel the best way is to have == to behave properly
20:13:57ruemarcandr_: I mean, in this particular case, your solution is at least equally valid than making them inequal
20:15:22ruebrixen: Hm, I suppose it is a slightly more valid use case
20:15:59rue#==, that is. But is there really anyone who purposefully has recursive Arrays and simultaneously /does not know which/?
20:17:11marcandrI would think that array comparison is not done that frequently, actually.
20:17:43marcandrI was talking to a friend about my patch and he told me that C# doesn't even have a native array comparison method, for instance.
20:18:11rueevan: Oh--what is gen/types.cpp?
20:18:38evanrue: rake jit:generate_header
20:18:42evani'm cleaning that all up right now
20:18:56evanif wanna wait another few minutes
20:18:58evani'm at the tail end
20:21:15rueSure
20:21:28rueevan: --enable-bindings=none
20:21:40evani'm conditionalizing LLVM usage atm
20:21:41rueProbably do not need the OCaml :)
20:21:56evanso it's a cleaner build for people once I merge this back in
20:22:13evanrue: ha, no probably not.
20:22:15evanalso
20:22:23evanyou can build it only for x86
20:22:30evanthat saves like 45 minutes
20:25:28brixencoool datas http://gist.github.com/112386
20:26:12ddubbrixen, evan: what are the compiler tasks? anything I could help with?
20:26:33evanbrixen: something else that would be really interesting
20:26:37evanbrixen: mixed use keys
20:26:43evanie, thone Hashs that have symbols for keys
20:26:45brixenddub: depends what you mean by help
20:26:47evanare ALL the keys symbols?
20:26:57brixenevan: so per instance stats?
20:27:07evanno, thats too much data
20:27:18evanperhaps just the number of hashs with mixed use keys
20:27:19brixenor just see if all the keys in an instance are homogeneous?
20:27:25brixenok
20:27:50evanddub: we need a type feedback JIT compiler, could ya get that to me by tuesday? kthxbye
20:27:56ddubbrixen: toward the roadmap, as opposed to causing harm :)
20:28:07brixenddub: :)
20:28:22evanbrixen: whats the stats on the methods name?
20:28:30evanwhat are the units?
20:28:33brixenevan: calls
20:28:59evanok, what is the median calculated over?
20:29:08evancalls / ??
20:29:18brixencalls / instance
20:29:24brixenhash instance
20:29:53evanso, on average, a Hash gets called [] on it 24 times
20:29:58evanyes?
20:30:13brixenyes
20:30:24evank
20:30:42ddubanyway, lemme know if there is anything I could look at
20:30:50brixenddub: the compiler tasks are rather linked
20:30:53ddub(I think evan was joking)
20:31:03evanddub: what do ya want to do?
20:31:04brixenthe sexp elimination is related to generating the AST
20:31:59evanthat would require working mostly in C land
20:32:05evannot that ddub minds C land
20:32:12brixenyeah
20:32:34brixenddub: the core idea is having a single source ext that can be used in rbx and mri
20:33:00ruebrixen: The median/mean relation is interesting
20:33:08brixenevan's idea was to look at Ripper and see if we can do a call-back pattern while visiting the MRI parse tree nodes
20:33:20brixenddub: ^^
20:33:35evana slightly simpler option
20:33:42evanis to rewire add_to_parse_tree entirely
20:33:47brixenrue: yeah, I should break those into percentiles
20:33:56evanto call back out to ruby code rather than building the sexp
20:35:20brixenevan: what metric do you hope to see by looking at the hash-key-homogeneity?
20:35:24ddubis the AST generation still based around a yacc grammar?
20:35:32brixenbecause I'd need to track those per instance
20:35:36ddubhas that stuff changed over.. well I guess the last year? :)
20:35:52evanbrixen: i'd hope to see a high number of homogenious hashs
20:36:14brixenevan: because we can optimize for that?
20:36:39evanlikely, yes.
20:36:44evanit's an interesting vector for us to consider
20:36:46brixenddub: AST generation is done in ruby from the sexp generated in C using a ParseTree copy
20:36:58brixenevan: ok, I'll switch it up
20:38:12evanok, i've got LLVM conditionalized now.
20:38:21evani'm going to leave it off and merge this branch in
20:38:42evaninterested parties can turn it on manually
20:38:59evanstep 1 incoming
20:39:08boyscoutAdd proper build steps for new JIT code - f7cb6ca - Evan Phoenix (llvm-jit)
20:39:08boyscoutConditionalize using LLVM - 0356ed3 - Evan Phoenix (llvm-jit)
20:39:15evanon to step 2
20:43:31ddubso the idea is to instead have a C library (usable by multiple ruby implementations) that directly builds an AST of ruby objects and exposes it?
20:43:59brixenyeah
20:44:11dduband this will be changes onto the existing grammer.y?
20:44:21evanno
20:44:32evanthe easier route is to change grammar_runtime.c
20:44:47evanie, let grammar.y build it's NODE tree the way it wants
20:44:49ddubsorry, the same 'package' right?
20:44:50evanthen walk the tree
20:59:06evanyippy!
20:59:21evanglances around nervously
20:59:42evanhrm. :/
20:59:48evannot sure why boyscout didn't say anything
20:59:49evanoh oh
20:59:54evangithub doesn't push merge commits to the hooks
20:59:57evanwell anyway
21:00:00evanllvm-jit is merged in
21:00:34evanif you link your llvm build dir to vm/external_libs/llvm (remove the empty dir structure there)
21:00:43evanand set LLVM_ENABLE to true in rakelib/vm.rake
21:00:50brixensweeet
21:00:58evanthen it will build the new LLVM JIT
21:01:15evanthat merge also includes the new block arg handling code
21:01:24evanso we should see a performance improvement
21:01:52evan8s to 5.7s for Array#each benchmark, with TOTAL set to 5000
21:03:13evannow, lunch.
21:03:29brixenmoi aussi
21:38:56marcandreHuh? Is it just me, or is return nested in two blocks not working properly?
21:38:59marcandredef f; 1.times { 1.times { p "Bye!"; return false } }; true; end
21:39:12marcandref prints "bye" but returns true...
21:39:28marcandreOr did I screw up my rbx somehow?
21:44:12rueShould be false, yes
21:44:27rueI can check if LLVM ever builds :)
21:46:32marcandreOh, looks I was not quite up to date. pulling right now.
21:54:47marcandreWow. The current head doesn't behave properly either.
21:55:03marcandreI've added that somewhat trivial test to rubyspecs.
21:59:55seydaraloha fellas
22:01:59seydarwill rubinius manage its own symbol table for the new JIT, or is that unnecessary?
22:05:22ruemarcandre: There was nothing for it in the language specs?
22:06:21marcandrerue: Not sure, but what I know is that 'rake' on the current head doesn't produce any error...
22:08:54marcandreOn the rubyspecs head, rbx is failing 3 tests + my new one, and none of the 3 seem related to nesting blocks/method class
22:16:58marcandrerue: so yeah, apparently there was no equivalent for it in the current specs.
22:23:18rueProbably a regression from the block change
22:24:27seydarfades for din din
22:26:14evandid I break something?
22:28:02boyscoutAllow the CXX environment variable. - 27a0f6d - Eero Saynatkari
22:28:02boyscoutCheck RBX_LLVM env to enable LLVM. Minor fixes to build. - 555a397 - Eero Saynatkari
22:29:30rueevan: Looks return in a block only returns through one block upwards
22:29:41evanyeah, i see
22:29:46evangoing to work on it now.
22:30:15rueGetting a segfault somewhere in Float running full CI, dunno if that is expected?
22:30:23evanno
22:30:25evannot expected.
22:30:36rueI will look at it when I get home, then
22:30:51evani'm going to fix the return problem now
22:33:49slavaevan: you got something to say to me?
22:33:53slavaTHEN SAY IT TO MY FACE, BIYAATCH
22:34:23evanHELLO SLAVA
22:34:25evanNICE BREATH YOU HAVE
22:36:26slavaso what's up? you poked me earlier
22:38:48evanummzors
22:38:49evanoh
22:38:57evanafter your optimizing compiler runs
22:39:06evanyou dump all the IR, yes?
22:39:12evanjust keeping the output
22:39:15slavayeah
22:39:20evank, figured.
22:39:22evanjust wanted to double check.
22:42:16slavaevan: why, are you thiking of doing something fancy?
22:42:37evanyeah, i'm thinking about sending the IR via email to India
22:42:46evanand having it transcripted on stone tablets in Tamil
22:42:47evanfor all to see.
22:43:01slavaoutsource the optimization?
22:43:14evando a future branch of humanity, yes.
22:43:17evanso it might take a while.
22:43:19evans/do/to/
22:43:30boyscoutCI: 555a397 success. 2684 files, 10335 examples, 32880 expectations, 0 failures, 0 errors
23:03:47boyscoutIf return in a block to return to the correct depth - 56e77ac - Evan Phoenix
23:07:57seydar returns from the dead
23:08:39brixenwb seydar
23:08:55seydarw3rd to your mom, i'm here to drop bombs
23:09:00brixenseydar: re your earlier question, the jit should not need to manage symbols
23:09:11brixenbut feel free to have evan correct me on that :)
23:09:15seydarbrixen: thanks. talking about that right now with evan
23:09:20brixenahh
23:09:26brixenyou and your side channels :P
23:09:42seydari prefer dark alleyways, but whatever floats your boat
23:10:24brixenmy boat is floating on smiles and sunshine lad
23:10:31brixenwe have no rain today
23:10:49seydarheh, me too, for the first time in about forever
23:10:58brixenno doubt
23:12:13boyscoutCI: 56e77ac success. 2684 files, 10335 examples, 32880 expectations, 0 failures, 0 errors
23:46:13evanbrixen: could you ran your rails -h test
23:46:15evanand see if it's any faster
23:46:21evanafter my block arg change
23:48:34brixenyep
23:48:38brixenI'll run it