🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). This channel is logged for the purpose of keeping a history about its development | evalbot usage: 'm: say 3;' or /msg camelia m: ... | Log available at irclogs.raku.org/raku/live.html . If you're a beginner, you can also check out the #raku-beginner channel!
Set by lizmat on 8 June 2022.
Nemokosch A few things: 08:06
1. I kept so much time pondering on the performance
of HTML::Tag using --profile that I still haven't checked HTML::Entities::Fast, sorry
of HTML::Tag using --profile that I still haven't checked HTML::Entity::Fast, sorry
2. I got basically nowhere... I would be really thankful if someone more knowledgeable could point out what is so costly about .render. Now I uploaded the version benchmarked to both github and fez as the latest version <gist.github.com/2colours/6de5e16b4...fc8b4a> also I made this little test file which is how I tried to see the expensive part 08:08
what really hits me is the number of sink calls - where do they come from?
3. Where to look for the rakudo profile HTML file generation? I would take a look for it, maybe I could add a more useful navigation back and forth; I would have been happy if there was something like that. 08:10
since it's an SPA, I would hope that it cannot be too difficult... the content must be loaded some way, the same data could be identified and stored in the window history 08:11
lizmat timo knows 08:17
tellable6 2022-07-24T23:26:51Z #raku <melezhik> lizmat for some reasons rak does not search on my SparkyCI alpine test box - sparrowhub.io:2222/report/914 - but maybe this Rakudo version thing?
timo Nemokosch, the profiler html app lives in the nqp repository, i think under src/vm/moar or so 08:24
Nemokosch Oh right 08:39
github.com/Raku/nqp/blob/master/sr...plate.html
timo there's also moarperf, which has a Cro backend to do some heavy lifting for you, and also supports the memory snapshot profiler 08:43
Nemokosch haha, heard of it! 08:56
timo i wish i had more energy for it next to my day job 08:57
at the day job i'm working with svelte and some of the performance benefits it has over react could be amazing for moarperf
Nemokosch is the code of this template file deliberately this legacy-ish? 08:58
because I doubt the history api would work with browsers that demand this sort of code 08:59
timo it hasn't been touched in a couple of years 09:03
it's still the previous version of angular
Nemokosch It doesn't help that I'm clueless about angular... 09:08
or pretty much any JS frontend frameworks for that matter
timo back and forth navigation would indeed be cool, yeah 09:10
moarperf tries to do that, i don't remember how well i got it to work 09:11
timo regarding sink calls, often times they can be almost completely optimized away, and in the profiling case, overhead from recording the call and return may balloon up the cost artificially, so that's a thing to keep in mind 09:22
lizmat yeah, that's the uncertainty principle at work there :-) 09:28
SmokeMachine maybe you could use component-like solution Raku-only like what I was playing with last weekend... github.com/FCO/Cro-WebSocket-WebComponents-test (I'm still trying to understand how useful it is...) 09:29
sorry... it seems there is no server on what you are talking... sorry... 09:30
timo moarperf does have a server, the SPA for the default --profile does not
the most reliable way to figure out if the sink calls are actually cheap is to read the spesh log, but that's a science unto itself 09:32
lizmat: haven't looked if you added more to the spesh module, could this be something it could learn, how good sink calls are handled? %)
jaguart JRasspass++ - thank you! I see that raku.land/github:jsimonet/Log::Any and friends have readme! 09:33
lizmat I haven't touched the Spesh module for a long time
timo that's fine 09:34
Nemokosch I mean, the profiler wouldn't lie that they are costly, right? ... 09:39
timo i think it does try to measure the overhead of measuring a call up front, so that it can subtract that
lizmat the profile inserts code that (sometime? always?) prevents inlining, so it *can* make a difference 09:40
timo it tries not to prevent inlining 09:40
i'm not sure when it does prevent it? 09:41
lizmat when it puts the size above the inlining limit ?
timo i definitely wrote code to subtract profiling-added instruction sizes 09:42
it may not be in master, but i sure hope it is :) :)
Nemokosch I mean, really, if you have time, I'd be more than thankful if you took a look at it. I uploaded both the module and a little gist that I tried to analyze. 09:43
timo installing zef as we speak 09:47
timo i froze up my computer for a bit there :D 10:05
are the tests supposed to be clean? because i do have some failures
Nemokosch aaaah bruh 10:10
one space is missing
timo the benchmark only runs for one second, that's really not much for benchmarking 10:11
Nemokosch ... 10:12
Liz told me that the HTML gets out of hand if it runs for longer :heh:
decide you guys
lizmat depends on the browser you use, I guess... 10:14
my experience is that if you profile something that runs longer than a few seconds, you get a HTML file of several MBs that at least Safari basically chokes on 10:15
timo Seq.pm's sink spends a lot of time inclusive but barely an time exclusive, which looks to me like that just does the work of a loop, like a for loop or so 10:16
Nemokosch I'm gonna upload the test-passing version, thank you for noticing the big dumb
I'm not sure what you are looking at 10:18
7.01 ms just on sinks, exclusive time
compared to 9.75ms on maps, exclusive time
the percentages are quite surely wrong in the exclusive time column
but they are wrong consistently, at least 10:19
timo map itself shouldn't do much at all 10:27
2ms on List sink, 30ms on List's sink 10:28
map 18.6ms exclusive time
"The profiled code ran for 264.96ms. Of this, 56.37ms were spent on garbage collection (that's 21.27%)." 10:30
Nemokosch Still, these are at the top 10:39
timo could be from being called a whole lot, too :)
i put a `for ^10 {` around the code including the "render to file" call 10:40
Nemokosch okay 10:41
timo sorting exclusive time now puts sink far to the bottom 10:42
Nemokosch also, thank you for the help either way, I really spent hours pondering about it and got nowhere, partly because I don't comprehend the generated data itself 10:43
timo yes it definitely is A Bit Much
List.pm's sink is at 142130 calls total, 1% inclusive, 0.5% exclusive time 10:44
so each individual call does barely anything apparently
Nemokosch I don't know/think that it's the main reason for the module (and the render call in particular!) to be this slow 10:45
But it got my attention why there is such a big number of sink calls in the first place 10:46
I don't see how it would follow from the code 10:47
timo right, sink calls are generated in the background and we rely on optimization to throw them out when they are not needed
Xliff \o 13:54
Is it possible to adjust the timezone of an existing datetime instance? 13:55
: my $dt = DateTime.new( year => 2021, month => 12, day => 1); $dt.gist.say; $dt.timezone = -14400; $dt.gist.say
m: my $dt = DateTime.new( year => 2021, month => 12, day => 1); $dt.gist.say; $dt.timezone = -14400; $dt.gist.say
camelia 2021-12-01T00:00:00Z
Cannot modify an immutable Int (0)
in block <unit> at <tmp> line 1
Xliff This seems oddly limiting to me.
Nemokosch what? immutability? 13:57
Xliff Well, the fact that you can't adjust the timezone. Yes. 13:59
Nemokosch look docs.raku.org/type/DateTime#method_in-timezone
Xliff At least, not without creating a new DateTime object.
Oh, LOL! My eyes skipped right over that. I thought that method meant "Is object 'in this timezone'" 14:00
Nemokosch++
lizmat and yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2022/07/25/2022-30-what/ 14:01
Nemokosch yeah, tbf the name is disturbing 14:04
why not with-timezone or something
lizmat I wonder if raku.land/zef:lizmat/Method::Also would work on core classes 14:08
afk& 14:10
Xliff lizmat++ 14:28
Xliff What's the best way to pass a parameter to an grammar action class? Can you .new? 14:29
Voldenet sure you can 14:37
m: grammar { rule TOP { .+ } }.parse("whatever", :actions(class :: { has $.x; method TOP ($/) { make ($.x ~~ ~$/) } }.new(:x("whatever")))).made.say 14:38
camelia True
melezhik o/ 14:57
Hi lizmat - any thoughts on this App-Rak failure? - sparrowhub.io:2222/report/912
melezhik I also create a positive/negative test for App-Rak search within dir - in "Sparrow" style - raw.githubusercontent.com/melezhik...7CBF2.jpeg 15:09
Nemokosch For the whatever anomaly I've shown... 17:22
Either I'm very stupid some way or some serious issue is going on 17:23
but I can't be _that_ stupid, after all, I just expect { .&function($second-argument) } and *.&function($second-argument) do exactly the same thing regardless of context... 17:32
also this cannot be just a parsing error because the behavior changes if the argument I try to bind is a fully fledged local variable, not a function parameter itself 17:33
it goes from Mu to Any
so it does take something, after all
Nemokosch . 18:16
For the weird parameter problem earlier
I have a reasonably golf-ish way to do it, I still don't understand the behavior even if it is possibly correct 18:17
what I need is a function with 2 arguments and another function with andthen .map andthen .map chaining in it 18:18
m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10) andthen .map(* + 2) andthen .map(*.&lin5($x)) }; say problems(10) 18:19
camelia Type check failed in binding to parameter '$b'; expected Any but got Mu (Mu)
in sub lin5 at <tmp> line 1
in block <unit> at <tmp> line 1
Nemokosch I don't see how I messed up the precedence if I did 18:20
the WhateverCode bit sees $x but not its actual value
if I define a variable inside the function and try to pass that, it will be (Any) instead of (Mu) 18:21
m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { my $y = 11; (1 .. 100).roll(10) andthen .map(* + 2) andthen .map(*.&lin5($y)) }; say problems(10)
camelia Use of uninitialized value of type Any in numeric context
(250 95 375 270 270 420 170 310 90 340)
in sub lin5 at <tmp> line 1
Use of uninitialized value of type Any in numeric context
in sub lin5 at <tmp> line 1
Use of uninitialized valu…
Nemokosch any idea ^^ 18:22
Voldenet you _can't_ do .map(*.&lin5($y)) 18:43
m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { my $y = 11; (1 .. 100).roll(10) andthen .map(* + 2) andthen .map({.&lin5($y)}) }; say problems(10)
camelia (166 211 156 436 146 361 396 486 146 276)
Voldenet it is a bit weird to me that $y is Any in this context, but method calls with whatever-star always cause problems to me 18:58
Nemokosch Actually, you _can_ 19:27
 m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { my $y = 11; (1 .. 100).roll(10).map(* + 2) andthen .map(*.&lin5($y)) }; say problems(10)
