jnthn I've just cut stage mast in half. 00:00
Uh, to less than half.
diakopter er, wow.
such cut
jnthn need spectest
desire verify
00:01 woolfy joined
diakopter jnthn: what was your big fix 00:05
jnthn The funny thing is it's a constant factor fix rather than an algorithmic one... 00:07
Patching coming up
dalek arVM: e072c4c | jnthn++ | src/6model/ (6 files):
Optimize root objects list in SC.

This doesn't make things better from an algorithmic point of view, but looking up objects in SCs - and in particular, searching the SC to find the index of an object - is a very common operation. This makes all SC object operations a good bit faster, and easier for the compiler to do inlining on, which is a very notable win.
00:09
jnthn The spectests don't hit the serialize path that was terribly slow, so it's only several more seconds off that. 00:10
diakopter oh no :) 00:11
jnthn Down to 329s.
diakopter wait, why couldn't you mark the index on the obj itself
jnthn Bloats all the obj...
Most objects aren't ever in an SC
diakopter but if it was only like 8 bits from the bitflag field 00:12
jnthn But it's not that, it's more
uh
I mean, there's more than 256 things
diakopter I figured ?) 00:13
jnthn But yeah, you could << 8 and cap
diakopter oh, then linear search just the multiples :)
jnthn No, that's cache-horrid. I meant you could know you could skip that number << 8 entries before starting searching.
diakopter oh 00:14
jnthn I need to re-profile to see where the costs are now
diakopter well how about this - since they're always deserialized into gen2, do a hashtable on their memory address :D :D
(and then expire the hashtable if they move..) 00:15
jnthn Yeah, a hash table approach could be wise.
diakopter how much time was it spending in sc index lookup previously 00:16
(did the profiler indicate that?)
jnthn Around 15-20% of total time for compiling CORE.setting 00:17
diakopter I seem to recall being the one to code that linear search 00:18
.oO( oh, this won't matter, right, except when compiling... )
jnthn Well, it's linear search elsewhere too 00:19
Now it's still worth improving, but much smaller
Like, way down the list.
26% of time goes on memory management, with 25% of that on the collection side. 00:20
Which is kinda what you'd expect given we do bump-the-pointer allocation.
4% of the time is on the walk through the old nursery to gc_free things that need it. That's possible to push off to another thread. 00:22
diakopter yup
I noted that in a comment in the code in the gcorch branch 00:23
(and then you noted it in master)
I think
jnthn Well, and I knew we could at the point I designed Moar ;) 00:24
try_get_slot is very hot.
timotimo: How far did your hintfor work get?
If this profile is right, which I've little reason to doubt, we spend over 5% of our time looking up dynvars. 00:25
$*foo and the like
4.6% on string comparison 00:26
diakopter eww 00:27
how many of those successes?
jnthn Most...
Oh, it's 'cus attribute lookup
Once we have hintfor a bunch of those go away.
And when we've a specializer another load to 00:28
*do
diakopter jnthn: I think timotimo pasted a link to a diff or something 00:32
[Coke] ponders hacking on sixperl or working on his sixperl presentation. 00:33
[Coke] does the former and calls it "research"
diakopter I'm good at that kind of research too
jnthn Um, wow 00:36
diakopter so scare 00:37
jnthn Is it me, or is the MVMStaticFrame marked refs_frames for no reason...
diakopter sounds like git blame diakopter
jnthn coulda been me 00:38
And it could be that it once did
diakopter wait, why doesn't it
jnthn But we spend 6.8% of time adding inter-generational roots to the worklist 00:39
[Coke] m: class A { has $.a = 0 }; for ^2 { my $a = .a given A.new; say $a; } # RT 121049
camelia rakudo-moar 07c483: OUTPUTĀ«0ā¤0ā¤Ā»
jnthn But just under half of that is calling gc_mark on MVMStaticFrame instances.
[Coke] ^^ I cannot duplicate raydiak++'s bug report.
diakopter oh
jnthn [Coke]: That's 'cus I already fixed it. 00:40
[Coke] jnthn: but the ticket is still open. :P
jnthn :P
[Coke] Is there a test?
... if not, that's fine. 00:41
jnthn No, no test
Oh, unless raydiak already wrote one
We talked about where to put it but I don't recall seeing it going in 00:42
(S04-statement-modifiers/given.t)
[Coke] danke.
00:43 benabik joined
jnthn Well, seems s/1/0/ shaved another couple of seconds off CORE.setting 00:43
lee__ benabik: i'm getting a fun new libmoar error when building rakudo on OS X :P do i need to pull another patch for it to work? 00:44
benabik lee__: AFAIK, Rakudo master builds on OS X. :-/
lee__ darn, ok
benabik What was the error? 00:45
lee__ here is the error: gist.github.com/leedo/ba22b9c6ed7220ef21ca
benabik Hmmmmmmm.... 00:46
lee__ i actually get the same error when using gcc 00:47
though i should double check that
benabik Maybe I should change it from -l to just a path to the library. 00:48
I thought rpath would make it look in the right place.
It probably works for me because it's installed in /usr/local/lib and that's in my linker search path already.
lee__ ah, makes sense
00:48 Util joined
lee__ you'd think rpath would take care of that 00:49
benabik rpath is part of the runtime search. I guess ld uses it's own at link time.
dalek arVM: 370f3cf | jnthn++ | src/6model/reprs/MVMStaticFrame.c:
MVMStaticFrame does not directly ref an MVMFrame.

