<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: ot</title><link>https://news.ycombinator.com/user?id=ot</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 11 Apr 2026 08:08:38 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=ot" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by ot in "Meta’s renewed commitment to jemalloc"]]></title><description><![CDATA[
<p>That's a false dichotomy: you optimize both the application <i>and</i> the allocator.<p>A 0.5% improvement may not be a lot to you, but at hyperscaler scale it's well worth staffing a team to work on it, with the added benefit of having people on hand that can investigate subtle bugs and pathological perf behaviors.</p>
]]></description><pubDate>Tue, 17 Mar 2026 06:48:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=47409434</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47409434</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47409434</guid></item><item><title><![CDATA[New comment by ot in "Meta’s renewed commitment to jemalloc"]]></title><description><![CDATA[
<p>It's not just that zeroing got cheaper, but also we're doing a lot less of it, because jemalloc got much better.<p>If the allocator returns a page to the kernel and then immediately asks back for one, it's not doing its job well: the main purpose of the allocator is to cache allocations from the kernel. Those patches are pre-decay, pre-background purging thread; these changes significantly improve how jemalloc holds on to memory that might be needed soon. Instead, the zeroing out patches optimize for the pathological behavior.<p>Also, the kernel has since exposed better ways to optimize memory reclamation, like MADV_FREE, which is a "lazy reclaim": the page stays mapped to the process until the kernel actually need it, so if we use it again before that happens, the whole unmapping/mapping is avoided, which saves not only the zeroing cost, but also the TLB shootdown and other costs. And without changing any security boundary. jemalloc can take advantage of this by enabling "muzzy decay".<p>However, the drawback is that system-level memory accounting becomes even more fuzzy.<p>(hi Alex!)</p>
]]></description><pubDate>Tue, 17 Mar 2026 06:46:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=47409412</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47409412</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47409412</guid></item><item><title><![CDATA[New comment by ot in "The “JVG algorithm” only wins on tiny numbers"]]></title><description><![CDATA[
<p>RSA was also not given that name by its authors, the name came later, which is usually the case.<p>In the original paper they do not give it any name: <a href="https://people.csail.mit.edu/rivest/Rsapaper.pdf" rel="nofollow">https://people.csail.mit.edu/rivest/Rsapaper.pdf</a></p>
]]></description><pubDate>Tue, 10 Mar 2026 02:11:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=47318353</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47318353</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47318353</guid></item><item><title><![CDATA[New comment by ot in "RE#: how we built the fastest regex engine in F#"]]></title><description><![CDATA[
<p>Here RE2 does not fall back to the NFA, it just resets the Lazy DFA cache and starts growing it again. The latency spikes I was mentioning are due to the cost of destroying the cache (involving deallocations, pointer chasing, ...)</p>
]]></description><pubDate>Mon, 09 Mar 2026 21:20:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=47315703</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47315703</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47315703</guid></item><item><title><![CDATA[New comment by ot in "RE#: how we built the fastest regex engine in F#"]]></title><description><![CDATA[
<p>> are there eviction techniques to guard against this?<p>RE2 resets the cache when it reaches a (configurable) size limit. Which I found out the hard way when I had to debug almost-periodic latency spikes in a service I managed, where a very inefficient regex caused linear growth in the Lazy DFA, until it hit the limit, then all threads had to wait for its reset for a few hundred milliseconds, and then it all started again.<p>I'm not sure if dropping the whole cache is the only feasible mitigation, or some gradual pruning would also be possible.<p>Either way, if you cannot assume that your cache grows monotonically, synchronization becomes more complicated: the trick mentioned in the other comment about only locking the slow path may not be applicable anymore. RE2 uses RW-locking for this.</p>
]]></description><pubDate>Mon, 09 Mar 2026 01:39:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=47303831</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47303831</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47303831</guid></item><item><title><![CDATA[Generate evolving textures by blending images]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/apresta/undula">https://github.com/apresta/undula</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47276180">https://news.ycombinator.com/item?id=47276180</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 06 Mar 2026 15:31:02 +0000</pubDate><link>https://github.com/apresta/undula</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47276180</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47276180</guid></item><item><title><![CDATA[Apache Iggy's migration to thread-per-core architecture powered by io_uring]]></title><description><![CDATA[
<p>Article URL: <a href="https://iggy.apache.org/blogs/2026/02/27/thread-per-core-io_uring/">https://iggy.apache.org/blogs/2026/02/27/thread-per-core-io_uring/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47215597">https://news.ycombinator.com/item?id=47215597</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 02 Mar 2026 09:25:38 +0000</pubDate><link>https://iggy.apache.org/blogs/2026/02/27/thread-per-core-io_uring/</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47215597</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47215597</guid></item><item><title><![CDATA[New comment by ot in "Read Locks Are Not Your Friends"]]></title><description><![CDATA[
<p>This is drawing broad conclusions from a specific RW mutex implementation. Other implementations adopt techniques to make the readers scale linearly in the read-mostly case by using per-core state (the drawback is that write locks need to scan it).<p>One example is folly::SharedMutex, which is very battle-tested: <a href="https://uvdn7.github.io/shared-mutex/" rel="nofollow">https://uvdn7.github.io/shared-mutex/</a><p>There are more sophisticated techniques such as RCU or hazard pointers that make synchronization overhead almost negligible for readers, but they generally require to design the algorithms around them and are not drop-in replacements for a simple mutex, so a good RW mutex implementation is a reasonable default.</p>
]]></description><pubDate>Wed, 25 Feb 2026 12:39:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=47150745</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=47150745</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47150745</guid></item><item><title><![CDATA[New comment by ot in "Every book recommended on the Odd Lots Discord"]]></title><description><![CDATA[
<p>Glad that Moby Dick is in there.</p>
]]></description><pubDate>Mon, 09 Feb 2026 13:15:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=46944872</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46944872</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46944872</guid></item><item><title><![CDATA[The Anthropic Hive Mind]]></title><description><![CDATA[
<p>Article URL: <a href="https://steve-yegge.medium.com/the-anthropic-hive-mind-d01f768f3d7b">https://steve-yegge.medium.com/the-anthropic-hive-mind-d01f768f3d7b</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=46934590">https://news.ycombinator.com/item?id=46934590</a></p>
<p>Points: 4</p>
<p># Comments: 1</p>
]]></description><pubDate>Sun, 08 Feb 2026 14:41:30 +0000</pubDate><link>https://steve-yegge.medium.com/the-anthropic-hive-mind-d01f768f3d7b</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46934590</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46934590</guid></item><item><title><![CDATA[Designing AI resistant technical evaluations]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.anthropic.com/engineering/AI-resistant-technical-evaluations">https://www.anthropic.com/engineering/AI-resistant-technical-evaluations</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=46733759">https://news.ycombinator.com/item?id=46733759</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 23 Jan 2026 15:37:32 +0000</pubDate><link>https://www.anthropic.com/engineering/AI-resistant-technical-evaluations</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46733759</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46733759</guid></item><item><title><![CDATA[New comment by ot in "A 40-line fix eliminated a 400x performance gap"]]></title><description><![CDATA[
<p>> Presumably you mean you just double check the page value after the rdtsc to make sure it hasn't changed and retry if it has?<p>Yes, that's exactly what a seqlock (reader) is.</p>
]]></description><pubDate>Thu, 15 Jan 2026 17:08:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=46635673</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46635673</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46635673</guid></item><item><title><![CDATA[New comment by ot in "A 40-line fix eliminated a 400x performance gap"]]></title><description><![CDATA[
<p>Yes you need some lazy setup in thread-local state to use this. And short-lived threads should be avoided anyway :)</p>
]]></description><pubDate>Wed, 14 Jan 2026 01:05:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=46610998</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46610998</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46610998</guid></item><item><title><![CDATA[New comment by ot in "A 40-line fix eliminated a 400x performance gap"]]></title><description><![CDATA[
<p>You can do even faster, about 8ns (almost an additional 10x improvement) by using software perf events: PERF_COUNT_SW_TASK_CLOCK is thread CPU time, it can be read through a shared page (so no syscall, see perf_event_mmap_page), and then you add the delta since the last context switch with a single rdtsc call within a seqlock.<p>This is not well documented unfortunately, and I'm not aware of open-source implementations of this.<p>EDIT: Or maybe not, I'm not sure if PERF_COUNT_SW_TASK_CLOCK allows to select only user time. The kernel can definitely do it, but I don't know if the wiring is there. However this definitely works for overall thread CPU time.</p>
]]></description><pubDate>Wed, 14 Jan 2026 00:53:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=46610886</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46610886</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46610886</guid></item><item><title><![CDATA[New comment by ot in "A 40-line fix eliminated a 400x performance gap"]]></title><description><![CDATA[
<p>If you look below the vDSO frame, there is still a syscall. I think that the vDSO implementation is missing a fast path for this particular clock id (it could be implemented though).</p>
]]></description><pubDate>Wed, 14 Jan 2026 00:48:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=46610846</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46610846</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46610846</guid></item><item><title><![CDATA[New comment by ot in "Swapping two blocks of memory inside a larger block, in constant memory"]]></title><description><![CDATA[
<p>That's probably true for small primitive types, but if your objects are expensive to move (like a large struct) it might be beneficial to minimize swaps.</p>
]]></description><pubDate>Tue, 06 Jan 2026 17:01:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=46514936</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46514936</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46514936</guid></item><item><title><![CDATA[New comment by ot in "Over 600 job openings at Apple for Vision Pro"]]></title><description><![CDATA[
<p>Yeah, was just about to edit the comment :)</p>
]]></description><pubDate>Mon, 05 Jan 2026 16:42:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=46501048</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46501048</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46501048</guid></item><item><title><![CDATA[New comment by ot in "Over 600 job openings at Apple for Vision Pro"]]></title><description><![CDATA[
<p>The query is incorrect, it will return any posting that contains the words "vision" and "pro", not necessarily consecutive.<p>It looks like phrasal search is supported, searching "vision pro" in quotes only returns 212 results worldwide<p><a href="https://jobs.apple.com/en-us/search?search=%22vision+pro%22&sort=relevance" rel="nofollow">https://jobs.apple.com/en-us/search?search=%22vision+pro%22&...</a><p>Spot-checked a few and they all seem to be Vision Pro related.<p>--<p>EDIT: Actually even this is not accurate, as it matches postings with sentences like<p>> Fundamental to the success of iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and Mac ...<p>but not specific to Vision Pro.<p>However we can filter on products and services for Vision Pro and visionOS, and it gives 106 results:<p><a href="https://jobs.apple.com/en-us/search?search=%22vision+pro%22&sort=relevance&product=apple-vision-pro-AVPRO+visionos-VISOS" rel="nofollow">https://jobs.apple.com/en-us/search?search=%22vision+pro%22&...</a></p>
]]></description><pubDate>Mon, 05 Jan 2026 16:38:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=46500982</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46500982</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46500982</guid></item><item><title><![CDATA[New comment by ot in "Trying Out C++26 Executors"]]></title><description><![CDATA[
<p>> can avoid or defer a lot of the expected memory allocations of async operations<p>Is this true in realistic use cases or only in minimal demos? From what I've seen, as soon as your code is complex enough that you need two compilation units, you need some higher level async abstraction, like coroutines.<p>And as soon as you have coroutines, you need to type-erase both the senders and the scheduler, so you have at least couple of allocations per continuation.</p>
]]></description><pubDate>Wed, 03 Dec 2025 11:16:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=46133156</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46133156</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46133156</guid></item><item><title><![CDATA[New comment by ot in "Mistral 3 family of models released"]]></title><description><![CDATA[
<p>Is it so hard for people to understand that Europe is a continent, EU is a federation of European countries, and the two are not the same?</p>
]]></description><pubDate>Tue, 02 Dec 2025 15:49:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=46122427</link><dc:creator>ot</dc:creator><comments>https://news.ycombinator.com/item?id=46122427</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46122427</guid></item></channel></rss>