camelia (131 426 391 311 206 46 141 421 156 511)
Nemokosch literally one andthen less and it works 19:28
I can agree that WhateverCode usually gets one into trouble - but this very apparently can work so it sounds more like a personal opinion that one can't use it here :P 19:29
m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10).map(* + 2) andthen .map(*.&lin5($x)) }; say problems(10) 19:31
camelia (165 225 205 120 50 340 330 295 450 220)
Nemokosch right, this works with the parameter as well
Voldenet "can work" never beats "will always work" ;) 19:36
Nemokosch it beats "can't work", however 19:38
Voldenet true that :) 19:43
Voldenet m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { my $y = 11; (1 .. 100).roll(10) andthen .map(* + 2) andthen { .map(*.&lin5($y)) } }; say problems(10) 20:07
camelia (46 271 76 271 71 396 506 366 491 416)
Voldenet …uh oh
Nemokosch what's up 20:12
Voldenet that looks like a bug of some sort 20:15
Nemokosch what is this, even, a code block out of the blue? because andthen is an operator, not a statement 20:17
sometimes I can't decide if the problem is that something works or that it doesn't 20:18
oh wait... andthen creates a block from the right side 20:19
Voldenet I've been swimming a bit in –target=ast and apparently nothing gets bound to a declared variable 20:20
Nemokosch vrurg already fleeing 20:26
Voldenet I'm unsure if I'm even right though, reading qast is difficult 20:34
jjatria Is there a way to load a module at runtime while validating auth and version? I can do `require`, but that seems to ignore `:auth<>` and `:ver<>` 20:35
Voldenet "validating"? 20:44
you use the module with version an auth
e.g. > use MIME::Base64:ver<1.2.3>:auth<zef:raku-community-modules>
jjatria But that is at compile time
"validating" = "making sure that the one I loaded is the one I think I loaded" 20:45
Voldenet there's ^auth and ^api on ModuleHOW but I'm not sure whether it returns anything useful: `(require MIME::Base64).^auth.say` has usable result but `(require Libarchive).^auth.say` doesn't 21:13
Nemokosch m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10) andthen ( .map(* + 2) andthen  .map(*.&lin5($y)) ) }; say problems(10) 21:14
camelia ===SORRY!=== Error while compiling <tmp>
Variable '$y' is not declared. Perhaps you forgot a 'sub' if this was
intended to be part of a signature?
at <tmp>:1
------> hen ( .map(* + 2) andthen  .map(*.&lin5(⏏$y)) ) }; say proble…
Nemokosch oh right 21:15
m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10) andthen ( .map(* + 2) andthen .map(*.&lin5($x)) ) }; say problems(10)
camelia (80 155 200 405 195 150 500 295 480 55)
Nemokosch see? with this precedence, it would work
m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10) andthen .map(* + 2) andthen ( .map(*.&lin5($x)) ) }; say problems(10)
camelia Type check failed in binding to parameter '$b'; expected Any but got Mu (Mu)
in sub lin5 at <tmp> line 1
in block <unit> at <tmp> line 1
Nemokosch with this, however
Nemokosch oh cool, we're back again 21:17
Nemokosch anyway, I'm gonna open an issue for this, as usual :D 21:19
Nemokosch m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10) andthen .map(*.&lin5($x)) andthen .map(* + 2) }; say problems(10) 21:26
camelia (297 182 247 272 392 42 402 62 342 262)
Nemokosch the order is also important 21:27
Voldenet m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10) andthen .map(*.&lin5($x)) andthen .map(* + $x) }; say problems(10) 21:27
camelia Cannot resolve caller infix:<+>(Int:D, VMNull); none of these signatures matches:
($x = 0)
(\a, \b)
(Real $a, Real $b)
(Int:D $a, Int:D $b --> Int:D)
(int $a, int $b --> int)
(uint $a, uint $b --> uint)
(Num:D…
Nemokosch yes yes, that would have been the next remark 21:28
it doesn't even have to be a function call
it can be anything whatevercurried and it has to be on the right
Nemokosch m: sub lin5($a, $b) { 5*$a + $b }; sub problems($x) { (1 .. 100).roll(10) andthen .map(* + 2) andthen ( .&(* + $x) ) }; say problems(16) 21:32
camelia 26
Nemokosch This, however, works
this is really annoyingly complicated to reproduce
or describe, for that matter... 21:33
Nemokosch it's not even that WhateverCode's can't form closures because sometimes it looks like they can, or it's optimized away at least 21:39
jjatria Voldenet: yeah, I tried those and they didn't seem to work for me. But knowing after loading that the one I loaded was not the right one doesn't really help if I cannot then somehow load the right one 21:43
Nemokosch github.com/rakudo/rakudo/issues/5004 today's piece of art, lol 21:45
Voldenet "art" :) 21:48
Nemokosch I'd like to think this is art, since it was a huge effort to get to this point with the analysis even 21:49
Voldenet true
jjatria: github.com/rakudo/rakudo/blob/aa5e....nqp#L2354 – I'm looking for hints and it might just be that auth is never being attached when doing `require` 21:50
jjatria Oh, interesting. I wonder if this was intentional 21:53
lizmat I would find that strange, really 21:54
jjatria It does seem like a strange limitation, because both `use` and `need` honour it
Nemokosch I only made one issue today, let's go for it!
lizmat Nemokosch++ 21:55
Nemokosch I would write an issue for that as well, seriously, but for that, first I would need to know the context and so on... also, it would be nice to go to sleep :D 21:57
lizmat yeah, /me is hitting the straw now
Voldenet I could be also reading the code for require wrong, it's sufficiently complex for me 21:58
melezhik o/ 22:39
.tell jjatria I bumped on Lorea tool and think that Tomtit could be good combination with it - gitlab.com/jjatria/lorea/-/tree/ma...figuration , what if distribute standard Lorea configurations suitable for different environments (like ruby/Raku/go) as Tomtit profiles ? - github.com/melezhik/Tomtit#profiles , so user can just 22:51
say "tom --profile lorea && tom lorea-ruby-conf" and voila, loira for Ruby configuration file is populated ?
tellable6 melezhik, I'll pass your message to jjatria
melezhik I can drop a simple Tomtit::Profile::Loira module for that or even you can try this ...it's simple coding required ... 22:52
we could even ship Tomtit::Profile::Loira as a dependency of App::Loira , so a user always have uptodate version of Loira config bootstrapers ... 22:54
of App::Loira  -> for of App::Loira