How fast is Emacs on a VAX? Five VAXen, three Emacsen

How fast is Emacs on a VAX? Five VAXen, three Emacsen

The Emacs kit for OpenVMS VAX installs three versions side by side: 19.28 from 1994, 21.2 from 2002 and 22.3 from 2008. Each is newer and bigger than the last. So how much does that cost on real VAX hardware, and how much does the hardware matter?

I now have all three versions installed and timed the same way on five VAXstations, from a 4000/96 down to a 3100 M38. Here is what that looks like.

The machines

machineCPUmemory
VAXstation 4000/96KA49-A, 100 MHz128 MB
VAXstation 4000/90KA49-A, 71 MHz128 MB
VAXstation 4000/60KA46, 55 MHz80 MB
VAXstation 4000 VLCKA48-A, about 6 VUPs24 MB
VAXstation 3100 M38KA42-B32 MB

All run OpenVMS 7.3, and all run the same binary kit, the one published here on 11 October. There is also a simulated VAX (Open SIMH on a modern PC, a Strix Halo 395+); see the end.

Starting Emacs

Starting Emacs with a terminal, in seconds, for 19.28, 21.2 and 22.3 on five VAXstations

  • The machines keep the same order in every version and almost every test: 4000/96, 4000/90, 4000/60, 4000 VLC, 3100 M38. For 19.28 the 4000/60 is 2.2 times slower than the 4000/96, the VLC 3.8 times, and the M38 5.3 times.
  • 19.28 starts in about a second on a 4000/96, and in under 7 on an M38. It is still the quickest way to make a small edit on a slow machine (EMACS19).
  • 21.2 and 22.3 take 4 to 6 times as long to start as 19.28. The gap grows on slower machines. For 22.3 it is 4.6 times on the 4000/96 but 6.1 on the VLC and the M38, so the slow machines lose more than their clock speed alone would explain. I don’t know why yet.
  • In batch, 22.3 starts faster than 21.2 (2.5 s against 4.4 on the 4000/96, 16.6 against 25.7 on the M38). That’s the result of work on 22.3’s start-up path. With a terminal, 22.3 is a little slower than 21.2 again.

The kept editor makes start-up matter much less. You start Emacs once, C-z back to DCL, and EMACS brings the same Emacs back. That takes 0.3 to 0.4 s on a 4000/96 and 1 to 1.6 s on the M38, whichever version it is.

The first C file

Opening the first C file of a session, in seconds, for 21.2 and 22.3

This is 22.3’s worst number. Opening the first .C file of a session loads cc-mode, which takes 16 seconds on a 4000/96, 52 on a 4000/60 and two and a half minutes on the M38. cc-mode is loaded once per Emacs session. 21.2’s cc-mode loads in under half that time. Building cc-mode into 22.3’s dump is the first thing I’m working on for the next kit.

Everything else

Median seconds. The columns go from the fastest machine to the slowest.

Emacs 22.3 (the default)

action4000/964000/904000/604000 VLC3100 M38
emacs -batch, start and exit2.53.56.412.016.6
emacs -q, start with a terminal5.88.115.629.541.9
kept editor: back after C-z0.310.410.721.21.5
open a 320 KB file2.43.36.812.518.0
20 pages of C-v2.53.25.810.314.4
C-s, target near the end1.31.83.96.89.8
save the 320 KB file1.62.14.06.910.8
dired of SYS$SYSTEM:2.43.04.99.510.1
M-! plus M-x shell4.35.912.724.236.6
M-x compile of a small C file2.12.85.410.614.8
byte-compile 250 functions24.033.871.3139205
one garbage collection0.981.42.64.87.4
first C file (loads cc-mode)16.222.451.697.9155

Emacs 21.2

action4000/964000/904000/604000 VLC3100 M38
emacs -batch, start and exit4.45.510.519.025.7
emacs -q, start with a terminal5.67.113.924.434.4
kept editor: back after C-z0.360.410.671.11.6
open a 320 KB file1.31.83.96.710.4
20 pages of C-v2.52.95.68.98.4
C-s, target near the end0.330.490.951.72.1
save the 320 KB file1.31.73.15.18.0
dired of SYS$SYSTEM:5.37.214.223.127.7
M-! plus M-x shell2.23.06.611.822.3
M-x compile of a small C file1.51.93.36.315.7
byte-compile 250 functions15.620.945.984.7126
one garbage collection0.420.581.32.13.3
first C file (loads cc-mode)6.89.521.937.459.1

