Hacker News

Best stories

Live mirror
30 storiesupdated just nowView source snapshot
  1. Show HN: An e-ink frame that hears birds and draws them as 1800s illustrations(github.com/arnegiacomo ↗)
    245comments
  2. Introducing System One Models and Jev(typesafe.ai ↗)
    481comments
  3. Nvidia announces native GPU programming in Rust(nvidia.com ↗)
    308comments
  4. An update on Wayback Machine access(blog.archive.org ↗)
    354comments
  5. EU chief opens door for Canada to become 'associate member'(bbc.com ↗)
    857comments
  6. Training a 4B model to produce 81% faster query plans than Postgres(rohanbansal.com ↗)
    121comments
  7. Mistral X Mozilla: Private, Multilingual AI Browsing(mistral.ai ↗)
    195comments
  8. Small programming tricks(will-keleher.com ↗)
    251comments
  9. Hackers Got Inside a Flock Camera(wired.com ↗)
    245comments
  10. Apple Reference Image: A New Approach for Verified Photography(security.apple.com ↗)
    343comments
  11. Gemini 3.8 Live and 3.8 Live Extended Thinking(blog.google ↗)
    324comments
  12. Why I'm still bearish on LLMs after Navier-Stokes(dank.systems ↗)
    628comments
  13. Xiaomi Mimo 2.6 live post-training dashboard(xiaomi.com ↗)
    134comments
  14. AWS says it can't restore some data from mideast facilities struck by Iran(wsj.com ↗)
    374comments
  15. Building a Linux GPU Driver for the M4 Mac Mini in One Month(codyho.dev ↗)
    275comments
  16. Show HN: Capsule – Single-file web apps that save their data into SQLite(withcapsule.app ↗)
    159comments
  17. The Google Play app review process now regularly takes longer than a week(gultsch.social ↗)
    339comments
  18. Java 27(openjdk.org ↗)
    425comments
  19. Israeli Minister Threatens Filmmakers' Citizenship over Gaza Documentary(reutersconnect.com ↗)
    87comments
  20. We got admin access to Baseten's production GitHub(strix.ai ↗)
    184comments
  21. PS5 Linux lead quits: "a bunch of noobs using LLMs" that "they don't understand"(frvr.com ↗)
    218comments
  22. America's Driver's License Breach Is a National Security Disaster(lawfaremedia.org ↗)
    201comments
  23. Performance Improvements in .NET 11(devblogs.microsoft.com/dotnet ↗)
    82comments
  24. Tell the speakers that you liked their talks(ohhelloana.blog ↗)
    85comments
  25. German Rheinmetall open-sources its Battlesuite connected weapon system protcol(rheinmetall.github.io ↗)
    107comments
  26. Original Sony PlayStation 2 security chip 'broken wide open' after 26 years(tomshardware.com ↗)
    83comments
  27. Salesforce Global Outage(salesforce.com ↗)
    181comments
  28. Backups Aren't Simple(filipovski.net ↗)
    169comments
  29. Learning Programming in an Age of LLMs(ploeh.dk ↗)
    185comments
  30. There's a 100% Chance AI Agents Are Ruining the Internet(404media.co ↗)
    168comments

Performance Improvements in .NET 11

309 pointsby 2d agodevblogs.microsoft.com
82 comments
1d agoHN ↗

Ah the traditional browser stress test from the .NET team. :)

Joke aside, yet another interesting read of all little improvements that go across all the runtime, and very much appreciated that they put out the effort to go through this detail level.

1d agoHN ↗

Thanks Stephen for this, it is very rewarding to read something very technical that is not AI slop these days.

1d agoHN ↗

Runtime async is certainly an interesting development. Really excited to see how this plays out.

14h agoHN ↗

Spinal Tap's "put it up to 11". My laptop (Kubuntu) has volume controls that allow me to override 100% and take it to 150%.

