|
🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). 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 6 September 2022. |
|||
|
00:20
sena_kun left
01:02
swaggboi joined
01:04
swaggboi left
01:53
swaggboi joined
02:40
hulk joined
02:41
kylese left
03:07
Jit joined
03:08
Jit left
03:15
hulk left,
kylese joined
04:19
wlhn left,
wlhn joined
04:38
wlhn left
05:25
[Coke] left,
[Coke] joined
06:54
melezhik joined
06:56
melezhik left
07:47
sena_kun joined
08:28
abraxxa joined
08:32
abraxxa left
08:33
Sgeo left
08:35
abraxxa joined
08:58
dakkar joined
09:06
derpydoo left
09:36
jpn joined
10:08
sena_kun left
|
|||
| jdv | rawley.xyz/perl-oo-action-benchmark.html | 10:26 | |
| i thought raku was faster than perl in this sort of way | |||
| lizmat | looks like the bottlenneck is in the hash creation on .execute | 10:31 | |
| the code as is runs in 1.36 secs for me on an M1 | 10:32 | ||
| without the call to .execute, it runs at .47 | 10:33 | ||
| changing the contents of .execute to: "use nqp; nqp::hash('name',$!name, 'age', $!age);" | |||
| it runs at .58 | |||
| looking at the QAST, it looks like it %(foo => 42, bar => 666) is codegenned as List.new( (Pair.new("foo",42), Pair.new("bar", 666) ).hash | 10:39 | ||
| so it's creating Pair objects, and a List object, and the coerces that into a hash: I think we will be able to do better in RakuAST :-) | 10:40 | ||
|
11:31
CIAvash joined
11:49
CIAvash left
11:50
CIAvash joined
|
|||
| Voldenet | there's a few things wrong about this piece of code: `%(name => $!name, age => $!age)` | 12:06 | |
| do you… actually need a lookup (hash represents a lookup)? | 12:07 | ||
| and is your data really that unstructured? | |||
| though the obvious optimization would be having constant keys hashtable for the piece of code, so hash is not recomputed | 12:09 | ||
| I think it could be done with Hash::Agnostic; | 12:10 | ||
| I do wonder though | 12:11 | ||
| m: class Action { method execute { return (name => "old man", age => 100) }}; for ^1000000 { Action.execute }; say now - BEGIN now | 12:12 | ||
| camelia | 0.185289899 | ||
| lizmat | using hashes to represent information, is very perly | ||
| Voldenet | m: class Action { class Result { has Str $.name; has Int $.age; }; method execute { return Result.new(name => "old man", age => 100) }}; for ^1000000 { Action.execute }; say now - BEGIN now | 12:13 | |
| camelia | 0.457651366 | ||
| Voldenet | …shouldn't the latter be faster? | 12:14 | |
| lizmat | replaced method execute by: method execute { Action.new(:$!name, :$!age) } | ||
| clocks in at .77 | 12:15 | ||
| morale: use objects if you can, don't use ad-hoc hashes for structured data | |||
| Voldenet | yeah, objects can be optimized well | 12:16 | |
| and the api that has fixed Arguments and Result is going to be easier to document too | 12:17 | ||
| though I think ad-hoc classes could be made in cases like those, nodejs does that in similar case | 12:18 | ||
| so `%{ a => $a, b => $b }` becomes `class AdHocHash does DynamicHash { has $.a; has $.b; }; DynamicHash.new(:$a, :$b)` | 12:20 | ||
| because of that, nodejs seems 10x faster, only when adding dynamic member it becomes comparably slow | 12:36 | ||
|
12:37
jpn left
|
|||
| Voldenet | (seems, because in case of nodejs it's harder to make a synthetic benchmark) | 12:39 | |
| lizmat | as I said, we can do better in RakuAST :-) | 12:45 | |
|
12:53
CIAvash left
|
|||
| jdv | how does ruby do it so fast | 13:03 | |
| i mean sure, dont use hashes is nice. but ruby can do it and i bet php is even better at it... | 13:05 | ||
| leont | Using ad-hoc hashes is a very common anti-pattern in scripting languages | 13:09 | |
| One major feature of Raku is making it easier to create classes, which should make it less tempting to abuse a hash for something that should be an object | 13:10 | ||
| jdv | even the sans hash runs take way longer | 13:11 | |
| better than it was in the recent past at least i guess | 13:13 | ||
|
13:13
jpn joined
13:18
jpn left
13:25
jpn joined
13:26
timo left
13:27
timo joined
13:34
jpn left
13:35
kawaii joined
13:37
PotatoGim left
13:41
tbrowder__ left
13:44
tbrowder__ joined
13:47
irth left
13:48
jpn joined
13:49
cm_ joined
13:50
cm left,
cm_ is now known as cm
13:52
ab5tract left
13:53
rjbs left,
gugod left
13:54
rjbs joined,
ab5tract joined,
tbrowder__ left
13:55
irth joined
13:59
SmokeMachine left,
ab5tract left
14:00
PotatoGim joined
14:03
gugod joined,
tbrowder__ joined
14:04
ab5tract joined,
zostay left
14:05
zostay joined
14:12
tbrowder__ left
14:15
rjbs left,
tbrowder__ joined
|
|||
| jdv | php 8.2 seems to have a solid effort - gist.github.com/jdv/d44522b6b80cf0...425a14290f | 14:18 | |
|
14:18
leedo left
14:19
leedo joined
14:22
tbrowder__ left
14:23
leedo left,
tonyo left
14:24
GreaseMonkey left,
leedo joined
14:25
tonyo joined,
rjbs joined
14:34
greaser|q joined
14:36
tbrowder__ joined
14:37
SmokeMachine joined
14:43
derpydoo joined
|
|||
| lizmat | jdv: what happend if you increase the number of iterations x 10 and x 100 ? | 14:54 | |
| *happens | |||
|
15:11
merp joined,
merp_ joined
15:27
vlad joined
15:46
greaser|q left
15:48
zostay left,
ab5tract left,
ab5tract joined,
zostay joined
15:50
greaser|q joined
15:55
itaipu joined
|
|||
| Voldenet | if you compare php with anything, do try 8.3 | 16:00 | |
| 8.3 can be around 20-30% faster depending on use case | 16:01 | ||
| jdv | i only bring up php cause its still "relevant" | 16:02 | |
| sadly, perl is largely not anymore | |||
| Voldenet | Probably because php is actively pursuing single use case, so all tradeoffs are targeted towards webhosting | 16:03 | |
| jdv | its a real competitor | 16:04 | |
| oh, and wordpress;) | |||
| Voldenet | yeah, wordpress on top of it | 16:06 | |
| lizmat | jdv: did you try 10x and 100x more iterations? | 16:17 | |
| OOC, I wonder whether PHP decides that you're not doing anything with side-effects. so just noops the whole loop | |||
| jdv | im "afk". i will in a bit:) | 16:18 | |
| i printed from the constructor, the method, and the loop. but maybe that made it deopt... | 16:19 | ||
| my uneducated guess is fb poured money into php back in the day or something | 16:20 | ||
| MasterDuke | for me a python version is the fastest. python 0.18s, ruby 0.29s, perl 0.86s, raku 1.45s | 16:21 | |
| jdv | ah. a new datapoint. wonder what python is doing... | 16:22 | |
| MasterDuke | and jdv's php version was 0.15s | ||
| jdv | geez | ||
| MasterDuke | oh wait, let my check my python | 16:23 | |
| jdv | woukdnt surprise me though. worked with php 7 and it was pretty speedy. | ||
| lizmat | the slow part is really the Hash creation | 16:24 | |
| MasterDuke | huh. apparently i've forgotten python in the last year and a half | 16:25 | |
| gist.github.com/MasterDuke17/d5d07...27c87f6073 doesn't print anything | 16:26 | ||
| jdv | think they got a jit recently | ||
| with fancy ea the hash is constant. id guess php is doing that. | 16:27 | ||
| Voldenet | I'd check golang, but dynamic result might need `map[string]interface{}` which is really not how it's supposed to be used | 16:36 | |
| and using struct result is against rules :> | |||
| probably nodejs is going to wipe the floor with anything else pastebin.com/sabMqAgf | 16:38 | ||
| jdv | $$$ | ||
| Voldenet | in nodejs you don't use $ in variables, because it all went into optimizations | 16:39 | |
| :> | |||
| jdv | but error handling isnt as fun | ||
| ;) | |||
| Voldenet | Oh, perhaps nqp-js could be good in this case | 16:41 | |
| lizmat | pretty sure that NQP on MoarVM would also be pretty fast | 16:46 | |
| jdv | cool | 16:52 | |
| Voldenet | nqp::hash was demonstrated to be over 2x faster, so it's very likely | 16:55 | |
| lizmat | the NQP version runs at .64 for me | ||
| jdv | nice | 16:56 | |
| lizmat | gist.github.com/lizmat/1ac46215b6a...fa15763683 | ||
| what I find odd is that that is slower than the Rakudo version with nqp::hash | 16:57 | ||
| I guess the rakudo static optimizer is a bit smarter still | 16:58 | ||
|
17:09
tbrowder__ left
17:13
tbrowder__ joined
17:15
rjbs left
17:16
rjbs joined
17:21
rjbs left
17:22
rjbs joined
17:33
dakkar left
17:38
abraxxa left
17:46
merp_ left
|
|||
| [Coke] | anyone using Terminal::Print? | 17:50 | |
| lizmat | And yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2024/02/19/2024-...completed/ | 18:08 | |
|
18:49
Sgeo joined
18:55
sena_kun joined
|
|||
| Voldenet | nqp being slower is slightly unexpected | 19:10 | |
|
19:29
greaser|q left,
greaser|q joined,
greaser|q is now known as GreaseMonkey
|
|||
| lizmat | indeed | 19:32 | |
|
19:54
chemitz joined
19:56
jrjsmrtn_ left
|
|||
| chemitz | so `my uint64 $a = 9223372036854775808 ;my uint64 $b = 5919231096550412837; print $a +^ $b;` does not work but `my uint64 $a = 9223372036854775808 ;my uint64 $b = 5919231096550412837; print $a .Int +^ $b;` works. Yet, I think `+^` promotes its operands to Int according to the documentation. | 20:00 | |
| Voldenet | the situation is somewhat weird, because uint64 is Int | 20:01 | |
| m: say uint64 ~~ Int | 20:02 | ||
| camelia | True | ||
| chemitz | sorry typo above it should be `my uint64 $a = 9223372036854775808 ;my uint64 $b = 5919231096550412837; print $a.Int +^ $b;` for the second code snippet | 20:03 | |
|
20:03
jrjsmrtn joined
|
|||
| Voldenet | > multi sub infix:<+^>( int $a, int $b –> int) { nqp::bitxor_i($a, $b) } | 20:05 | |
| > multi sub infix:<+^>(uint $a, uint $b –> uint) { nqp::bitxor_i($a, $b) } | |||
| github.com/rakudo/rakudo/blob/main...kumod#L535 | 20:06 | ||
| So apparently there's no bitxor_i variant for uint | |||
|
20:13
timo left
20:16
jpn left
20:19
timo joined
|
|||
| gfldex | m: my uint64 $a = 9223372036854775808; say $a.WHAT; | 20:30 | |
| camelia | (Int) | ||
| chemitz | Are these operations implemented in MoarVM? Is this missing variant by design, or may eventually be implemented later? | 20:31 | |
| gfldex | 9223372036854775808 is an Int literal, not an int. And `my uint64` does not coerce Int to uinit64. Right now there is no good way to do what you want to do. (Without going through buff, what introduces other difficulties.) | 20:32 | |
| m: my uint64() $a = 9223372036854775808; # sadly, this does not work | |||
| camelia | Cannot find method 'is_dispatcher' on object of type BOOTCode in block <unit> at <tmp> line 1 |
||
| gfldex | chemitz: please note: github.com/rakudo/rakudo/pull/5526 | 20:33 | |
|
20:34
vlad left
|
|||
| gfldex | And even with lizmat`s work, there are no typed exceptions on failing to convert Int to int. As they are thrown by MoarVM. | 20:36 | |
|
20:36
jpn joined
|
|||
| chemitz | yeah I built and run this PR. I am trying to rewrite some SHA3 code to be faster, trying uint64 (conscious that I will hit issues with boxing/unboxing). | 20:36 | |
| but I am hitting issues with uint64 handling (one of which was solved by this PR) | 20:38 | ||
| gfldex | m: use nqp; dd nqp::coerce_iu(9223372036854775808); | 20:40 | |
| camelia | Cannot unbox 64 bit wide bigint into native integer in block <unit> at <tmp> line 1 |
||
| chemitz | with the patch I can do ` my uint64 $a = 9223372036854775808.uint64 ;my uint64 $b = 5919231096550412837.uint64; print $a +^ $b;` but I am still getting a negative result. | 20:59 | |
| gfldex | chemitz: That is hardly surprising, given: github.com/rakudo/rakudo/blob/3d18...kumod#L330 | 21:02 | |
| chemitz: please try nqp::bitxor_i | 21:03 | ||
| lizmat: please take note of ^^^ | 21:04 | ||
| MasterDuke | chemitz: fyi, native uint* was implemented much later than the signed native types. nine++ did a lot of work a couple years ago to dramatically improve the uint situation. however, there are still some missing things. so rakudo issues would be helpful | 21:07 | |
|
22:01
jpn left
|
|||
| MasterDuke | oops, correct python time was 0.27s. so just about the same as ruby | 22:22 | |
|
22:24
cap30 joined
22:53
sena_kun left
|
|||
| jdv | lizmat: sorry - got distracted. the php tracks. x10 takes as much longer as does x100. peculliarly x1000 is a mmap failure. idk bout that one:) | 22:58 | |
|
23:02
hudo__ left,
hudo__ joined
23:43
derpydoo left
|
|||