• Some seeings:

    - C++ unsurpassable king.

    - There's a stark jump of times going from ~200ms to ~900ms. (Rust v1.92.0 being an in-between outlier.)

    - C# gets massive boost (990->225ms) when using SIMD.

    - But C++ somehow gets slower when using SIMD.

    - Zig very fast*!

    - Rust got big boost (630ms->230ms) upgrading v1.92.0->1.94.0.

    - Nim (that compiles to C then native via GCC) somehow faster than GCC-compiled C.

    - Julia keeps proving high-level languages can be fast too**.

    - Swift gets faster when using SIMD but loses much accuracy.

    - Go fastest language with own compiler (ie not dependent to GCC/LLVM).

    - V (also compiles to C) expected it (appearing similar) be close to Nim.

    - Odin (LLVM) & Ada (GCC) surprisingly slow. (Was expecting them to be close to Zig/Fortran.)

    - Crystal slowest LLVM-based language.

    - Pure CPython unsurpassable turtle.

    Curious how D's reference compiler (DMD) compares to the LLVM/GCC front-ends, how LFortran to gfortran, and QBE to GCC/LLVM. Also would like to see Scala Native (Scala currently being inside the 900~1000ms bunch).

    * Note that uses `@setFloatMode(.Optimized)` which according to docs is equivalent to `--fast-math` but only D/Fortran use this flag (C/C++ do not).

    ** Uses `@fastmath` AND `@simd`. The comparison supposedly is for performance on idiomatic code and for Julia SIMD is a simple annotation applied to the loop (and Julia may even auto do it) but should still be noted because (as seen in C# example) it can be big.

    • Looking closer at the benchmarks, it seems that C# benchmark is not using AOT, so Go and even Java GraalVM get here an unfair advantage (when looking at the non SIMD versions). There is a non trivial startup time for JIT.
      • Sorry, I can't seem to edit my answer anymore, but I was mistaken, C# version is using AOT. But the are other significant differences here:

          > var rounds = int.Parse(File.ReadAllText("rounds.txt"));
        
          > var pi = 1.0D;
          > var x = 1.0D;
        
          > for (var i = 2; i < rounds + 2; i++) {
          >     x = -x;
          >     pi += x / (2 \* i - 1);
          > }
        
          > pi \*= 4;
          > Console.WriteLine(pi);
        
        For example, if we change the type of 'rounds' variable here from int to double (like it is also in Go version), the code runs significantly faster on my machine.
        • Try that on ARM64 and the result will be the opposite :)

          On M4 Max, Go takes 0.982s to run while C# (non-SIMD) and F# are ~0.51s. Changing it to be closer to Go makes the performance worse in a similar manner.

    • > Go fastest language with own compiler (ie not dependent to GCC/LLVM).

      C# is using CoreCLR/NativeAOT. Which does not use GCC or LLVM also. Its compiler is more capable than that of Go.

  • Is there a explanation for why C is slower than C++?