I can wind it up to 15! \||/ (is there an official ASCII art four finger devil's horns)

13h agoHN ↗

I stared at my keyboard for bloody ages and came up with || instead of m.

nob end!

10h agoHN ↗

I noticed that audio quality begins degrading above 100% (at least if the media is already at high volume), so it really is a useful concept. I'm unsure what Linux distro I'm recalling this from, but it was useful on my little old netbook from college

4h agoHN ↗

The software has to start clipping the audio above "100%", but I use it regularly in say, VLC, because I might want the volume slightly higher without increasing my whole system volume just to hear a quiet section. I rarely notice any degradation at 150%.

14h agoHN ↗

The sections that follow are full of real improvements. A bounds check removed, an allocation that no longer happens,

Annoyingly the.net blog seems to have started to use LLMs to write their copy. Using "real" twice in one paragraph - do LLMs do that? Lots of commas is a tell for me.

This is a long one. It’s meant to be. Grab your hot beverage of choice, settle in, and let’s turn it up.

Ugh.

13h agoHN ↗

These comments about potential LLM usage are so boring. Stephen is doing this kind of blog post since 6+ years. They all look the same. Read it! It’s very good. Performance deep dives with this kind of quality are rare.

12h agoHN ↗

Ok, fair enough. I may have over compensated for this one. I found the Spinal Tap, "this one goes to 11 stuff" so irritating that I might have not thought it through. It's such a tired joke by now. I did enjoy his Frozen reference last year.

10h agoHN ↗

This comment is written by AI. "Fair enough" "over compensation" in one line. We should ban such accounts

13h agoHN ↗

Not too sure here. I use quite a few commas, too.

I suspect it was done old school: Written by Stephen and passed to a LLM to fill in all those links and other garnish and then passed back for final polish by Stephen. That's how I do my write ups (but generally without the LLM bit for shorter efforts).

This is a long write up, and I'm sure it will have been assisted, but in the right way, and not a sloppy way.

I've dropped several commas before conjunctions, soz!

13h agoHN ↗

FWIW the .NET 10 release also had 2 occurrences of "real" in literally the first paragraph.

I, too, tire of the constant YOU WROTE THIS WITH LLMs outrage. An incredible engineer dumped an ENORMOUS amount of technical knowledge at your feet, and you're commenting on the smell? Is that all you have to contribute?

I saw this too on the Ryan Carniato/SolidJS 2.0 announcement post. A world-class engineer makes a great blog post, and all the comments can focus on are the LLM-smells. Oh well. Any reason not to learn, I guess.

13h agoHN ↗

This is the loudest release of .NET to date(!)

13h agoHN ↗

For some people LLM-spotting feels like a sport they need to compete in

11h agoHN ↗

Backing you up on this. I smelled LLM and hit cmd+w.

2m agoHN ↗

You've never heard/read someone using the same word twice in the same sentence before?

13h agoHN ↗

Dumb Q: should a non-systems-language dev know/read assembly?

    ; Arm64
    --- .NET 10
    +++ .NET 11
    @@ -13,8 +13,6 @@
                ble     G_M000_IG04

    G_M000_IG03:
    -            cmp     w1, w2
    -            bhs     G_M000_IG05
                str     wzr, [x0, w1, UXTW #2]

    G_M000_IG04:
    @@ -25,4 +23,4 @@
                bl      CORINFO_HELP_RNGCHKFAIL
                brk     #0

    -; Total bytes of code 68
    +; Total bytes of code 60

I know C#/F# decently well, but is there any reason to actually pull out the ol textbooks and learn wtf the above is saying?

13h agoHN ↗

No. If you're a low-level C language programmer then it is useful.

13h agoHN ↗

You don’t need to, but if you ever want to really optimise some code, understanding what it turns into on the target CPU really helps. Especially if you know the implications for any particular instruction (cost of memory access, potential branch prediction misses, etc)

The three* letter mnemonics are usually pretty easy to decode, even if you don’t know the architecture: anything beginning with ‘B’ will be branch, so ‘ble’ is branch if less than or equal. L and S based mnemonics are unusually Load and Store from and to memory. After that it’s understanding the stack and registers and you’re pretty much good to go.

Everything in assembly is loading something from memory into registers doing something basic with those registers, like add/divide/etc and then putting the result back into memory or using the result to make a decision to jump to processing instructions from another place in memory.

Most devs won’t ever need to know this stuff, but as someone who grew up with computers that could barely do anything without grinding to a halt (8bit computer, 2mhz processor, 32kb of RAM, 20kb of which is for the screen), knowing this stuff was essential; however I still find this stuff useful today, even with my C# work.

I am a bit of a performance tuning nerd though, so…

[*] or more

2h agoHN ↗

anything beginning with ‘B’ will be branch

Usually. BRK is a breakpoint.

1h agoHN ↗

True, there are of course exceptions! :D

(Also, other architectures might use J for 'Jump' rather than 'Branch'). I don't make the rules ;)

12h agoHN ↗

Not really, you only need to know you can get at it. One day you might be doing something like processing images or video and you are finding it slow and getting down to this level can be helpful. But it wouldn't necessarily be the first thing you'd look at.

11h agoHN ↗

Kinda. I use the `disassemble` function in Common Lisp quite a bit, and I can't work backwards to explain what a function is doing based on the disassembly.

BUT what I can do is see which functions are being inlined, which values are in memory versus in registers, see if things are being boxed and unboxed a lot, see if SIMD is being used, etc.

And more importantly I can compare two versions of a function to see which one looks better by those criteria. It's not perfect, but IME it works really well for guiding optimization.

I should add that I read the book "Assembly Language: step-by-step" by Jeff Duntemann, and wrote a Tic-Tac-Toe game in assembly ages ago, so that helps a bit to understand the syntax.

(And technically that's a patch file :-)

4h agoHN ↗

What I wish more languages did was what the guile optimizer does. There is a source->source optimizer which does inlining, DCE, CSE and partial evaluation.

That is very handy, especially when writing macros. I only have to look at assembly when I want to know about optimizations that are not visible in the source->source optimizer.

If I ever want to know if something is reified (which I never do) I can always look at the ASM.

10h agoHN ↗

Assembly is honestly very easy to learn, especially ARM assembly, for the basics (even if whole-program assembly is still difficult). In the worst case, you end up learning something interesting.

8h agoHN ↗

C# takes a lot of different roles. If all you're doing is higher level stuff, say you're only working on a local GUI app where you're waiting on the user 99% of the time, you probably don't need to understand it. But you can also treat C# as more of a low level systems language, maybe you need to optimise some number crunching in a server - and then, as with any systems language, being able to read it may help.

8h agoHN ↗

All you could tell from this snippet is that .NET 11 eliminated 2 instructions, one of which is a branch.

You should learn assembly anyway, but it won't make this part any more insightful.

13h agoHN ↗

Impressive technical work and authorship. My quibble, which seems significant in context, is what happened with AoT?

13h agoHN ↗

AoT is still a thing. Presumably a lot of the JIT improvements would also improve the generation of AoT-compiled code.

13h agoHN ↗

I hope that’s the case but I’d feel a lot better to see it in print.

11h agoHN ↗

do you mean NativeAoT? it's mentioned a few times in the post

4h agoHN ↗

It still exists, it's still a bit quirky because of the way you need to match CPU to binary (e.g. some opcode extensions only existing on some CPUs)

37m agoHN ↗

AoT uses the same codegen (mostly) as the JIT so if you see a JIT improvement it's possible NativeAOT/ilc picked up that improvement too.

Unless it's a runtime-only optimization, like guarded devirtualization... there's no straightforward way for an AOT compiler to do that without profiling data.

13h agoHN ↗

C#/.NET are very well-represented in LLM data - from enterprise back-end code to games. A language to use for sure.

12h agoHN ↗

Flip side: LLMs have to be very explicitly told to code in "modern" .NET and C# due to lack of representation in the training set.

Case in point: extension members from C# 14 is one that LLMs commonly stumble on and requires an explicit example. It still sometimes says that this is not valid syntax.

    extension(SomeType instance)
    {
        public OtherType DoSomething() { ... }
    }

Agents really struggle on this one for some reason.

Even older releases have a few that I notice LLMs making mistakes on like use of `System.Threading.Lock` over `Object` when locking.

11h agoHN ↗

With Claude I never had that problem. However Claude does not use the pattern by default

5h agoHN ↗

The dotnet team provides some agent plugins which solve some of these issues. I expect unions in dotnet 11 will need some skill updates too.

4m agoHN ↗

I wonder if any of those work alongside Github Copilot (the autocomplete not actual agent).

Because at this point I would do anything if I could get Github Copilot to understand the new language features and stop trying to constantly revert code.

The one specific thing I'm constantly having to deny is Copilot seeing this:

    List<string> items = [];

into this:

    List<string> items = new List<string>();
12h agoHN ↗

Buildings games in Unity feels like magic with frontier reasoning models.

Assuming you are competent with scene work and the various art pipelines, the rest of the problem is significantly easier now.

I've been using the Unity CLI to run arbitrary C# code against Unity 6 scenes without requiring domain reloads. It uses Roslyn to compile the snippet in a special Unity editor component instead of running the normal compilation pipeline.

The implications for a reasoning model are significant. Domain reloads in my projects can take 10-20 seconds. Compound across 5-10 tool calls and the difference adds up very quickly.

1h agoHN ↗

special Unity editor component

I'd be interested in hearing more.

12h agoHN ↗

Always appreciate the continued perf gains. Our existing services just get faster for free, which is a nice win.

12h agoHN ↗

Very thorough write up. Clearly a lot of performance improvements across their stack. As if it wasn't detailed/long enough already, I would have loved to see some application-level benchmarks that gave a hint of the cumulative performance gains we should expect.

12h agoHN ↗

Saw a noticeable startup time boost on a recent project migration. Always appreciate the continued focus on speed.

11h agoHN ↗

these blog posts have really turned me into a dotnet evangelist. love the framework & language.

9h agoHN ↗

Too bad there’s such a lingering culture of Windows and creaky Lenovos and Dells around it. I’m sure it can be different, but I’m not taking my chances ever again. Simply not worth my sanity.

6h agoHN ↗

Not sure when your last foray into the .NET ecosystem was, but every since it is xplat and unified (.NET 5 probably) it is a real joy. I use VSCode as IDE for C# on my mac, and deploy to Linux.

6h agoHN ↗

He didn't say you can't use Linux or MacOS, he said there's still a culture of being Windows and Microsoft only across .NET shops. As an ex .NET dev I can confirm, the community is quite close minded, language is awesome.

5h agoHN ↗

I think it's changing a lot recently. Our eng team of ~150 has been fully macos for several years now and we've deployed to Linux for ten.

4h agoHN ↗

This.

The community is being diluted by…a different demographic!

1h agoHN ↗

Including the internal Microsoft community

3h agoHN ↗

As an ex .NET dev

Just curious.. what language(s) are you using now?

1h agoHN ↗

Why do I care if other shops are Windows-only? The language and ecosystem are phenomenal and Linux support is first-class.

5h agoHN ↗

I've been using .NET almost exclusively on Linux since it was called .NET Core 2.0, and development platforms other than Windows do feel like second class citizens. Any time you venture into anything remotely advanced, the tooling is usually Windows only.

"Everything" expects you to use MSSQL, even if today there's ok official support for PostgreSQL and SQLite. Most "thought leaders" of various sorts are on Windows and expect you to use it. This pervades throughout the ecosystem.

Can't see this ever changing as it's not in MS' interest to turn other operating systems into good .NET development platforms.

4h agoHN ↗

I'm sure you know more about this than me, but EF works fine with SQLite for a project I work on. There are limitations, but I think there's a difference between the idea of EF deliberately not implementing some features for SQLite and SQLite itself not having support for some EF features (which is the reality I'm familiar with).

SQL Server is the flagship database project on the Microsoft side and that team surely has some imperative to facilitate the EF vision. It simply must be less of a priority for the PostgreSQL and SQLite maintainers to do so. Is that really a valid dig on the .net ecosystem, though?

2h agoHN ↗

Incidentally, I'm seriously considering dropping EF. The ability to apply migrations is nice. I find the means of authoring them to be arcane and capricious. Not having to write every simple query is nice, but it gets really hard to do complex or high performance stuff. After a decade of using this thing, I find myself fighting the Entity tracker more and more and now I'm seriously questioning if it's really all worth it.

1h agoHN ↗

I use EF now - but only for the string interpolation in Database.SqlQuery and Database.ExecuteSql. We don't use POCOs but instead use XML and JSON with Linq.

1h agoHN ↗

It's really the navigations that make EF a problem. I've built a typed object graph database on top of Sqlite that works really well specifically because it's in Sqlite, so the overhead of the 1+N query problem with recursively descending navigations isn't a big problem. But it requires lazy loading and that requires all the navigation to happen inside a single service scope and that makes sequencing some things get difficult (can't just pass the results around willy nilly).

The navigation system in EF is where all of the pain points originate. All of my troubles with getting the migration generator to work are because I'm trying to express rather complex relationships. For example, to store a record representing a property on an object, I need to have two foreign keys from the Properties table to the Types table: one for the type of the property and one for the type in which the property lives. Types themselves have many relationships to other types: their base type, interface types they implement, generic type parameters, constraints on generic type parameters (actually, haven't even implemented that one as is too much).

I'm generally happy with the performance and expressivity of the system I've developed so far, but damn, it came with a lot of pain.

4h agoHN ↗

I can't even remember the last time I used MSSQL with .NET. I'm embarrassed that I worked on projects now that were paying huge sums for licenses when .NET works so absolutely well with every other DB.

These days I just use EF with Sqlite on 99% of my projects.

5h agoHN ↗

That is not my experience. Sure, the background of .NET is windows, but in the last decade or so it opened up to other platforms, and so many shops prefer deploying their .NET based applications to linux for multitude of reasons. Along with this comes linux oriented culture. So windows culture is not tied to .NET per se, more so tied to certain shops I would say. Speaking from anecdotal experience, I have no numbers on this :)

10h agoHN ↗

This post was so refreshing to read, because it reminds me of a time of solid engineering & writing in a pre-AI era.

I’m afraid posts like this might become fleeting.

4h agoHN ↗

looks like a large chunk of this was written by claude though :(

the technical parts are fresh as ever but the writing style is awful, man

3h agoHN ↗

The writing style is similar to the other articles by the same author. He has been doing this for years. I have no idea what your problem with the actual content is.

1h agoHN ↗

Really? I got bored throughout the 7 paragraph (or whatever number) in unrelated introduction.

5h agoHN ↗

I hope there will be some kind of runtime async support for the current or a new asyncmethodbuilder. That is amazing work.

4h agoHN ↗

casey muratori would like to have a talk with you about the following :))

    // Approximately what the JIT generates
    if (animal?.GetType() == typeof(Dog))
    {
        ((Dog)animal).Speak();  // devirtualized, inlinable
    }
    else
    {
        animal.Speak(); // original virtual call, hopefully rare
    }
1h agoHN ↗

actually this is likely just as performant as the "Ugly but fast" code from the famous talk. After all, this is just branching on GetType() == typeof(Dog) which is presumably boiling down to an integer comparison. This roughly the same as the following C code:

    void speak_generic(void* animal, int type_id) {
      if (type_id == DOG) {
        dog_speak((Dog*)animal);
      } else {
        dispatch_speak_vtable(animal);
      }
    }

Advantage 1: You don't have to maintain this logic (its automatic), so you won't get weird cases if you forget to update all your switches everywhere, and/or you get weird fallthrough logic and footgun yourself in C.

Advantage 2: You still get the flexibility of the vtable if you need it (for the case the type is chosen at runtime at not known). But for 90% of cases, its just as fast as the ugly C code.

Disadvantage 1: Losing a smug sense of superiority because you eschew abstractions and prefer writing verbose error-prone switch statements over clean easy to understand code.

Disadvantage 2: Writing performant code can no longer be gate kept behind archaic practices, now everyone can just use `var animal = new Dog()` and be done with it.

38m agoHN ↗

You can always just not use OOP. C#'s tooling for functional programming and C-style programming is really good, thanks to stuff like statics on interfaces or spans.

2h agoHN ↗

One of the best perf tests for C# it's to run the Switch emulator against some legal Switch demo game dump.

1h agoHN ↗

Please give me a money with 1,0000

58m agoHN ↗

Outside of the outstanding optimizations .net has made (plus async runtime), what I really enjoyed was the reworked entry section. Stephen reiterated all the concepts from the past Performance Improvement articles to really showcase the layers of optimization techniques and how the can transform.

34m agoHN ↗

As much as Micro$oft is ... subpar, .NET never fails to amaze in the last couple of years. Kudos to the team.

7m agoHN ↗

dotnet has been a pleasure to work with the last few years