github.com/moarvm/moarvm | IRC logs at colabti.org/irclogger/irclogger_logs/moarvm Set by AlexDaniel on 12 June 2018. |
|||
MasterDuke | github.com/rakudo/rakudo/issues/1955 | 00:00 | |
timotimo | so we can pull the gcd up front (if we need it any more at all) and immediately check to see if the result would fit or not | ||
woww | |||
there has already been exactly all the discussion here | |||
niner already came to the conclusion i was asking about | 00:01 | ||
japhb is trying to think if there's any way that x ** n == y ** m for x and y relatively prime, just in case his brain has leaked | |||
Heh, there we go, I'm not the only one then | 00:02 | ||
:-) | |||
timotimo | fortunately m and n would have to be the same in this specific case | ||
japhb | timotimo: I was thinking of partial cancellation. | ||
And ignoring the trivial m == n == 0 case. | |||
But yeah, I think my original statement is true. | 00:03 | ||
timotimo | right, negative numbers are also a concern, right? | ||
00:05
Voldenet joined,
Voldenet left,
Voldenet joined
|
|||
japhb | timotimo: yeah, then you'd care about the size of the exponentiated numerator, I suppose. | 00:06 | |
timotimo | i can't just immediately implement this because currently rats can have non-reduced nudes | 00:08 | |
so the code would have to become slightly nontrivially bigger | |||
MasterDuke | i thought zoffix fixed that? | 00:15 | |
timotimo | was that merged? in that ticket it says "unmerged" | 00:16 | |
MasterDuke | that was a month ago, i thought that did actually happen | 00:17 | |
zoffix: ^^^ ? | |||
01:17
Kaiepi left
01:18
Kaiepi joined
01:20
Kaiepi left,
Kaiepi joined
03:08
Kaiepi left
03:09
Kaiepi joined
06:15
diakopter left
06:38
robertle joined
06:43
lizmat left
07:20
domidumont joined
07:27
domidumont left
07:28
domidumont joined
08:06
lizmat joined
09:28
brrt joined
|
|||
brrt | \o | 09:28 | |
09:36
zakharyas joined
09:45
domidumont left
10:24
robertle left
10:26
brrt left
10:53
brrt joined
11:07
Zoffix joined
|
|||
Zoffix | Patience! Use the force! | 11:08 | |
Why is everyone obsessed with my Rat example now? I regret making that talk. | |||
Weren't you guys working on something, like the tooling grant and graal stuff or something? | |||
the unreduce branch has other crap in it like reducing zero-denominator rationals and that needs more thought. | 11:10 | ||
lizmat | Zoffix: don't worry about it... there's medium.com/@jcoterhals/perl-6-smal...6d0addb46f | ||
that shows it's better to be correct than fast | |||
Zoffix | And like the grant cancelation blog said, there are more important things to do right now and the rat stuff will be done eventually. | ||
lizmat | indeed | 11:11 | |
some people will just continue making their point, however repetitive it is | 11:12 | ||
and we'll just do the same :-) | |||
11:13
domidumont joined
11:15
brrt left,
brrt joined
|
|||
brrt | Zoffix: regardless of the Rat example, what struck me was that your code was nearly entirely container-free | 11:23 | |
Zoffix | brrt: why is that striking? | ||
brrt | because.... | 11:24 | |
because containers are Terrible For Performance, and I think that rakudo core developers know this very well | 11:25 | ||
Zoffix | And doesn't look like ** can be optimized much anyway. The slowness comes from raising numerator/denominator to huge power, not due to reduction, and you still have to do the raising even when producing a Num result 'cause otherwise you don't get the correct Num (e.g. in the talk's example, $numerator.Num gives Inf) | ||
brrt: ah :) | |||
brrt | So from my perspective, I want to get rid of them | 11:26 | |
Zoffix | brrt: yeah, when I started with Perl 6, I couldn't understand why some people used binding all over the place. Now, I bind or use raw params any time I can | 11:27 | |
brrt | Zoffix: so, from my PoV, that is a Problem, and a rather large one | ||
especially as mixing binding and assignment creates maddeningly confusing behaviour | |||
Zoffix | brrt: I don't think containers are *that* Terrible For Performance | ||
brrt | they kind of are | 11:28 | |
Zoffix | And isn't that what rescallar branch that landed was about? To not create a Scalar when can get away with it? | ||
brrt | it's an improvement, but nowhere near where we could go if we got rid of them altogether | ||
Zoffix | heh | 11:29 | |
brrt | Let me try and make this point, as best as I can on IRC, anyway | 11:30 | |
In many respects, perl6 is a vast improvement on the state-of-the-art in dynamic languages | 11:31 | ||
Zoffix | Let me make mine first: tiny examples from a talk written by someone who avoids containers on purpose aren't a good argument for claiming a feature to be useless enough to get rid of it altogether | ||
brrt | Agreed, but don't worry about that; It's a straw-breaking-camels-back | 11:32 | |
This has been a long time coming | |||
Zoffix | Sure, let's redesign the language from the ground up, two and a half years after it stabilized after a decade and a half of design, on an off chance we make a 5% improvement to performance. | 11:33 | |
11:33
Zoffix left
|
|||
brrt | Perl6 has: - native multiple threads - builtin async io *and* synchronous IO - a usable type system - native numeric types - a powerful object system - dynamic specialization and JIT compilation | 11:34 | |
Perl6 is an awesome language, it is just Too Damn Slow | |||
lizmat | brrt: fwiw, I think getting rid of scalars in Perl 6 feels, eh, something that should have been designed earlier ? | 11:35 | |
brrt | oh, absolutely | ||
lizmat | so I'm not sure what you're getting at ? | ||
brrt | I'm getting at - we're paying a fantastic performance penalty in making assingments into method calls *by default*, and there is a component to that that we *cannot*, by the best known means, reliably eliminate | 11:37 | |
and even if we can eliminate in some cases - and I'm sure jnthn++ has a few tricks up his sleeve yet - what we get is deeply unintuitive performance behaviour | 11:38 | ||
lizmat | "making assingments into method calls *by default*" what level of the stack are you getting at here ? | 11:39 | |
nqp::assign? or .STORE ? | |||
brrt | .STORE | ||
lizmat | yeah, but that doesn't happen by default, only for Array / Hash and Proxy | ||
you can't Scalar.STORE | 11:40 | ||
afaik | |||
brrt | true; the REPR op does a STORE still, though, so the point still kinda stands | ||
and it's not just the fact that it is a (potentially multi) method call, but also that there's a box arround it, and that box needs setup and gc and dereference etc | 11:41 | ||
(this reminds me of when I was in university and we found out that the packaging of e.g. a refrigerator was responsible for a significant part of the total environmental impact) | 11:42 | ||
lizmat | so what are you suggesting? Banning "=" from the language ? | 11:43 | |
brrt | I'm not even starting about the totally confusing behaviour you can get from mixing them. Although that's an interesting discussion in it's own right | 11:44 | |
Making '=' and ':=' the same thing. Introducing explicit Refrences, with syntax, for the rare case that this behaviour is needed | 11:45 | ||
lizmat | feels to me you don't like to be tortured on behalf of the users :) | ||
brrt | :-) | 11:46 | |
If this was something that I could actually see benefitting users, then I'd be happy to; but I don't | |||
ok, consider this: | 11:48 | ||
m: my $l = (1,2,3); $l[1] = 3; | 11:49 | ||
camelia | Cannot modify an immutable List ((1 2 3)) in block <unit> at <tmp> line 1 |
||
brrt | m: my $x = 2; my $l = (1,$x,3); $l[1]=4; say $l | ||
camelia | (1 4 3) | ||
brrt | > m: my $x = 2; my $l = (1,$x,3); $l[1]=4; say $l, $x | ||
m: my $x = 2; my $l = (1,$x,3); $l[1]=4; say $l, $x | 11:50 | ||
camelia | (1 4 3)4 | ||
lizmat | so, yeah, that's a peculiarity of List that I don't particularly like either, that's why I made modules.perl6.org/dist/Tuple:cpan:ELIZABETH | ||
brrt | :-) | 11:53 | |
anyway, this would never happen if the reference semantics of list where explicit and part of the syntax | 11:54 | ||
because I'd never be confused that way | |||
anyway, this is obviously not just up to me | 11:55 | ||
masak is not a fan of mutability in general :) | |||
but I also recognize that we live in a world of compromises, and Perl 6 is already a compromised language in that sense ;) | 11:56 | ||
brrt is a fan of explicit syntax, obvious semantics, and a consistent mental model of the runtime | 11:57 | ||
masak | by the way, it's interesting the success something like Redux has had in the JS world. it's essentially a way to close your eyes to reality and pretend that JavaScript is a laregly side-effect-free language, like Haskell. | ||
brrt: amen to that. | |||
brrt | I haven't used anything related to javascript in a long time | ||
masak | heh. the above is not meant to disparage Redux in any way; it's a fine library. | 11:58 | |
I just mean with enough effort you can forget that mutations are there. | |||
brrt | :-) | 11:59 | |
speaking of which, have you read 'Designing data-intensive applications' by... whatshisname | |||
I liked that a lot. | |||
masak | this one? www.amazon.com/Designing-Data-Inte...1449373321 | 12:07 | |
I had not. now added to my never-shrinking wishlist | |||
12:09
domidumont left
|
|||
brrt | I would recommend it | 12:11 | |
12:17
robertle joined
12:21
domidumont joined
|
|||
brrt | also, in general; I hope it is never too late to reconsider design decisions | 12:22 | |
12:31
domidumont left
12:32
Zoffix joined
|
|||
Zoffix | brrt: yeah, if you want Perl 6 to be forever called an experimental toy language. If we want to get more than 200 users, we' | 12:32 | |
d have to stop making them change their code all the time. | |||
And your examples with lists breaks `my ($x, $y, $z) = ...` | 12:33 | ||
brrt: and not only code, but educational materials as well. For example the containers article I wrote last year now requires a change about Proxy. | 12:34 | ||
With your proposal, it'd need an entire rewrite. | |||
And we have half a dozen books out already. | 12:35 | ||
lizmat | Zoffix++ | ||
12:35
brrt left,
domidumont joined
12:36
diakopter joined
|
|||
timotimo | once our escape analysis is a bit better, we'll be making a whole lot fewer scalars, though of course scalars inside of datastructures such as arrays will remain | 12:38 | |
rescalar will cheapen scalars even more once we get better at removing redundant guards, too | |||
lizmat | timotimo++ | 12:39 | |
timotimo | and moving deopt targets earlier, i.e. daring to re-execute a few instructions after deopt, ought to let us eliminate a couple more instructions in typical bytecode segments | ||
i've got a positive outlook on this | 12:40 | ||
Zoffix | timotimo++ | ||
lizmat | timotimo: in the for ^100 loop optimization | 12:41 | |
it looks like it is generating an nqp::while with 3 statements | |||
isn't a nqp::stmts needed there ? | 12:42 | ||
nqp::while( nqp::isle_i($i,$max), nqp::call(), nqp::bind($i,nqp::add_i($i,1)) ) | 12:43 | ||
timotimo: shouldn't the call / bind be inside an nqp::stmts ? | |||
timotimo | could be | ||
lizmat | or am I misunderstanding something ? | ||
12:43
domidumont left,
Zoffix left
|
|||
lizmat | hmmm.. guess not | 12:45 | |
so nqp::while is variadic in its parameters ? | 12:46 | ||
timotimo | perhaps it is | ||
lizmat | m: use nqp; my int $i; nqp::while( nqp::isle_i(($i = nqp::add_i($i,1)),10), nqp::say("foo"), nqp::say("bar") ) | ||
camelia | foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar |
||
lizmat | ah no, that's the pst block | ||
use nqp; my int $i; nqp::while( nqp::isle_i(($i = nqp::add_i($i,1)),10), nqp::say("foo"), nqp::say("bar") ) | |||
evalable6 | foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar |
||
lizmat | github.com/perl6/nqp/blob/master/d...down#while | 12:47 | |
TIL nqp::while has a post block :-) | |||
looks like the nqp::while without the post block is about 9% faster | 12:59 | ||
timotimo | that sounds good | 13:00 | |
zoffix, but 90% of the time from that rat example is spent in gcd, but we know that we don't have to reduce the rat after raising it to the power, so it should become at least 10x faster from that change alone. possibly also wins to be had inside DIVIDE_NUMBERS, which is at 9.88% | 13:07 | ||
13:09
domidumont joined
13:12
Zoffix joined
|
|||
Zoffix | timotimo: ah, I measured wrong. In the code I used for measurement I had `say $denominator` so it was trying to stringify a huge integer which made me think the power operation on Ints themselves was super slow | 13:13 | |
I'll look into cherry-picking stuff from unreduce branch | |||
timotimo | ah! | ||
13:14
domidumont left
13:15
domidumont joined
|
|||
Zoffix | m: say 26.2/4.4 | 13:16 | |
camelia | 5.954545 | ||
Zoffix | So it can be at least ^ that much faster. | ||
timotimo | huh, only that much, eh? | 13:17 | |
that doesn't seem right | |||
Zoffix | m: sub calc (\n) { my $r := (1 + .123/n); $r.nude; my $nu := $r.numerator ** n; my $de := $r.denominator ** n; use nqp; nqp::div_In($nu, $de) }; calc 50_000; say now - ENTER now | 13:18 | |
camelia | 1.9609962 | ||
Zoffix | m: sub calc (\n) { my $r := (1 + .123/n)**n }; calc 50_000; say now - ENTER now | ||
timotimo | OK, dividing the one huge number by the other huge number still takes a bunch of time, then? | ||
camelia | 21.38466 | ||
Zoffix | m: say 21.38/1.96 | ||
camelia | 10.908163 | ||
Zoffix | I guess it depends on what sort of box you use too | ||
timotimo | ok, how about this | 13:19 | |
we figure out the point where we'd reach the overflow point | |||
at that point we turn into num | |||
and then do the rest of the exponentiation | |||
Zoffix | Then you end up with Inf in the denominator, and you get wrong answer | ||
(with the example above) | |||
timotimo | not if we switch over early enough perhaps? | 13:20 | |
this reminds me of the thing where re-ordering the entries in a list you want to sum can give drastically different results because of floats | |||
Zoffix | Num can only go up to ~1.78e308... 50000000**50_000 is ~3.16e384948 | 13:23 | |
timotimo | but the nominator grows along with it, right? | 13:24 | |
Zoffix | numerator. Yeah | 13:25 | |
timotimo | so i was thinking we keep it Int, but reduce the power before we divide both numbers to a num | ||
and then continue the exponentiation with the single num | |||
so i'd expect we end up at the right result after all | 13:26 | ||
Zoffix | Would it still equal to those two integers being just divided? Like, would it give a correct Num? (hard to measure now, since nqp::div_In doesn't give a closest Num ATM) | 13:27 | |
timotimo | m: sub calc (\n) { my $r := (1 + .123/n)**n }; say calc 50_000 | 13:28 | |
Zoffix | m: sub calc (\n) { my $r := (1 + .123/n); $r.nude; my $nu := $r.numerator ** 50; my $de := $r.denominator ** 50; use nqp; dd nqp::div_In($nu, $de)**(n-50) }; calc 50_000; say now - ENTER now | ||
camelia | 1.1308842498562788 | ||
465.84010040842134e0 0.00243249 |
|||
timotimo | m: sub calc (\n) { my $r := (1 + .123/n)**n }; say calc(10_000) * calc(10_000) * calc(10_000) * calc(10_000) * calc(10_000) | ||
camelia | 1.8496496037652481 | ||
timotimo | damn. | ||
that's not right | 13:29 | ||
Zoffix | m: sub calc (\n) { my $r := (1 + .123/n); $r.nude; my $nu := $r.numerator ** 50; my $de := $r.denominator ** 50; use nqp; dd nqp::div_In($nu, $de)**(n/50) }; calc 50_000; say now - ENTER now | ||
camelia | 1.1308842498561582e0 0.00244834 |
||
Zoffix | j: sub calc (\n) { my $r := (1 + .123/n); $r.nude; my $nu := $r.numerator ** 50; my $de := $r.denominator ** 50; use nqp; dd nqp::div_In($nu, $de)**(n/50) }; calc 50_000; say now - ENTER now | 13:30 | |
camelia | 1.1308842498561582e0 0.045 |
||
Zoffix | j: sub calc (\n) { my $r := (1 + .123/n)**n }; say calc 50_000 | ||
camelia | ( no output ) | ||
Zoffix | j: sub calc (\n) { my $r := (1 + .123/n)**n }; say calc 50_000 | ||
camelia | (timeout) |
||
Zoffix | grr | ||
j: sub calc (\n) { my $r := (1 + .123/n); $r.nude; my $nu := $r.numerator ** 10; my $de := $r.denominator ** 10; use nqp; dd nqp::div_In($nu, $de)**(n/10) }; calc 50_000; say now - ENTER now | 13:31 | ||
camelia | 1.1308842498567593e0 0.078 |
||
Zoffix | not the same result | ||
.oO( powers of 2? ) |
13:32 | ||
no, still differs | 13:33 | ||
vOv | |||
"since nqp::div_In doesn't give a closest Num ATM" <-- that's only in MoarVM AFAIK R#1782 | 13:36 | ||
synopsebot | R#1782 [open]: github.com/rakudo/rakudo/issues/1782 Rat.Num does not choose the closest representable Num | ||
13:36
Zoffix left
13:37
brrt joined
|
|||
lizmat | on that matter: www.reddit.com/r/perl/comments/93d...cobol_nor/ | 13:41 | |
I guess that's because it switches to float there as well | |||
timotimo | yeah, you need FatRat for that | 13:42 | |
i can write that there | |||
lizmat | timotimo: What kind of QAST::Var do I need to make to be able to do a nqp::assign_i on it ? | 13:44 | |
timotimo | needs to be :scope<lexicalref> or :scope<localref> if that exists | 13:45 | |
lizmat | would that make sense to use instead of nqp::bind in the for ^100 loop optimization ? | ||
timotimo | you'd have to be careful that it only allocates the lexicalref once and assigns into it over and over | 13:46 | |
rather than building a new one every time | |||
lizmat | so not specify scope<localref> all the time ? | ||
timotimo | i don't remember if localref actually exists %) | 13:47 | |
lizmat | will find out soon enough :-) | 13:48 | |
timotimo | there's tests for this stuff in the nqp repository, they are based on QAST trees directly, so you can perhaps steal a bit from there | ||
lizmat | there is no localref | ||
timotimo | OK! | 13:49 | |
brrt | Zoffix: I know that all to be true. I would not be saying this lightly | 13:59 | |
timotimo | we're screwed for sure? | ||
brrt | and fwiw; I was very much thinking of things like a container in every data structure, moreso than containers for every scalars | ||
those are impossible to eliminate | 14:00 | ||
timotimo | ah | ||
brrt | Frankly, I understand Zoffix's point fully | ||
timotimo | i'd say, if you want more performance, you can replace hashes with objects, and then you don't have scalars there any more | ||
brrt | I don't *have* to have scalars anymore, no | ||
but i'd better be very vigilant lest they are introduced by accident | 14:02 | ||
14:11
zakharyas left,
zakharyas joined
14:16
zakharyas left
|
|||
brrt | fwiw, I'm not trying to be negative here | 14:17 | |
lizmat | brrt: it does come across that way :-( | 14:24 | |
brrt | Hmm | 14:37 | |
I want to apologize for that. It was my aim to be productive | 14:38 | ||
timotimo | always possible to write a slang that automatically makes every code written in it use binding and not produce scalars | ||
at least i think that could be possible? | |||
brrt | what happens when that slang encounters code written that does not use this? | ||
lizmat | or something that would export a macro that would do that ? | ||
brrt | There is a bit much in the way of semantic differences to safely do that | 14:39 | |
Anyway, I'm fully aware that what I'd propose would be a Breaking Change. So the benefit would have to be great enough to overcome that objection | 14:41 | ||
And obviously I can't prove that the benefit would be that great | |||
Not without first implementing it | |||
On the other hand, we do have NQP, and we know that NQP programs are considerably faster than perl6 programs | 14:42 | ||
NQP can go head-to-head with virtually all dynamic programming languages and come out well, performance wise | 14:44 | ||
well, maybe not against luajit or v8, but you get what I mean | |||
*especially* when we do get to use native types, which *just work* in nqp | 14:52 | ||
lizmat | fwiw, if we could get the startup time of Rakudo down to ~ 20 msecs, that would also be of great help | 14:58 | |
it's now 130+ msecs on my machine | |||
14:59
brrt left
|
|||
diakopter | I didn't follow what brrt's Breaking Change proposal was | 15:29 | |
lizmat | getting rid of = in favour of := | 15:31 | |
or: get rid of containers | |||
15:33
Kaiepi left,
Kaiepi joined
|
|||
diakopter | I'd be curious if anyone could actually notice any meaningful difference in the semantics of the language's major features if that was enacted... or, more practically, what kinds of typical programming idioms would look different or would be thereafter impossible | 15:36 | |
mst | I experimented with using := for everything but that made many things read-only | 15:37 | |
15:37
mst sets mode: -o mst
|
|||
mst | since I was explicitly trying to get single-assignment, that was fine for me | 15:37 | |
diakopter | ah yes, the readonly-ness sometimes uses non-containerness | 15:40 | |
15:42
ChanServ sets mode: +o diakopter,
diakopter sets mode: -o diakopter
15:50
domidumont left
15:59
brrt joined
|
|||
brrt | .tell mst you can always still rebind | 16:04 | |
yoleaux | brrt: I'll pass your message to mst. | ||
brrt | m: my $x := 42; $x := "Foo"; say $x; | ||
camelia | Foo | ||
16:05
Ven`` joined
|
|||
brrt | so not so much readonly, but non-containerised | 16:05 | |
16:06
zakharyas joined
|
|||
lizmat | brrt: how would you handle auto-vivification ? | 16:07 | |
m: my $a; dd $a; $a<foo> = 1; dd $a | |||
camelia | Any $a = Any Hash $a = ${:foo(1)} |
||
brrt | not entirely sure yet | 16:08 | |
maybe by compiler help | |||
lizmat | m: my %h; %h<foo><bar><baz> = 42; dd %h | ||
camelia | Hash %h = {:foo(${:bar(${:baz(42)})})} | ||
brrt | that is actually the easy one, the other one is harder :-) | 16:09 | |
lizmat | m: my %h; my $a := %h<foo><bar><baz>; dd %h; $a = 42; dd %h | 16:10 | |
camelia | Hash %h = {} Hash %h = {:foo(${:bar(${:baz(42)})})} |
||
16:13
Zoffix joined
|
|||
Zoffix | m: my @a = <a b c>, <y z y>; for @a { say .[1] ~ .[2] ~ .[0] } | 16:13 | |
camelia | bca zyy |
||
Zoffix | How would you handle this? | ||
lizmat | m: my $a = 42; my $b = 666; ($b,$a) = ($a,$b); dd $a, $b | 16:14 | |
camelia | Int $a = 666 Int $b = 42 |
||
Zoffix | m: my @a = <a b c>, <y z y>; for @a[0] { say .[1] ~ .[2] ~ .[0] } # this rather | ||
camelia | bca | ||
Zoffix | m: my @a = <a b c>, <y z y>; for flat @a { say .[1] ~ .[2] ~ .[0] } # or this | ||
camelia | bca zyy |
||
Zoffix | Or this: | 16:16 | |
m: sub foo (\z) { z = 42 }; foo my $x = 100; say $x | |||
camelia | 42 | ||
Zoffix | vs. | ||
m: sub foo (\z) { z = 42 }; foo my $x := 100; say $x | |||
camelia | Cannot modify an immutable Int (100) in sub foo at <tmp> line 1 in block <unit> at <tmp> line 1 |
||
brrt | that would get new syntax, and we wouldn't be passing bound containers, because by default you'd pass-by-value | ||
and so that would look like: | 16:17 | ||
sub foo (\$z) { \$z = 42; } | |||
or maybe with a star: | |||
Zoffix | ? | ||
brrt | sub foo($fz) { *$z = 42; } | ||
Zoffix | The control of whether write happens is at the callsite | ||
I don't get what the new syntax inside the sub solve with respect to that | 16:18 | ||
brrt | sub foo(\$z) { \$z = 42; } ; foo my \$x = 100; say $x; | ||
the point is; you'd get a new syntax for explicit references; you'd use that syntax wherever you'd otherwise use the implicit container-ness to write-by-reference | 16:19 | ||
Zoffix | So basically invent a new language? | 16:20 | |
brrt | I'm suggesting a hard fork, yes | ||
Zoffix | The `my $x =` was just a short example, it can easily be just a variable coming from elsewhere | ||
brrt | yes, and that's fine | ||
well, imho, having reference-assignment explicit and nondefault is a language win compared to the current situation | 16:21 | ||
Zoffix | And your hard fork will be what? Beta for the next 3 years until all the semantics are ironed out? | ||
I'm really shocked people are still proposing these pivotal changes. | |||
Changes to the very core of the language. | |||
lizmat | brrt: "I'm suggesting a hard fork, yes" seriously ??? | 16:22 | |
brrt | I am. So sue me | ||
I'm not shocked, I'm too old and jaded for that., but I am disappointed at the intensity of the reaction here | |||
Zoffix | Well, I'm not here to endlessly fuck around with the language just for the fun of it. I want people to use it. | ||
brrt | I want to use it as well. But I can't. Because it is too slow | 16:23 | |
lizmat | and that goes for me as well | ||
(and that was to Zoffix's answer) | |||
brrt: then maybe you should use another language that isn't too slow ? | 16:24 | ||
brrt | My experience is that whatever clever optimization that we do, we can improve performance by Nx (where N sits usually between 1 and 2, and sometimes between 1 and 10) for some common idiom | ||
16:24
robertle left
|
|||
brrt | I can and will have to, won't I? | 16:24 | |
lizmat | brrt: well, I'm not sure... | ||
timotimo | i think maybe we're working with different definitions of "hard fork" here? | 16:25 | |
lizmat | are you saying that the basic premise of being able to spesh / JIT / OSR the hell out of Perl 6 code, is flawed ? | ||
brrt | I do mean a change to the core language that would break existing programming languages, yes | ||
No, but I am saying that I believe - and would be happy to be proven wrong, don't get me wrong here, please - there are issues in the core language design, containers being the prime example I know of, that are nigh impossible to eliminate by downstream cleverness | 16:26 | ||
timotimo | it could be interesting to have some experimentation on the side | 16:27 | |
kind of like 007 | |||
how do you deal with reference-taking functions/methods and multi-ness? | |||
brrt | timotimo: example? | ||
timotimo | for multi subs you'll have everything available at the call site, usually, but not with methods | ||
well, you won't know whether a parameter will be taken as a reference by the callee or not | |||
will the caller mark that? | 16:28 | ||
brrt | there would be explicit syntax and a class | ||
e.g. there could be a multi sub foo(Reference $x) { ... } | |||
or 'Ref $x' | |||
timotimo | mhm | ||
Zoffix | brrt: as for intensity of the reaction: so far, I've seen jnthn, TimToady, and timotimo (above) being optimistic we can get decent performance. Now, the chief JIT architect is saying we have to renege on our promise of a "stable language" and essentially redesign the entire language, because it's impossible for us to get decent performance otherwise. | 16:29 | |
brrt | Hmmm | ||
So there's at least one point of difference between your perception and mine | 16:30 | ||
timotimo | how about we first build a suite of datastructures that do without containers at the cost of slightly different API | ||
brrt | I see myself as holding no authority whatever :-) | ||
timotimo: that's actually a nice idea | |||
timotimo | i.e. we won't be doing @foo[1] = 10, for example? | ||
lizmat | brrt: and they're, I think, you're giving yourself too little credit | ||
timotimo | instead, ask the user to do something akin to .ASSIGN-POS | ||
except prettier | |||
lizmat | *there | ||
brrt | hmm. I see. Then I want to stress that my pproposal was meant experimentally :-) | 16:31 | |
I like the idea of having a 'containerless' data structure API as a testing ground | 16:32 | ||
timotimo | you know, we're not terribly far from being able to inline the fetch and store methods of proxy objects into code that uses them | ||
i assume spesh plugins can do that | |||
brrt | Which will help; but there will still be the boxing, gc, dereference, etc. And those are still costly | 16:33 | |
timotimo | right, spesh will have to learn to eliminate these things | ||
i.e. we'll know that the proxy is being created and doesn't escape, so we'll only be calling the method, no more proxy allocation needed | 16:34 | ||
not sure what boxing and dereference you're refering to, i'd have to see code for that | |||
brrt | for a completely eliminated proxy, then yes, that will work | 16:35 | |
timotimo | oh, there'll have to be some cleverness around closures, though | 16:36 | |
we have some smarts for when the inlined code had a closure of the containing code; perhaps that can be generalized far enough here | |||
brrt | so, part of the reason i'm relatively pessimistic about that is, such optimization tend to work for 90% of the cases | ||
if we have a second optimizatoin that will only work if the first one works, it'll work on 81% of cases | 16:37 | ||
annd that multiplication is not in our favour | |||
timotimo | i've seen follow-up optimizations that tend to work in more than 90% of cases :P | ||
Zoffix | "brrt │ I want to use it as well. But I can't. Because it is too slow" | 16:38 | |
brrt: what would be considered not too slow? | |||
brrt | true enough | ||
perl5 would be acceptable. | |||
timotimo | to be fair, our regexps are really, really slow :) | 16:39 | |
i've been meaning to give JSON::Fast another performance pass | 16:42 | ||
brrt | my main worry is that the perl6 core devs are essentially writing another language than the users are supposed to use | 16:43 | |
timotimo | ah, you mean core devs are okay with knowing all the nooks and crannies that give better performance? | 16:45 | |
brrt | not only that; we rely on them | 16:46 | |
16:48
bisectable6 left
16:49
bisectable6 joined
16:51
zakharyas left
17:15
robertle joined
17:38
Ven`` left
17:47
brrt left
17:49
domidumont joined
17:54
domidumont left
18:18
Zoffix left
19:17
dogbert17 joined
19:19
zakharyas joined
20:29
Ven`` joined
20:33
zakharyas left
20:52
Ven`` left
20:58
Ven`` joined
21:16
robertle left
|
|||
timotimo | oh, interesting | 21:20 | |
so i was wondering why my simple Proxy example didn't trigger the assign spesh plugin | |||
since there wasn't a $ sigil to be found (i had code like makesproxy() = 5) it used p6store, which is more complex than p6assign, as it handles more different cases | |||
wouldn't terribly surprise me if we could win something by giving p6store a spesh plugin as well that sometimes just resolves to using the p6assign spesh plugin, too | 21:21 | ||
until then, i at least know how to trigger the spesh plugin for the proxy case, and maybe find out how to optimize that | |||
21:32
Ven` joined
21:35
Ven`` left
23:02
Ven` left
|