This channel is intended for people just starting with the Raku Programming Language ( Logs are available at
Set by lizmat on 8 June 2022.
13:36 guifa joined 15:58 jgaz joined 17:08 jgaz left 18:27 n1to joined 18:28 n1to left 18:36 hearingtrumpet joined, hearingtrumpet left
.vushu shouldn't a rakumod run faster than simply in a raku file? 21:59
librasteve yes - typically it will be precompiled into bytecode 22:05
.vushu my $n; for 0..^1000000000 { $n +=1; } say $n; in raku file on my machine: 1000000000 real 0m57.473s user 0m57.247s sys 0m0.053s 22:06
in rakumod: 1000000000 real 3m17.518s user 4m21.418s sys 0m0.823s
librasteve well - i don't suppose the compiler spends much time on a 5 liner
.vushu So in this case the interpreter is faster 22:07
or how should I understand this
librasteve i'm not sure how the rakumod is so slow / different ... can you maybe post the code in a gist and I can try to repreoduce on my machine? 22:08
ok, I cc ed it 22:10
~ > time raku scum2.raku 1000000000 raku scum2.raku 88.60s user 0.27s system 99% cpu 1:29.20 total
that's a script, not a rakumod btw 22:11
.vushu 22:12
librasteve tx!
.vushu no problem, thx for investigating 🙂 22:13
librasteve 2nd pass the same ~ > time raku scum2.raku 1000000000 raku scum2.raku 88.72s user 0.23s system 99% cpu 1:28.99 total 22:14
now with the module: 22:15
in general, rakudo will precompile your code (.raku or .rakumod) to bytecode, hand it to MoarVM and then it gets run ... MoarVM has some support for introspection and jit optimisation 22:17
however, once a rakumod has been compiled once, a precomp file of the bytecode is retained and if there are no changes, the front end of the compilation is bypassed 22:20
none of this has any bearing on your code since it is a very short program with very short compile time, and then a very long execution time 22:21
anyway, my rakumod has now finished...raku -I'.' scum3.raku 193.15s user 19.50s system 108% cpu 3:16.52 total 22:22
so I conclude (i) my results are similar to yours, (ii) rakumod is 3x slower
.vushu Thanks for clarifying why, this happens. 22:23
Do you have en example where rakumod is indeed faster than the coressponding raku file? 22:24
librasteve ok, I have had a think about why your rakumod example is 3x slower ... I believe the situation is this: (i) when you use a rakumod file you are compiling and loading a raku module, (ii) while the main purpose of the module is to contain chunks of code that can be packaged and re-used, the use statement causes the compiler to run all code statements in the rakumod - why? well that's so that you can put in 22:31
code snippets to read config files, set up some constants and other hopefully lightweight tasks, (iii) then the main program runs. ... and, in the first pass, the module has to be compiled with (jit) optimisations turned off because [reasons I do not know but can guess]
so, in your example, your rakumod has a very short section of code, but it has very long runtime --- and so you are witnessing that the jit gives you a 3 x speed up when you run the main program 22:32
OK - for an example, go git clone 22:33
then cd raku-Physics-Unit/bin && ./synopsis.raku 22:34
oops I mean time ./synopsis-unit.raku 22:36
./synopsis-unit.raku 4.73s user 0.10s system 115% cpu 4.202 total
that ^^^ includes the front end compile time 22:37
./synopsis-unit.raku 3.41s user 0.05s system 112% cpu 3.074 total 22:38
^^^ subsequent passes use the .precomp module and thus the time is lower
.vushu real 0m6.643s user 0m7.185s sys 0m0.105s I got from running time ./synopsis-unit.raku 22:40
First pass: real 0m8.465s user 0m9.880s sys 0m0.193s 22:42
Yeah it's faster
the subsequent ones
librasteve try going to /lib/Physics/Unit.rakumod line 20 and change constant \preload = 1; 22:44
oh - scrub that 22:45
.vushu ok :d 22:46
librasteve perl -e 'my $n; for my $i (0..100_000_000) {$n += 1}; print "$n\n"' 2.01s user 0.01s system 99% cpu 2.023 total 22:59
raku -e 'my $n; for ^100_000_000 {$n += 1}; say $n' 9.06s user 0.03s system 100% cpu 9.057 total 23:00
so perl is about 5x the speed of raku
perl takes 2.01s for 100_000_000 and 19.73s for 1000_000_000 = about linear 23:04
raku takes 9.06s for 100_000_000 and 89.31s for 1000_000_000 = about 10% speed up 23:05
.vushu perl is quite fast. 23:06
c++: int n = 0; for (int i = 0; i < 1000000000; i++) { n +=1; } std::cout << n << std::endl; real 0m1.908s user 0m1.907s sys 0m0.000s 23:13
lizmat librasteve my int $n; for ^100_000_000 {$n += 1}; say $n is about 2.75 seconds for me 23:33
and that would be a much better comparison, as perl is basically also using native ints
if you want to really compare with perl, you would need perl to use BigInts 23:34
23:46 tea3po left, tea3po joined
.vushu my int $n; for ^100_000_000 {$n += 1}; say $n takes for me : real 0m1.654s user 0m1.418s sys 0m0.051s where as my int $n; for ^1000_000_000 { $n +=1; } takes : real 0m11.959s user 0m11.677s sys 0m0.053s Isn't the code the same? 23:48
but the code is 10x faster with the oneliner
I don't understand 23:49