Thus refs_frames can be cleared. It may have referenced them at some point in the past, but it doesn't now. Since MVMStaticFrame was the most costly of the refs_frames things to mark, and there were a lot of them, this makes the intergenerational roots a bunch cheaper to handle.
00:51
jnthn Spectest time from 329s => 321s with that. 00:52
[Coke] ~>
diakopter XD 00:53
benabik Rakudo PR #244 should fix it. 00:54
jnthn benabik: merged 00:55
Thanks
benabik jnthn++
lee__: Try again. :-D
lee__ benabik: nice! trying, after i revert my bad attempt 00:56
benabik: missing -l ? 00:57
hmm or not 00:58
benabik lee__: Shouldn't need it when giving a path.
-lmoar => ...../libmoar.dylib 00:59
01:00 lizmat joined
lee__ ah i see, a new error. i wish i could be more help 01:00
gist.github.com/leedo/329cca50dc20f8a70b35
actually that is probably a side effect of my hacking 01:01
benabik Yeah, that seems odd.
I dunno where the dynext/ comes from.
Actually, no. I don't know where the rest of the path comes from. 01:02
It should just be dynext/libperl6_ops_moar.dylib
lee__ nuking and trying again 01:04
01:04 jnap joined
lee__ benabik: success! 01:19
thank you!
benabik \o/ 01:20
I'm glad. I realized I didn't reconfigure before testing, which is silly to do with build changes. O.o
I mean, it was Obviously Correct (tm), but... 01:21
jnthn benabik++ lee__++
02:02 benabik joined 02:37 cognominal joined 04:29 jnap joined
diakopter the LCTG for moar is taking significantly longer today 04:56
er.
LTCG
05:30 jnap joined 06:18 FROGGS joined 06:31 jnap joined 07:14 FROGGS joined
FROGGS a p-spectest shows a similar maxresident again... 2606.11user 163.62system 14:14.56elapsed 324%CPU (0avgtext+0avgdata 769168maxresident)k 07:15
MoarVM++ :o)
07:32 jnap joined
timotimo jnthn: i implemented hintfor and that's already in the stage0; my usage of it was still trying to "shoehorn" it into getattr and bindattr ops compilation, rather than the way you suggested it 07:53
it does seem to correctly get hints, though
jnthn: could the fix for the MVMStaticFrame thingie cause the algorithmic improvement in the branch you did the other day to work? 07:54
08:09 FROGGS joined 08:30 odc joined 08:32 jnap joined
timotimo oops, i was wrong 08:33
i added nqp::hintfor in a branch, not in master :( 08:34
and then i did an unnecessary stage0 update
d'oh
what an expensive blunder
FROGGS gah! 08:36
:P
FROGGS .oO( you are an insensitive clod )
timotimo here we go 08:38
and now for making bindattr and getattr use it, too
ah, hm, i need to make another version of getattr/bindattr for when the attribute name isn't constant :\ 08:51
dalek arVM: a0a4666 | diakopter++ | src/6model/6model.c:
type in no such method error.. I think
09:27
09:33 jnap joined
nwc10 jnthn: once MoarVM handles things like native ints better, will that just speed up benchmarks that test this, or are they used extensively in NQP and the setting? 10:22
jnthn nwc10: The problem wasn't/isn't actually at MoarVM level 10:23
nwc10 oh, OK.
jnthn nwc10: NQP already does pretty well with them, afaik
nwc10 pretend I asked it on #perl6 then :-)
jnthn nwc10: The problem was that Rakudo didn't inline operators.
Now it does, but the inline comes out badly 10:24
I think the latter is an all-backends issue though
diakopter: You can't assume every meta-object is a KnowHOW. a0a4666 is gonna SEGV...
diakopter oh 10:26
:(
add a check for that repr?
oh, well, nm
dalek arVM: d7f4857 | diakopter++ | src/6model/6model.c:
gah
10:27
jnthn Well, I was gonna go for a better fix than that, and have one that lets us actually get the invocant...
...in some HLL code, so we can construct a better typed exception.
diakopter oh
10:34 jnap joined
diakopter jnthn: did you fix the callsite signature dupe detection? :) 10:35
jnthn timotimo: Measurable change for me too with getattr/bindattr changes so far...
diakopter: Yes, it shaved tens of kilobytes off CORE.setting.moarvm.
diakopter oh :) 10:36
I wonder what I borked
jnthn I can't remember how I patched it...
git log --grep=callsite -p
:P
I was gonna say that getattr/binattr tweaks so far made no spectest difference, but then I noticed we ran 7 extra tests in about the same time :) 11:05
FROGGS that sounds like >99% to me 11:06
diakopter jnthn: I'm getting this when building with that: gist.github.com/diakopter/70d38c838f9633751983 11:10
jnthn my $obj_mast := $qastcomp.as_mast( $op[0] ); 11:13
my $type_mast := $qastcomp.as_mast( $op[1] ); my $obj_mast := $qastcomp.as_mast( $op[0] );
oops
diakopter oops :)
jnthn On those two I'd :want($MVM_reg_obj)
Just to be sure
diakopter ok
same error 11:14
nqp builds fast as lightning, btw 11:15
jnthn Well, sub-minute anyway...
Yeah, I don't immediately see why the error...
It's gotta be some silly though 11:16
'cus here's the line it blows up on: 11:17
nqp::bindattr($der, NQPRoutine, '$!dispatchees', nqp::clone($!dispatchees));
The the value there is an array
diakopter hm 11:18
missing decont on something/ 11:19
?
value maybe?
er, cont?
jnthn No, only class handle should be deconted and it is being 11:21
diakopter when I've seen that before it turned out to be a bug in another place in the compiler 11:23
reusing a register when it shouldn't have been
(such as the only one we release that could've been passed - the name str expr) 11:24
jnthn oooh
my $name_mast := $qastcomp.as_mast( :want($MVM_reg_str), $op[2] );
push_op(@ins, $namedop, $obj_mast.result_reg, $type_mast.result_reg,
$name_mast.result_reg, $val_mast.result_reg);
Forget to push_ilist(@ops, $name_mast); here
diakopter hee
good eye 11:25
timotimo: since you understood what the qast-generating version was doing, you should be able to see how it translates to the mast emission version
jnthn: erm 11:27
same error?
jnthn: oh, it needs box? 11:28
jnthn: oh, you're not going to believe this 11:30
jnthn Is there another bug too? :)
tadzik it made rakudo faster than perl 5 11:33
diakopter faster than go 11:34
tadzik come on, go is slow. It's like chess
diakopter I LIKE MAGLEV
jnthn Anybody for > 100 MB off CORE.setting compile memory use? :)
tadzik :o
11:35 jnap joined
diakopter jnthn: u fixed? 11:35
jnthn diakopter: Your patch? No, I did something else :) 11:37
diakopter: You want me to look at it, or you still working on it?
diakopter yeah I'll push and break the build :)
bbiab 11:40
dalek arVM: 2faf743 | jnthn++ | 3rdparty/uthash.h:
Reduce initial count of hash buckets from 32 to 8.

