
Dart team posts an example of fast code with 22ms for a “Hello world” - dmitriid
https://twitter.com/Jonathan_Blow/status/1258424476116508672
======
CraftThatBlock
Lots of bashing in this thread, but to clarify a bit:

The Dart VM is roughly based on V8's internals. Running dart alone would be
similar to running node, which needs to initialize the VM, parse the code, and
run it. This is obviously slower than a pre-compiled binary.

dart2native brings it half-way to native, by doing parsing and initialization,
and saving a memory snapshot right before executing the main function. This
greatly reduce startup time (and is the same technique that makes Flutter apps
start fast), but still not as fast as a binary, since it is loading the
snapshots and doing some initialization.

This is usually fast enough, because once the initialization is ran, the
following code will run fast. This is a constant initialization loading time,
and doesn't represent anything.

Saying 22ms doesn't mean anything, and feels like a misinformed statement.

Dart overall is a pleasant language, and it is somewhat unique that it
provides multiple ways to run. You can run with dart, dart2native, dart2js,
and I believe there's one for ARM (for Flutter). This allows you to choose the
best for your target platform

~~~
dmitriid
As people pointed out in the thread, in 22ms a game will have rendered a full
3D world with physics and audio multiple times.

22ms is... not fast. Unless you count modern world where "fast" is "anything
that runs under 10 seconds".

~~~
timsneath
That's an odd contrast (one frame of a game versus loading a language
runtime). How long does a game engine take to load?

A reasonable comparison is whether Dart is able to render complex experiences
at 60fps (i.e. 16ms / frame) on a low-end phone device, which is the primary
use case.

~~~
naikrovek
Depends on the game engine. Jonathan Blow has written one for his upcoming
Sokoban game and it completely compiles and launches the game from source in
about a second and a half. No incremental compilation, no debug mode. That's
not just the runtime engine, it's the tooling to make the game, as well. A
second and a half, from source files on disk to a running binary showing a 3D
viewport on screen.

Think about that.

There is no excuse for how slow software is today. None.

Many parts of Windows 95 were faster in wall clock time in 1995 on the
hardware of 1995 than today's Windows 10 is on the hardware of today. Yes,
today's software does more, but THAT MUCH more? Are you sure?

The hardware we have is very fast. Software developers have been relying on
hardware upgrades for performance improvements for far too long, and now few
software developers know how fast things can be, if they just try _just a tiny
little bit_.

Also, OOP teaches developers how to think about software in ways that are
exactly opposite to how computers actually do work efficiently. Object
oriented programming is just inherently slower because it encourages
developers to think of things one at a time. Computers like to do things in
batches.

More people need to think about performance, because clock speeds aren't going
up like they used to, and we still don't know how to write software that
spreads across a lot of cores very well. The free ride that hardware upgrades
provided us is quickly coming to an end.

tl:dr; everyone needs to learn about how processor caches work, especially the
24-year old JS devs who think they already know everything.

~~~
hedora
Studies have shown that user interface latency was at its all time best in the
mid-80’s, assuming the user was using a dumb terminal that talked to a
mainframe.

Modern software sucks.

------
vsmenon
[disclaimer: I work on the Dart team.]

As others have already noted, the intent here is to purely measure the one-
time startup cost of the runtime in ahead-of-time compiled code - i.e., the
amount of time necessary before we can starting executing any user code -
i.e., the print in this case. It's assumed that the time to do the actual
print is trivial here.

If you want to compare, you might compare with other garbage collected
language/runtimes.

~~~
dmitriid
The text on the page is "AOT-compile apps to native machine code for instant
startup".

And now you're saying that the start up is actually not instant.

\- LuaJIT: 0.002ms [1]

\- Dash and perl take about 2ms. Python takes 12. [2]

\- Perl 0.008s [3]

\- Python 0.009s [4]

And that's before we talk about compilation speeds [5]

