<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: 14113</title><link>https://news.ycombinator.com/user?id=14113</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 21 Oct 2026 10:25:17 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=14113" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by 14113 in "Ofcom concedes defeat in 4chan case"]]></title><description><![CDATA[
<p>Utter rubbish. Civil servants can't get anything done because they are chronically underfunded, and yanked around by the whims of the government of the day. Dominic Cummings' is not a reliable source either - he's ideologically at odds with the idea of government _doing_ anything, and because of that has caused a great deal of harm to the UK.</p>
]]></description><pubDate>Tue, 20 Oct 2026 18:47:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=50170852</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=50170852</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50170852</guid></item><item><title><![CDATA[New comment by 14113 in "Faster floating point math with Rust's new API"]]></title><description><![CDATA[
<p>Yes, I was being a bit concise: Individual optimisations should be turned on as determined by profiling, application semantics, etc. My point was more that if you want to get as close as possible between integer and floating-point, then there is a flag that does it. That doesn't mean that you <i>should</i> do it, however...</p>
]]></description><pubDate>Tue, 11 Aug 2026 18:50:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=49262798</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=49262798</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49262798</guid></item><item><title><![CDATA[New comment by 14113 in "Faster floating point math with Rust's new API"]]></title><description><![CDATA[
<p>> Floating point math is often slower than integer math because the compiler is being conservative about how it optimizes your code.<p>It's not strictly true to say that it's "being conservative". What is more correct is to say that floating point operations have different semantics to integer operations, and an optimisation that retains the semantics of an expression over integers may not do so when applied to an expression over integers. Hence, it may be possible to apply one optimisation to an integer expression, but applying that to a floating-point expression may result in a different program meaning.<p>C/C++ compilers give you a way out of this with the `--ffast-math` flag, which essentially allows compilers to relax the constraints on floating-point optimisation passes.<p>For an example of how this works in GCC, take a look here: <a href="https://gcc.gnu.org/wiki/FloatingPointMath" rel="nofollow">https://gcc.gnu.org/wiki/FloatingPointMath</a></p>
]]></description><pubDate>Tue, 11 Aug 2026 12:51:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=49257490</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=49257490</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49257490</guid></item><item><title><![CDATA[New comment by 14113 in "Nvidia’s Vera Whitepaper Has a Thread Loose"]]></title><description><![CDATA[
<p>Seconding this - having worked on LLVM and Firefox, the performance tuning of each application was very different. Even measuring the performance of an application like Firefox (in a meaningful way) is non-trivial, wheras compilers are much more approachable with traditional profilers (either tracing or sampling).</p>
]]></description><pubDate>Thu, 06 Aug 2026 09:01:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=49194261</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=49194261</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49194261</guid></item><item><title><![CDATA[New comment by 14113 in "Nvidia’s Vera Whitepaper Has a Thread Loose"]]></title><description><![CDATA[
<p>I mildly disagree - depending on your definition of "typical app". Most applications have much greater use of multi-processing and concurrent cross-thread (or cross-process) communication. Compilers, aside from high-level parallelism across modules, tend to be quite single-threaded applications.<p>If you're solely interested in single-core performance, then I would agree that they are a good stress test, but I think for a processor that is being sold on it's parallelism, they are not a great benchmark.</p>
]]></description><pubDate>Thu, 06 Aug 2026 08:59:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=49194239</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=49194239</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49194239</guid></item><item><title><![CDATA[New comment by 14113 in "Since Chromium 148, Math.tanh is now fingerprintable to link underlying OS"]]></title><description><![CDATA[
<p>> I feel like this is with 2026 view where browsers are so mutually compatible.<p>I wish this was the case. Unfortunately, companies that work on non-Chromium browsers need to employ dedicated web compatibility teams to either a) help website users fix non-standard (i.e. Chrome only) HTML/CSS/JS, or b) replicate Chromium-like behaviour for specific (very popular) websites so that they work "correctly".<p>There's also the websites that deliberately block certain browsers which is what tools like "chrome-mask"[1] are built to solve.<p>[1] <a href="https://addons.mozilla.org/en-GB/firefox/addon/chrome-mask/" rel="nofollow">https://addons.mozilla.org/en-GB/firefox/addon/chrome-mask/</a></p>
]]></description><pubDate>Mon, 13 Jul 2026 00:15:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=48886292</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48886292</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48886292</guid></item><item><title><![CDATA[New comment by 14113 in "Nvidia, CoreWeave, and Nebius: Inside the Circular Financing of the GPU Boom"]]></title><description><![CDATA[
<p>There are two types of people. Those who can extrapolate from incomplete data, and</p>
]]></description><pubDate>Sat, 11 Jul 2026 21:59:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48876256</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48876256</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48876256</guid></item><item><title><![CDATA[New comment by 14113 in "Your code is fast if you're lucky"]]></title><description><![CDATA[
<p>To me, the parentheses make it significantly easier to read. They make it clear which operator directly acts on the variable, and create a mental meta-object to which the next operator acts.<p>I accept that if you're extremely used to writing this style of C code, it might be something that you're used to, and understand implicitly. As a C++ engineer that infrequently comes across this precise pattern, having the precedence made explicit makes it much easier to understand.</p>
]]></description><pubDate>Sat, 11 Jul 2026 21:58:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=48876246</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48876246</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48876246</guid></item><item><title><![CDATA[New comment by 14113 in "Your code is fast if you're lucky"]]></title><description><![CDATA[
<p>As I experienced while trying to write out an AST for this pattern, the operator precedence makes it harder to read. I would at least prefer that it's written as *(foo++).</p>
]]></description><pubDate>Sat, 11 Jul 2026 15:52:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=48873104</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48873104</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48873104</guid></item><item><title><![CDATA[New comment by 14113 in "Your code is fast – if you're lucky"]]></title><description><![CDATA[
<p>Oops, you're right - I got the operators the wrong way around! I forget the precise precedence of * and ++ in C sometimes. Assuming that it would be bracketed as *(lwr++),  it should actually be:<p><pre><code>  block
    statement (assignment)
      expression
        operator (dereference)
          operator (post-increment)
            variable
      expression
        variable</code></pre></p>
]]></description><pubDate>Sat, 11 Jul 2026 15:49:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=48873070</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48873070</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48873070</guid></item><item><title><![CDATA[New comment by 14113 in "Your code is fast – if you're lucky"]]></title><description><![CDATA[
<p>Representing code in a compiler is not precisely trivial, and the two statements are actually quite different from a compiler or AST perspective. Just looking at the first branch:<p><pre><code>  *lwr = x; lwr++;
</code></pre>
This could be be represented with something like this (and this is a very vague approximation of an AST):<p><pre><code>  block
    statement (assignment)
      expression
        operator (dereference)
          variable
      expression
        variable
    statement
      expression
        operator (post-increment)
          variable
</code></pre>
The second form, that looks this in the source:<p><pre><code>  *lwr++ = x
</code></pre>
might look like this in the AST:<p><pre><code>  block
    statement (assignment)
      expression
        operator (post-increment)
          operator (dereference)
            variable
      expression
        variable
 
</code></pre>
If these two ASTs are to take the same form in the compilation pipeline, there needs to be some kind of pass that transforms one into the other.<p>As for why the second form is faster (or rather, why the compiler can generate faster code): There is likely an optimisation pass somewhere in llvm that recognises a pattern that this fits into, which allows it to generate branchless instructions. For instance, in the second form, there is a pattern of:<p><pre><code>  operator (post-increment)
    operator (dereference)
</code></pre>
that might be recognised by a pass. In the former form, the two operators are far apart in the tree, so a pass would have to "look further" to match them up. A single pass likely won't do this, either for (compiler) performance reasons, or for correctness reasons.<p>Finding which pass that is can be non-trivial, as it's more than a matter of enabling individual passes until one works. It might be that an earlier pass does some code reshaping that allows the relevant pass to work. My suggestion would be to dump the llvm ir at the end, and find the rough pattern that you're looking for, then re-run the compilation with `-mllvm -print-after-all` to see what the IR looks like after each pass, and then manually "look back" until you can't see the pattern any more.</p>
]]></description><pubDate>Sat, 11 Jul 2026 15:11:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=48872729</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48872729</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48872729</guid></item><item><title><![CDATA[New comment by 14113 in "Rewriting Bun in Rust"]]></title><description><![CDATA[
<p>Passing by pointer (in C) reduced the difference a lot, but swapping the order of Add and Int in the Rust enum was enough to reduce the different to:<p><pre><code>  cmp ecx, 1
  je .LBB0_3
</code></pre>
vs<p><pre><code>  cmp ecx, 2
  jne .LBB0_2
</code></pre>
LBB0_3 and LBBO_2 were the same in both outputs (up to alpha renaming).<p>Oddly, both sources seemed to be quite sensitive to match switch and enum reordering, resulting in very different generated code. Possibly something to look into further.</p>
]]></description><pubDate>Thu, 09 Jul 2026 11:01:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=48843909</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48843909</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48843909</guid></item><item><title><![CDATA[New comment by 14113 in "Rewriting Bun in Rust"]]></title><description><![CDATA[
<p>It required a little bit of messing with optimisation settings and library generation in Rust, but they emit very very similar x86-64 assembly:<p><a href="https://godbolt.org/z/89W4srz4d" rel="nofollow">https://godbolt.org/z/89W4srz4d</a></p>
]]></description><pubDate>Thu, 09 Jul 2026 00:01:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48839106</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48839106</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48839106</guid></item><item><title><![CDATA[New comment by 14113 in "How do wombats poop cubes? (2021)"]]></title><description><![CDATA[
<p>My understanding is that churches were built next to yew trees, not yew trees planted next to churches.<p>Pre-Christian religions had many associations with yew trees (they live for a long time, give off mildly hallucinogenic gasses on hot days, discourage animals), and so built their holy sites around them. When Christianity came to Britain, churches were deliberately built on pagan holy sites to overrun the old religions, in the same way that early Christianity took over roman holy days (Saturnalia -> Christmas, Lemuria -> All Saint's Day). This led to churches being built next to sites with copious yew trees.</p>
]]></description><pubDate>Thu, 02 Jul 2026 09:41:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=48758838</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48758838</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48758838</guid></item><item><title><![CDATA[New comment by 14113 in "We Don't Have to Be This Bad at Improving Society"]]></title><description><![CDATA[
<p>The fundamental issue with this is that many problems have a time/energy/financial threshold for success. Trying to tackle such a problem with incremental iterative solutions will consistently fail, as each individual iteration will fail.<p>This is most obvious when network effects are present (e.g. local immunisation efforts vs country-wide immunisation), but it's surprisingly common in other government-related areas like welfare, childcare, social security etc.<p>Edit: Another comment has reminded me that affordable public transport is the perfect example of this: Incrementally building out a public transport system will almost always fail, as the initial lines (be they buses, light rail, etc) will typically not be successful enough to justify the cost of building the line. If, instead, a system is built out universally and simultaneously, the utility (and thus income) of each line increases due to the interconnected nature of the network.</p>
]]></description><pubDate>Thu, 02 Jul 2026 09:26:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=48758730</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48758730</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48758730</guid></item><item><title><![CDATA[New comment by 14113 in "Plotnine"]]></title><description><![CDATA[
<p>Because, in the latter case, you have to declare a function argument for /every possible option/ that you want your graphics API to expose, and you need to do this every time you add a new option.<p>On the other hand, declaring the options through composition means that the API for "plot" remains static, and adding/removing options can be done trivially without an API change.<p>Composition (rather than parameters) is also more flexible. Let's say you want to divide your plot into three sub-plots, two of which are 200x200, and another which is 200x400. How do you express this as a keyword parameter? In composition, you could do something like:<p>plot( ggsubplot(ggvsplit(ggsize(200,400), gghsplit(ggsize(200,200), ggsize(200,200)))) )</p>
]]></description><pubDate>Tue, 23 Jun 2026 14:07:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=48645210</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48645210</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48645210</guid></item><item><title><![CDATA[New comment by 14113 in "StarFighter 16-Inch"]]></title><description><![CDATA[
<p>Incorrect: Star Labs have been shipping laptops since 2018, before Framework was even a company.</p>
]]></description><pubDate>Wed, 06 May 2026 15:12:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=48037190</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48037190</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48037190</guid></item><item><title><![CDATA[New comment by 14113 in "StarFighter 16-Inch"]]></title><description><![CDATA[
<p>Star Labs have delivered a number of other high quality linux laptops - I even used one as my daily work driver for a few years at a previous job. They're not a startup.</p>
]]></description><pubDate>Wed, 06 May 2026 15:08:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=48037151</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=48037151</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48037151</guid></item><item><title><![CDATA[New comment by 14113 in "How the AI Bubble Bursts"]]></title><description><![CDATA[
<p>> companies are supposed to lose money while they grow<p>At what point do we declare that a company has "grown" and now must make money? OpenAI is a multi-billion dollar company right now, surely that's a point at which they should be profitable, instead of propped up by further investment and borrowing.<p>> We have very strong indicators that inference is not a money loser for these companies<p>All of the economic analysis that I've read strongly states the opposite. Running a GPU is a net loss /even for the data centre operators/. For them to break even, they currently charge OpenAI/Anthropic/Etc more than OpenAI/Anthropic/Etc make per-token.</p>
]]></description><pubDate>Mon, 30 Mar 2026 13:42:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47574223</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=47574223</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47574223</guid></item><item><title><![CDATA[New comment by 14113 in "Nominal Types in WebAssembly"]]></title><description><![CDATA[
<p>This post is actually a joke, but it does bring about an important point: For an interpreter, having <i>more</i> information results in faster execution. WASM is much closer to Java bytecode than you might think, and SpiderMonkey/V8 are basically the JVM. WASM also undergoes multiple different stages and kinds of JIT compilation in most browsers, and detailed type and usage information helps that produce faster execution.<p>Also, don't forget that WASM is designed to replace JavaScript, thus it must interoperate with it to smooth the transition. Rosetta and Prism also work to smooth the transition from x86 -> ARM, and much of the difficult work that they do actually involves translating between the calling conventions of the different architectures, and making them work across binaries compiled both for and not for ARM, not with the bytecode translation. WebAssembly is designed to not have that limitation: it's much more closely aligned to JS. That's why it wouldn't make sense to use a subset of x86 or similar, as it would simply produce more work trying to get it to interface with JavaScript.</p>
]]></description><pubDate>Sat, 14 Mar 2026 18:38:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=47379705</link><dc:creator>14113</dc:creator><comments>https://news.ycombinator.com/item?id=47379705</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47379705</guid></item></channel></rss>