Most of the hashes we build are rather small. Changing this produces no noticable time difference to Rakudo CORE.setting build or spectest time, however does appear to shave 100MB or so off CORE.setting build memory use.
11:41
jnthn diakopter: a...branch may have been better :P 11:42
dalek arVM: a85a25f | jnthn++ | src/6model/reprs/P6opaque.c:
Don't explode on uncomposed in hintfor.

It simply means we're not in a position to optimize.
12:00
diakopter jnthn: any ideas why we're stuck with -O1 on linux? 12:12
tadzik to make windows look good :P
jnthn diakopter: No
diakopter: It needs some detective work to figure out which optimization(s) -O2 enables break us 12:13
FROGGS -O2 and -O3 explodes when compiling rakudo's BOOTSTRAP.pm 12:16
12:22 lizmat joined
jnthn We need 7s more off CORE.setting compilation time before it's within a minute for me. 12:25
nwc10 on your desktop? 12:27
jnthn Yes. 12:33
Though my current laptop is no slouch either.
It's almost competitive on CORE.setting build. It isn't on spectest 'cus it's only got 2p/4v cores, rather than 4p/8v on my desktop
One of my jobs for Feb: big MoarVM IO overhaul. 12:35
12:35 jnap joined
jnthn I'm really not happy with it. 12:36
No discredit to anybody who worked on it; I'm happy the amount that works does so.
But...the design seems to mean we're doing checks for things all over rather than figuring things once and then having a vtable-y thing that just takes us off to the right place. 12:37
And it's gonna get worse still once we add in async IO stuff.
nwc10 please don't steal from the Perl 5 PerlIO vtable 12:38
do ask leont what the Perl 5 should have had :-) 12:39
jnthn nwc10: Well, I wasn't really thinking of Perl 5 at all (I've no idea how its IO looks), but more replicating the approach I took on JVM 12:42
nwc10 aha
timotimo could it be that concat and trim_string suffer from MVM_string_flatten?
jnthn timotimo: Well, the flattening is always going on to avoid tickling bugs. 12:43
timotimo right.
i feared that :)
jnthn I'm hoping diakopter++ may get tuits to look at that stuff at some point. 12:44
timotimo also, i think the most common case for concat will be that our LHS has multiple strands and our RHS will have one
jnthn Yeah
timotimo but since the strings will always be flattened after concatenation, we'll end up with only one strand on either side for now
JimmyZ hopes to see the NFG branch 12:45
timotimo jnthn: if the flatten function resets the body.flags from MVM_STRING_TYPE_ROPE to MVM_STRING_TYPE_INT64, shouldn't it free the strands array? 12:48
or does it continue using the rope stuff?
jnthn timotimo: I'm really not sure without looking further into it
timotimo: At first thought, sounds like yes 12:49
timotimo i'll just try adding it and see if the spectests fail :P
jnthn Would it mean we never free it later?
timotimo maybe. let me check. 12:50
P6str doesn't have a gc_free or gc_cleanup 12:51
am i looking at the wrong place? 12:52
jnthn Wrong place
MVMString
timotimo OK
gc_free never touches the strands 12:53
so it would appear that this leaks
that doesn't explain why the complexity seems to be so bad, but ... whatevs. 12:54
timotimo runs spectests 12:56
hm, yeah, how do i tell if the failures are my fault or are currently normal? %) 12:57
jnthn Compare it to before you started :) 12:58
timotimo i'll have to generate that data first :| 12:59
luckily the spectest run is pretty darn fast
833.71user 37.61system 4:01.45elapsed 360%CPU (0avgtext+0avgdata 280704maxresident)k 13:00
jnthn Is that 280 with my recent patch for initial hash size, ooc? 13:01
timotimo it might be. let me check
yes, it is
4 minutes for a full spectest run is really good 13:02
moritz timotimo: on how many cores?
timotimo 4 13:03
i *think* 4 physical, 4 virtual
how do i find out?
jnthn Do you have hyperthreading enabled?
That's what gives you the virtual ones.
timotimo yeah, how do i find that out?
cpu cores: 4
jnthn Not sure on your OS :)
tadzik htop or /proc/cpuinfo gives you virtual ones 13:04
timotimo yeah, 4 of those
tadzik is that i5?
timotimo model name: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz
tadzik I _think_ all i5s are 2 physical, 4 virtual
timotimo OK
i have an i7 in my laptop, but it's 2p, 4v, too 13:05
i seem to have made new b0rks with my free call in MVM_string_flatten
tadzik ok, wrong. It's 4 physical, and 4 HW threads 13:06
timotimo i'll let someone who knows the string implementation inside-out try it out
tadzik according to wikipedia
jnthn ah...then it probably ain't right...
tadzik and compared to my 3320M, which is 2/4
13:16 FROGGS joined
FROGGS timotimo: in case you have a core i5, you have two physical plus ht 13:16
timotimo fair enough 13:36
13:36 jnap joined
timotimo calloc allocates on the stack, doesn't it? 13:36
or was that alloca? 13:37
right, it's alloca
there should be some free for the calloc that creates the strands, i think.
FROGGS .oO( Living a vid alloca? )
JimmyZ calloc is malloc&&memset zeror 13:38
timotimo it's still amazing that moarvm takes 100 megs of rss for just "say 1"
JimmyZ *zero
timotimo but parrot takes 2.5x that
so ... yay i guess?
jnthn Probably lower than JVM too :) 13:42
timotimo yes, the jvm has another 200 megabytes more 13:43
jnthn o.O
timotimo 0.19user 0.04system 0:00.24elapsed 98%CPU (0avgtext+0avgdata 104036maxresident)k 13:44
0.28user 0.08system 0:00.39elapsed 92%CPU (0avgtext+0avgdata 247232maxresident)k
8.38user 0.20system 0:04.77elapsed 179%CPU (0avgtext+0avgdata 429280maxresident)k
i wonder how low we're going to get 13:52
lazy loading of the setting, for example, would probably be an amazing win to get the minimum memory usage down
if all you want to do is say 1, you don't need bags/mixes/complex/... 13:58
moritz or sockets 13:59
FROGGS that is an interesting idea... 14:00
timotimo that's an old idea :)
nwc10 stop thinking fun thoughts, and get back to the grindstone of making tests pass! :-) 14:01
timotimo what do we need to keep the .moarvm files around for? 14:03
i mean, mmapped in memory?
big parts of it are deserialized into in-memory structures after loading it
so maybe only the rest (bytecode i guess) is actually needed? 14:04
jnthn timotimo: Correct 14:09
timotimo: That's a plausible optimization
timotimo are the two pieces cleanly separated?
jnthn Well, sort of
timotimo hehe.
jnthn I mean, the bytecode is all in one big chunk
timotimo i think i can mmap /dev/zero over it and linux will DTRT 14:10
jnthn I think you need to keep annotations mapped in too
timotimo otherwise, memadvise can set an "unused" flag, but i don't think it'll get rid of the memory ASAP
are the annotations in one chunk, too?
at least we open the bytecode file readonly, so the kernel *should* share it between processes already 14:11
jnthn Yes, they're in another chunk. Maybe not right next to the bytecode one... 14:12
timotimo that'd be okay
nwc10 If I follow the munmap() man page correctly, you can unmap areas of memory (ie not the entire file) 14:13
so if that's right, you don't need to madvise(), and you don't need to map in zero
jnthn nwc10: That sounds just what we need.
Yeah, mapping in zero feels like a hack to me...
timotimo oh, that seems nice
nwc10 so, try to have the file ordered with things to keep contiguous
timotimo we'll only ever waste one page, i think
well, on either side
nwc10 does the deserialise happen before any bytecode is executed?
yes, that's what I thought too. At most 1 page each side 14:14
timotimo how big are pages? like 4 kbytes?
nwc10 I believe nearly everywhere, yes 14:15
jnthn nwc10: No
timotimo that doesn't sound too bad, though
nwc10 OK. No :-)
jnthn But we get chance to do the munmap afterwards
nwc10 oh, no, to deserialise
not to 4k 14:16
threads. What IRC lacks
jnthn Right :)
timotimo yes, 4096 says getpagesize on my machine
since the bytecode files are multiple megabytes big, that ought to be a small loss if the bytecode and annotations are both chunks and the rest around and between can be discarded 14:17
nwc10 I believe that this is how ELF lays out files. Sparse files, rounded to some size, which might be 32K 14:18
but I haven't checked that
timotimo we can surely embed some padding
14:27 jnap joined
timotimo a friend just pointed out that mmapped files don't count for the rss, only for "shared" memory 14:35
nwc10 oh. But I think that it's still a good idea 14:36
timotimo yeah 14:37
jnthn is working on making our code-gen less awfuls
timotimo jnthn: is there something i can do to implement nqp::locallifetime on moar? 14:38
i'm not sure if we use it anywhere besides $foo++ and friends, though
oh, in sinking we use it
ah, in many places actually 14:39
jnthn And ACCEPTS... 14:41
14:45 camelia joined 14:47 benabik joined
timotimo any mechanism in mast that would allow me to signal locallifetime to the mast compiler? 14:57
jnthn timotimo: Well, see how QAST::Stmt does it... 14:58
timotimo will do 15:00
have to finish my commute first
why exactly can't we just use stmt instead of locallifetime? 15:04
other than that i should be able to make that work somehow 15:05
jnthn Because we want to contorl which locals are killed
timotimo just need to find out what to put into the QAST tree so that the mast compiler knows that there even was ablocallifetime op 15:06
oh, is there an argument to locallifetime?
15:12 FROGGS[mobile] joined
jnthn timotimo: Yes, it's AST and then names of locals 15:23
timotimo fair enough 15:24
15:25 jnap1 joined
jnthn timotimo: I think you need to replicate the force-freeing that QAST::Stmt does, anyways 15:25
timotimo: Just that you know the names to force-free
timotimo yeah 15:26
jnthn Sadly, make release doesn't work at all well on Windows and I dunno what to do about it :) 15:31
nwc10 delegate! 15:32
moritz or write a better 'make release' target :-)
jnthn moritz: Yes, that's the "not sure how to do better" bit :)
moritz install tar and gzip? 15:33
jnthn Doesn't even get that far :) 15:34
[ -n "2014.01" ] || ( echo "\nTry 'make release VERSION=yyyy.mm'\n\n"; exit 1 )
'[' is not recognized as an internal or external command,
operable program or batch file.
timotimo %)
does windows have "test" instead?
moritz
.oO( install [ )
and echo
benabik And ( ? ;-)
jnthn moritz: make release doesn't seem to include the sub-modules in the .tar, anyway 15:35
nwc10 replace the shell with Perl (5, that is) and become portable
jnthn moritz: Was the intention that it would?
moritz jnthn: it did for me 15:36
jnthn moritz: The directories are there but empty
3rdparty/dyncall is empty, for example 15:37
moritz mlenz@mlenz-workstation:~/p6/MoarVM$ tar tzf MoarVM-2014.01|grep 3rdparty|wc -l
255
that's not just directories
maybe different git version?
huh, dyncall/ is empty
but libatomic_ops isn't
wtf?
jnthn libatomic_ops isn't a submodule, though?
No, it ain't... 15:38
moritz what about libtommath?
that's included in the tarball also
jnthn No
Only linenoise, libuv and dyncall are submodules
moritz ok, so I need a betters solution :( 15:39
probably the git ls-files hack from nqp/
benabik I don't know that ls-files follows submodule boundaries. 15:40
*crosses.
moritz it doesn't :(
wonder how nqp does it, then
benabik does nqp have submods?
moritz oh, probably doesn't
jnthn NQP doesn't seem to use submodules.
moritz I assumed that dyncall was one, but it isn't
maybe I'll have a clever idea while taking the subway home 15:41
jnthn Yeah, docs I@m reading seem to suggest submodules aren't included in by git archive
benabik You could do something like `git submodule foreach 'git ls-files | sed -e "s/^/$path/"'` 15:43
Oops, the /s in the path get interpreted by sed. 15:44
git submodules need to suck less.
moritz aye; they mostly suck by being ignored by most git commands right now 15:46
benabik notes that git.git uses subtree merges instead.
timotimo is that like submodules, but without having a separate repository for the submodule's object files? 15:47
benabik Kinda-sorta.
moritz you basically import a whole repo and their history into your own
benabik Right.
timotimo i really love the simplicity of gits object database 15:48
moritz but shove the files into a subdir
benabik The subtree merge is basically "do a merge as-if the 2nd parent was at /path the whole time"
moritz hasn't actually used subtree yet
benabik I think git.git/git-gui used to be a s 15:49
*submodule
Oh, no, it just used to be part of the mainline. :-/ 15:50
Submodules are something of a clever hack that got accepted but never quite integrated. 15:51
jnthn timotimo: Just cut natives time in half again for a loop up to a million... 15:52
timotimo wow.
jnthn timotimo: So if you didn't start benchmarking yet...
Yeah, the code-gen is almost decnt now
timotimo hits ctrl-c
jnthn decunt
timotimo no i didn't start yet!
jnthn decent
dammit
:)
timotimo decont? :)
jnthn :P
I need to spectest this latest change 15:53
timotimo sure, go ahead
jnthn I'm not completely happy with it yet, but it's a lot better
diakopter mourn 16:03
moarn
timotimo can we somehow do a cheap indexing step over the SC and then only deserialize the stuff we find ourselves actually needing at the first moment we need them? 16:05
jnthn timotimo: Not easily
timotimo OK
hm. does deserialization parallelise at all?
jnthn Not yet
timotimo i mean in theory :)
jnthn Oh...
It may well be able to
timotimo that sounds nice 16:06
jnthn Depends whihc phase. :)
But probably it can.
timotimo could shave off another third of startup perhaps
jnthn Yeah, but question is how much we can shave off by spending some time looking at what makes the serialization blob large and seeing if we can make it smaller
timotimo that'd be something, too 16:07
what do we think of variable-sized ints a la google protocol buffers and Sereal?
jnthn Is it a similar scheme the CLR uses, using higher bits to indicate how much should be read?
timotimo i think so 16:08
that could very well quarter a big portion of our ints
and make a small-ish portion of our ints a bit bigger
jnthn aye
timotimo though, if we could find a way to express "all the leading bits are 1" or rather "this number is negative", we should be able to save even more 16:09
jnthn True
It should be quite easy to try, anyway
timotimo moarvm files already carry their serialization version info with them, aye? 16:10
jnthn Right
Well
The serialization blob starts with it
timotimo sounds good. i shall dig in :)
This encoding uses the high bit of each byte to signal there is another byte worth of data coming, and the last byte always having the high bit off. ā† sereal's varint, google's varint128 16:13
er, what file exactly should i be looking at? 16:14
bytecode.c looks the place 16:16
at least for loading 16:17
jnthn timotimo: No, src/6model/serialization.c 16:18
timotimo ah, thanks
jnthn Cool, I just got a 14s nqp make test (non-parallel) 16:19
timotimo wowza. 16:21
dalek arVM: 9680f23 | jnthn++ | src/strings/ops.c:
Two strings at the same location are equal.

