2026/05/21

Newest at the top

2026-05-21 16:24:39 +0000ashwinmathi(~ashwinmat@2600:1700:6070:b140:94cc:bfe5:92c2:f83b)
2026-05-21 16:21:23 +0000euphores(~SASL_euph@user/euphores) (Quit: Leaving.)
2026-05-21 16:00:03 +0000tnt1(~Thunderbi@user/tnt1) tnt1
2026-05-21 15:59:04 +0000Pozyomka(~pyon@user/pyon) (Read error: Connection reset by peer)
2026-05-21 15:51:53 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-05-21 15:49:33 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-05-21 15:47:39 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-05-21 15:44:56 +0000DigitteknohippieDigit
2026-05-21 15:43:13 +0000tnt1(~Thunderbi@user/tnt1) (Quit: tnt1)
2026-05-21 15:38:46 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-05-21 15:38:32 +0000Googulator(~Googulato@94-21-138-77.pool.digikabel.hu) (Ping timeout: 245 seconds)
2026-05-21 15:38:22 +0000lieven(~mal@ns2.wyrd.be) lieven
2026-05-21 15:36:37 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-05-21 15:35:17 +0000Googulator25(~Googulato@84-236-52-41.pool.digikabel.hu)
2026-05-21 15:30:32 +0000 <int-e> ah, we're on different trains of thought
2026-05-21 15:30:06 +0000 <int-e> right but truncating the payload wouldn't be a huge deal
2026-05-21 15:30:04 +0000 <jaror> So not insignificant if you have like <20 elements in the array
2026-05-21 15:29:28 +0000 <jaror> 1 extra word and the cards rounded up
2026-05-21 15:29:12 +0000 <jaror> Yeah, I just found that too
2026-05-21 15:28:55 +0000 <int-e> (compare StgMutArrPtrs and StgSmallMutArrPtrs at https://gitlab.haskell.org/ghc/ghc/-/blob/master/rts/include/rts/storage/Closures.h#L212 ff.)
2026-05-21 15:24:57 +0000 <int-e> That also means that you can't convert an Array# into a SmallArray# in constant time. Boo.
2026-05-21 15:24:48 +0000chele(~chele@user/chele) (Remote host closed the connection)
2026-05-21 15:24:12 +0000 <int-e> Oh, maybe there is an extra word. It stores the number of pointers and the total size of the payload rather than computing the size on demand.
2026-05-21 15:23:53 +0000ricardomaps(~ricardoma@2804:14d:a040:81ea:6ecf:3924:2ebb:64d6)
2026-05-21 15:23:41 +0000 <jaror> ah
2026-05-21 15:23:36 +0000 <c_wraith> but they are going to round the byte count up to the nearest full word
2026-05-21 15:23:09 +0000 <int-e> Why 1 word? There is no extra pointer for this.
2026-05-21 15:21:54 +0000merijn(~merijn@77.242.116.146) (Ping timeout: 248 seconds)
2026-05-21 15:21:36 +0000Square2(~Square4@user/square) Square
2026-05-21 15:21:34 +0000 <int-e> Huh, so it's way less than 1.6% for large arrays, more like 0.1%
2026-05-21 15:21:33 +0000 <jaror> yeah, so for smaller sizes it definitely doesn't make sense to use Array#, but then also the overhead is 1 word + 1 byte per 128 items?
2026-05-21 15:20:33 +0000 <int-e> "Each byte in the card table for an StgMutaArrPtrs covers [128] elements in the array."
2026-05-21 15:19:03 +0000 <jaror> Oh or is that only saying that the cards track 128 items of the list at a time?
2026-05-21 15:17:42 +0000 <jaror> or 128+...?
2026-05-21 15:17:34 +0000 <jaror> is it always 128 bytes? or 128 bytes per entry?
2026-05-21 15:17:29 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 250 seconds)
2026-05-21 15:17:15 +0000 <jaror> the primitive docs say: The card size is 128, so for uses much larger than that, Array would likely be superior.
2026-05-21 15:17:03 +0000 <jaror> How much overhead is it exactly, by the way
2026-05-21 15:16:07 +0000merijn(~merijn@77.242.116.146) merijn
2026-05-21 15:15:42 +0000 <int-e> (Of course the overhead is larger, relatively speaking, for small arrays, because you'll have a full word of card table even if the array has just one or three entries)
2026-05-21 15:15:21 +0000 <jaror> But I definitely also think unboxed arrays deserve a better API
2026-05-21 15:14:47 +0000 <jaror> s/are/should be/
2026-05-21 15:13:36 +0000 <jaror> I think small arrays are very common and it is unwieldy to have to switch between Array and SmallArray
2026-05-21 15:12:24 +0000 <int-e> If you care about the 1.6% wasted memory but are fine with the overhead of having pointers/thunks.
2026-05-21 15:12:10 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-05-21 15:09:39 +0000 <jaror> So if you use an array mostly immutably, you should go for SmallArray# is my conclusion.
2026-05-21 15:09:39 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-05-21 15:08:22 +0000 <jaror> ah that makes sense
2026-05-21 15:07:37 +0000 <int-e> somewhere in the middle of this is https://gitlab.haskell.org/ghc/ghc/-/blob/master/rts/Updates.h#L489
2026-05-21 15:07:00 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life