Emacs 19.28

action4000/964000/904000/604000 VLC3100 M38
emacs -batch, start and exit0.911.01.72.84.0
emacs -q, start with a terminal1.31.62.84.86.8
kept editor: back after C-z0.310.310.520.781.0
open a 320 KB file0.690.942.03.25.2
20 pages of C-v1.61.52.64.24.5
C-s, target near the end0.180.230.380.590.80
save the 320 KB file0.871.12.03.35.2
dired of SYS$SYSTEM:0.330.440.801.41.9
M-! plus M-x shell1.52.04.26.69.7
M-x compile of a small C file0.230.280.490.901.2
byte-compile 250 functions14.920.748.187.4138
one garbage collection0.070.090.200.340.52

What stands out:

  • Searching is 22.3’s other weak spot. It’s about four times slower than 21.2 on every machine, and nearly 10 seconds on the M38 for a search that runs to the end of a 320 KB file.
  • dired is where 21.2 is slowest. It runs a DIRECTORY subprocess and parses the output. 22.3 reads the directory itself and is two to three times faster. 19.28 is fastest of all.
  • A garbage collection costs a lot in 22.3. One collection is a second on the 4000/96 and over seven seconds on the M38. It’s the same amount of work in any command, and it lands in whichever command happens to cross the threshold. That’s why M-! sometimes takes 2 seconds and sometimes half a second. In my measurements it moved between M-! and the M-x shell that followed, depending on how many files were in the user’s login directory. So the table gives the two together.
  • 21.2 is the quickest at byte-compiling, just ahead of 19.28. 22.3 takes about 1.6 times as long.
  • Memory is fine even on small machines. On the 24 MB VLC, 22.3 with a shell running used 6.1 MB more than the DCL prompt alone. 21.2 used 4.3 MB and 19.28 used 1.8 MB.

What I’d use

  • On a 4000/90 or faster, 22.3 is comfortable once it’s running. Start it once and keep it with C-z.
  • On a 4000/60, 22.3 is usable the same way. Expect a 15-second start and a long first C file.
  • On a VLC or an M38, 19.28 starts in a few seconds and does almost everything quickly. 22.3 works, but each start takes half a minute or more, and a garbage collection costs 5 to 7 seconds whenever it comes.

The simulator

A simulated VAX (Open SIMH on a modern PC) starts Emacs roughly three to four times faster than the 4000/96: 22.3 in under 2 seconds, 19.28 in a third of a second. Those numbers were taken before a simulator update, so treat them as an order of magnitude. It’s where all the development happens, but the hardware is the real test.

How this was measured

A Python harness on a Linux machine logs in over telnet as an ordinary user, starts Emacs on a VT-style terminal, types the keys and waits for the screen to show the expected result. Each time is wall-clock seconds on the Linux side, so it includes the terminal round trip. The batch steps (batch start, byte-compiling and garbage collection) are timed by the VAX’s own clock instead. Each figure is the median of 5 runs, or of 3 on the 4000/60, the VLC and the M38. The versions are run alternately, with a fresh login for each run. 22.3’s font lock is off, as the kit ships it. The measurements were taken from 10 to 13 October 2026.

Every run is in the raw data (56 KB zip of CSV files, with a README.TXT explaining them), next to the kit’s other downloads.

I left out completion and dired in the user’s own login directory. Those depend on how many files are in it, which differed from machine to machine (5 on the M38, almost 600 on the 4000/90), so they aren’t comparable.

Credits

Claude Code (Anthropic’s Claude models) wrote and ran the benchmark harness, booked the machines, did the measuring, and drew the charts and most of this post from the results. Eric Brown’s OpenVMS x86-64 ports of 21.2 and 22.3, Thien-Thi Nguyen’s 21.2 VMS port and Richard Levitte’s 19.28 VMS port are what is being measured. Of course, this author (a.k.a. Claude’s operator Doug) prompted it all, provided the hardware and the impetus, and hopes everyone can benefit from the retro-VAX lab being set up!