Duh.
16:22
timotimo jnthn: that gives us how big a speed improvement? :)
jnthn Not huge, but I saw stage mast dip just below 20s for the first time ever here 16:24
FROGGS \o/ 16:25
jnthn Will know if there's a spectest time improvement soon
FROGGS .oO( sooner? ) 16:27
jnthn Few more seconds off
timotimo ghlad to hear it 16:32
the benchmarks have finished :)
jnthn ooh 16:33
link?
timotimo soon 16:34
timotimo tries to get access to his webspace
i'll just host it on my desktop 16:40
diakopter jnthn: I swear it compared memory addresses before 16:49
jnthn diakopter: Dunno. It sure does now :) 16:50
We spend a LOT of our time doing hash lookups.
And we don't cache the computed hash value anywhere...
I'm wondering if we maybe should start doing so. 16:51
diakopter er I thought we did 16:52
jnthn Nope
We re-compute it every time.
diakopter weird...
timotimo jnthn: you do have ipv6, right? 16:54
jnthn Also, looking in MVM_string_flatten
buffer = calloc(sizeof(MVMCodepoint32), sgraphs);
for (; position < sgraphs; position++) {
/* XXX make this use the iterator */
buffer[position] = MVM_string_get_codepoint_at_nocheck(tc, s, position);
Is there any reason to use calloc there?
It looks to me like we fill the thing 16:55
jnthn tries changing it to malloc
diakopter I'd need a url to expediently find the source 16:56
jnthn Don't worry, I'm fairly happy I analyzed it right
diakopter oki 16:59
moritz github.com/meitar/git-archive-all....ive-all.sh that would solve the git archive + submodules problem 17:02
gist.github.com/moritz/8562794 # hacky shell script for creating a MoarVM tarball 17:11
jnthn moritz++ 17:13
Feel free to commit it in tools
timotimo jnthn: the concat benchmark spends 50% of the complete time doing MVM_string_get_codepoint_at_nocheck 17:28
i think that's from flattening the strings
it could be that using an iterator woul dhelp 17:29
jnthn Yeah
OK, I think I got working caching of hash vlaues on strings. 17:33
*values
diakopter it's not from flattening the strings 17:36
masak TIL 'exec >MANIFEST'. cute. moritz++
tadzik cat: MANIFEST: input file is output file
ain't that funny :P
diakopter in fact, if you can assume they're all flat, you can write a much more efficent comparator
*efficient 17:37
but any decent optimizer should inline that call anyway
er, sry, sufficiently smart optimizer :)
17:38 jnap joined
timotimo diakopter: what is flattening? 17:39
it would seem if the string types of the individual strands are compatible, we can just memcpy the pieces together
diakopter well all the strin goperations that allocate a new string as the result try to conserve copying of codepoint data, so it has its own substring reference system 17:40
timotimo yeah, but at the moment a concat calls the flattener
diakopter right, because of some gremlins
timotimo which does a loop through the individual codepoints, going through the get_codepoint_at_nocheck thingie
if you can get rid of that, the benchmarks ought to improve drastically
have at it! :)
diakopter (which jnthn hopes I'll have time to address soon)
timotimo fine :) 17:41
diakopter the flattener has to do that, except the note I mentioned about using the iterator functor
(the XXX)
since it would be traversing the tree otherwise anyway 17:42
timotimo yeah, but the concatenator doesn't have to flatten all the things
diakopter it does, because of gremlins
(currently)
gremlins with the tree-strings system, which originated (in spirit) from this post: www.nntp.perl.org/group/perl.perl6....g3236.html 17:44
timotimo it should of course flatten parts
if we add one "x" per concat, we'll get a quite horrible rope
diakopter yes, see the todo notes at the top of ops.c
timotimo i don't know at what length a rope breaks even
so it should perhpas be twice that number
diakopter the todo notes discuss that 17:46
(needing to discover those thresholds)
iirc
timotimo fair enough
dalek arVM: 01b7dfa | jnthn++ | src/strings/ops.c:
Don't calloc when malloc will do fine.
17:51
arVM: dcc4340 | jnthn++ | / (3 files):
Cache hash values of strings.
diakopter it's actually not similar to ropes, so I don't call it that
[anymore]
jnthn Down to a 63s CORE.setting build here, and my spectest run just completed in 304s. 17:52
FROGGS 304s is not much 18:01
jnthn And yet it leaves much room for improvement :) 18:03
FROGGS yes :o) 18:04
FROGGS .oO( spectest in less time than getting a coffee )
diakopter jnthn: if you can make all the windows system .dlls late-bound dynamically linked instead of always loaded at every launch by the crt (or else fix the static compile) that would save 22ms off the startup, according what I can see 18:06
jnthn diakopter: I'm not sure how to do that... 18:07
diakopter fix the static compile? :)
jnthn Well, we can't jsut do --static all the time, if that's what you mean... 18:08
At least, I don't think so...
diakopter I thought you were saying it's only rakudo that couldn't handle it 18:12
(so far)
b/c I thought we built both versions 18:13
er, I think not_gerd set it up to build static and dynamic in the same makefile eventually
so that we could do such a thing eventually
jnthn Yeah, but Rakudo relies on the dynamic... 18:15
diakopter but it doesn't have to if we make it build static too 18:16
just sayin' we could reduce the startup time to within p5 levels or a binary order of magnitude :) 18:17
[Coke] arglebargle. the scripts I have for building rakudo for the daily runs work fine offline... except for moar, which is doing a git pull somewhere and failing. 18:20
(during config, dealing with 3rdparty stuff)
[Coke] wonders if he can trick it to not go online, just like the nqp/moar fetches. 18:21
nwc10 gah, firefox stupid
I *can* SOCKS proxy over IPv4 to a machine with IPv6 18:22
(Actually this machine I'd IRCing from)
but I have to use the IPv6 address in the URL (ie 2a02:8071:2909:7b00:5604:a6ff:fe93:d1a6 )
It's too stupid to simply assume that it by default the not-special-case name is to be sent to the proxy
TimToady r: say "Hi, I'm running on $*VM<name>."; # don't need the braces 18:28
camelia rakudo-moar d78036: OUTPUTĀ«Hi, I'm running on moar.ā¤Ā»
..rakudo-jvm d78036: OUTPUTĀ«Hi, I'm running on jvm.ā¤Ā»
..rakudo-parrot d78036: OUTPUTĀ«Hi, I'm running on parrot.ā¤Ā»
nwc10 oh, sorry, that was supposed to be to #perl6 I think 18:29
TimToady ooops
nwc10 me, not you :-) 18:30
TimToady metoo 18:31
was responding to the #perl6 bah clog 18:32
dalek arVM: ac6a3fc | (Tobias Leich)++ | src/io/fileops.c:
do not always create target in copy