[1]
[https://news.ycombinator.com/item?id=23109404](https://news.ycombinator.com/item?id=23109404)

[2]
[https://news.ycombinator.com/item?id=23110092](https://news.ycombinator.com/item?id=23110092)

[3]
[https://twitter.com/beeonbird/status/1258472898446180353](https://twitter.com/beeonbird/status/1258472898446180353)

[4]
[https://twitter.com/f00zz_/status/1258427236891480067](https://twitter.com/f00zz_/status/1258427236891480067)

[5]
[https://twitter.com/alexyanov/status/1258474918607544322](https://twitter.com/alexyanov/status/1258474918607544322)

~~~
vsmenon
"Instant" is a relative word (unless we're actually at 0 time :-)).

We're focus on client apps, where we're really focused on human perception. In
that sense, I'd consider 22ms or 2ms as instant (for startup). I wouldn't
consider 2s as instant.

I'm not saying Dart doesn't have room to get better, but there are diminishing
returns at a certain point.

~~~
dmitriid
22ms here. 22ms there. "Focused on human perception" here, "Focused on human
perception" there.

And suddenly we have what is basically a supercomputer unable to perform
anything without lag.

------
rebblumstein
Wait, that's like 4.4*10^7 clock cycles for my laptop!

Here's hello.sh (in bash) on a Raspberry Pi 3B+:

    
    
      #!/bin/bash
      echo "Hello World!"
    
    
    
      xxxxx@xxxxxxx:~ $ time ./hello.sh
      Hello World!
    
      real    0m0.010s
      user    0m0.001s
      sys     0m0.010s
    
    

Yay, I beat the high score!

------
lmilcin
Both process startup and terminal can be very slow depending on OS.

I also have a rule, I don't bash novice developers for their lack of
knowledge.

~~~
naikrovek
Do you really think novice devs work on Dart at Google?

~~~
lmilcin
Would that be really so surprising?

------
slezyr
It's a startup time of the runtime. More interested in results with two
"hello,world"s. How much the next one going to cost.

Also C++ with cout, -O3 is 4ms and one in *.Zig is 1ms for some reason.

~~~
moonchild
Probably want -Os (and strip afterwards) if you're interested in startup time.
C is also 1ms. C++ has a big cxxrt that zig doesn't. FWIW c++ only takes 2ms
on my (quite slow) machine.

~~~
tomtomtom1
would ios_base::sync_with_stdio(false); also help?

~~~
moonchild
In my benchmark, the c++ version uses the c api (printf rather than cout), so
it wouldn't make a difference.

------
dzhiurgis
How it compares with go, node and java?

~~~
timsneath
Here are a few comparisons (13" MBP, YMMV).

    
    
      $ ./hyperfine './hello.gonative' --warmup 10
      Benchmark #1: ./hello.gonative
        Time (mean ± σ):       3.3 ms ±   0.9 ms   [User: 1.2 ms, 
          System: 1.2 ms]
        Range (min … max):     2.4 ms …  14.2 ms   455 runs
    
      $ ./hyperfine './hello.dartnative' --warmup 10
      Benchmark #1: ./hello.dartnative
        Time (mean ± σ):       8.2 ms ±   0.4 ms   [User: 3.9 ms, 
          System: 3.6 ms]
        Range (min … max):     7.5 ms …  10.2 ms   243 runs
    
      $ hyperfine 'java HelloWorld' --warmup 10
      Benchmark #1: java HelloWorld
        Time (mean ± σ):      90.7 ms ±   1.3 ms   [User: 83.2 ms, 
          System: 23.9 ms]
        Range (min … max):    88.7 ms …  94.2 ms   31 runs

~~~
vips7L
Which JDK? OpenJDK 14 on my machine:

    
    
        ~> Measure-Command { java Main }
        Milliseconds      : 59

~~~
Delk
I got:

OpenJDK 8: ~80-90 ms

OpenJDK 11: ~60 ms

OpenJDK 14: ~50-55 ms

The first runs were a bit slower, perhaps because the files needed by the JVM
weren't in disk cache or something.

Other languages/runtimes:

Python 2.7: 20-25 ms

Python 3.8: 30-40 ms

Native binary compiled from C: 1-3 ms (so bordering on unmeasurable at
millisecond resolution)

This was on Linux, and an entirely unrigorous experiment.

edit: formatting

~~~
vips7L
Nice! I'm glad startup time is getting closer to python. FWIW GraalVM native
image was 16ms for me on Windows.

------
throwaway888abc
Expensive

------
stjo
Holy shit, that’s sad