In case the soure does not exist, the target should be left untouched.
19:21
FROGGS everybody should delete files like non-existent-copy-mtgt and non-existent-copy-stgt in his rakudo dir if he/she spectested moar in the past 19:25
dalek arVM: ba1af90 | (Tobias Leich)++ | src/strings/ops.c:
return empty string if pos > chrs in substr

Just to be in line with the other backends.
19:38
diakopter FROGGS: have the clean stage do it?
FROGGS diakopter: what? I don't understand 19:40
diakopter make clean
or just add the deletions to configure :)
FROGGS hmmm, good point
diakopter [and remove them in a few months]
FROGGS diakopter++
19:40 jnap joined
tadzik oh, that might help panda 19:57
jnthn argh, readline works how... 20:46
diakopter a line at a time
jnthn a byte at a time AND THEN SEEKS BACKWARDS AND READS IT ALL AGAIN
No wonder it doesn't work on a tty...
FROGGS hides 20:49
jnthn grmbl
FROGGS also hides JimmyZ
nwc10 jnthn: this is our less than awesome code, or third party awesomeness?
was not wanting more names named than that
jnthn Ours 20:50
nwc10 oh. oops
diakopter ours, ish
nwc10 Oh my! 20:52
The original torture has made some progress
Stage start : 0.005
Stage parse : 1144911.468
diakopter O_O
nwc10 rn: say 1144911.468/86400 20:53
camelia rakudo-parrot 19ba6a, rakudo-jvm 19ba6a, rakudo-moar 19ba6a, niecza v24-109-g48a8de3: OUTPUTĀ«13.25129014ā¤Ā»
jnthn Wow
nwc10 OK. So it may well complete
give it another week or so
jnthn Stage parse survived the torture! :)
nwc10 Stage syntaxcheck: 0.068 20:54
Stage ast : 1.188
so now in optimize? I forget
FROGGS ohh wow
jnthn Yes, optimize now 20:56
Thing is, since you started, the time phase optimize takes has kinda halved :)
And the time stage mast does also has :)
FROGGS ctrl+c and try again?
>.<
nwc10 there are more cores
have already been doing other things in parallel 20:57
FROGGS jnthn: I shall take a look at readline then? Ć³.Ć² 20:58
20:59 jnap joined
jnthn FROGGS: Well, trying a few things wiht it here... 20:59
FROGGS k 21:00
jnthn C:\consulting\rakudo>type README | perl6-m -e "say $*IN.lines.elems" 22:00
121
phew
Though, what I've done is a total hack really. 22:01
Just that the larger re-work needed is mroe than I've time for.
FROGGS :/ 22:02
jnthn (as in, if I want $*IN not to be totally busted in the release) 22:03
timotimo why didn't anything happen while i was gone? :( 22:12
jnthn timotimo: It...did, I just didn't push it yet 22:13
timotimo ah, phew :) 22:16
dalek arVM: 55e543a | jnthn++ | src/io/fileops.c:
Do Just Enough so $*IN.get/$*IN.lines work.

This is *not* a good way to do, well, anything. However, pending the upcoming review of IO stuff after this release, it hopefully gets us a working $*IN.get and $*IN.lines. Does at least work in Windows. For now, regress on supporting a plain \r as line ending in readline; can put that back more easily after the future cleanup.
22:17
jnthn FROGGS, timotimo: Please could one of you test that cat README | perl6-m -e 'say $*IN.lines.elems' works now after ^^
FROGGS sure
jnthn Only needs a Moar rebuild, not the whole stack 22:20
[Coke] Dirty trick, but moar pulled ahead today.
jnthn I think honest mistake more than dirty trick :) 22:21
[Coke] I prefer my version of reality!
FROGGS jnthn: it hangs 22:22
jnthn oh ffs
FROGGS let me take a look
jnthn FROGGS: Does say $*IN.get work? 22:23
FROGGS it says nothing
jnthn :/
I assume README exists in the directory you're doing this in? 22:24
FROGGS I am doing this with VERSION in moar 22:25
for README.markdown both callbacks get called for about ten times each 22:27
nread at line 300 is positive 22:29
the condition in line 302 is never met
there is something in read_char 22:33
ohh, it does not blok 22:35
block*
jnthn "it"? 22:36
dalek arVM: c57b446 | jnthn++ | 3rdparty/dyncall:
Update dyncall submodule for Solaris 11 patch.
22:37
FROGGS well, it calls the callbacks after it already left the readline function
it == the program 22:40
jnthn wat 22:41
oh, I wonder if it's a refcount thing 22:42
FROGGS I see my printf() after uv_run() before the callbacks get called
jnthn grrr 22:43
FROGGS: Works on Windows... 22:46
FROGGS: Which is really odd
FROGGS: Got a patch for you to try
FROGGS sure
jnthn woulda expected failure on both...
22:47 btyler joined
jnthn gist.github.com/jnthn/71e1e9fd60a3be0f99e9 22:47
FROGGS: Maybe that helps...or maybe not 22:48
FROGGS jnthn++ 22:49
works!
btyler works on osx too :)
FROGGS almost... 22:50
.get works, but lines.elems still hangs
yeah, lines hangs at eof 22:51
btyler both of those worked ok here (OSX 10.9)
dalek arVM: f9d020c | jnthn++ | src/io/fileops.c:
Make readline a little less broke on non-Windows.
22:52
FROGGS >.o
jnthn FROGGS: Any idea how/where it's hanging? 22:53
FROGGS yeah, it looks like if it hangs when there is nothing to read
it does not even call the a callback
so I guess we should switch to UV_RUN_NOWAIT, and check for zero length after that too 22:54
jnthn hang on... 22:58
23:02 Mouq joined
jnthn FROGGS: Please can you try gist.github.com/jnthn/baa8286627c4695be9e7 to see if it helps? 23:04
FROGGS jnthn: hangs too 23:05
.get still working
jnthn FROGGS: Really? Wow...
Do we ever see the UV_EOF? 23:06
FROGGS no
Mouq FROGGS: what's the sh line that hangs?
FROGGS we get stuck before line 340
MoarVM$ make install && cat README.markdown | perl6-m -e 'say $*IN.lines'
Mouq Ah :( 23:07
FROGGS looks like that on_read is not called when there is nothing to read
jnthn FROGGS: Could you printf the return value from uv_read_start? 23:08
FROGGS always zero
jnthn argh 23:09
FROGGS it reads the 42 bytes (last line of README.markdown), and then tries again, and hangs in UV_RUN_DEFAULT 23:10
jnthn Can you see what uv_is_readable on the handle gives?
FROGGS always 32 23:11
jnthn wtf 23:12
jnthn tries it with the NOWAIT 23:14
Yeah, that won't do it... 23:15
FROGGS reads github.com/mozilla/rust/issues/10237 23:16
jnthn Ah, nice find 23:18
Looks like libuv patched it...
yeah, and we don't have that commit 23:20
FROGGS hmm, I dunno how to update submodules 23:21
jnthn on it 23:22
oh... 23:25
FROGGS hmm?
jnthn Can you do git submodule status in your MoarVM repo?
FROGGS 083b4051dd65f82907e38c1bcea3cbe33b56dc9a 3rdparty/dyncall (remotes/origin/HEAD) 23:26
3e054c36294f9d8fc197c9d1b715ea2db334f6bf 3rdparty/libuv (v0.11.12-1-g3e054c3)
41bb5a7df157173e3555d2074ec9a61212fe85c0 3rdparty/linenoise (heads/master)
23:28 benabik joined
dalek arVM: ee5a5bd | jnthn++ | 3rdparty/libuv:
Update to latest libuv.
23:30
FROGGS src/io/socketops.c:113:13: error: too few arguments to function ā€˜uv_tcp_bindā€™ 23:33
uv_tcp_bind(server, &bind_addr);
jnthn wonders why he didn't see that 23:34
FROGGS I just pass a zero as third arg (flags)
jnthn oh, I didn't make clean. d'oh
yeah, go for that
FROGGS jnthn: I made a realclean, because it still hanged 23:35
works!
jnthn As in, doesn't hang?
FROGGS MoarVM$ cat README.markdown | perl6-m -e 'say $*IN.lines.elems'
75
and I see the text
jnthn \o/
FROGGS .get works too
jnthn Bad news: when I bumped dyncall, it broke the ability to build it... 23:36
Gonna have to back that out :(
FROGGS jnthn: that is HEAD btw, so not applied the gist atm
jnthn which gist? 23:37
gist.github.com/jnthn/baa8286627c4695be9e7 ?
I think it's better design to have that gist.
FROGGS jnthn: okay, I apply and test 23:38
jnthn ok
I got the socket build fix locally too
Gonna do an nqp/rakudo build and spectest cycle with this lot
FROGGS okay, that gist works well too :o) 23:40
jnthn OK. One more thing. What happens now repl wise? 23:42
Mouq jnthn: Infinite '>' on nqp-m and perl6-m 23:43
btyler likewise, at head with that last gist applied
Mouq (on my end, anyway)
FROGGS jnthn: same, infinit ">\n" 23:44
jnthn OK 23:45
I'll try something for that in a moment 23:46
btyler er, sorry, needed a clean. with the 'baa828' gist I get an error during the build. gisting
jnthn I think that's the last thing I'd really like to fix pre-release
btyler gist.github.com/kanatohodets/c3e26...1-txt-L184 23:47
dalek arVM: e13e697 | jnthn++ | src/io/socketops.c:
Build fix for latest libuv.
arVM: 49f8eb8 | jnthn++ | src/ (2 files):
Further improvements to EOF handling.
23:49
arVM: 872224b | jnthn++ | 3rdparty/dyncall:
Revert "Update dyncall submodule for Solaris 11 patch."

This reverts commit c57b446f1c69a99d299471f4dddedea61888c9ba. Sadly, there are configure issues after the update, even if the Solaris patch is wanted.
23:52
jnthn btyler: Hopefully pulling that last bunch helps
btyler jnthn: yep! it did
jnthn FROGGS, btyler: Maybe one of you could try gist.github.com/jnthn/8570089 to see if it helps get a basically functioning REPL 23:57
btyler roger 23:58
yeah! works! 23:59
FROGGS > say(42);
42