Neuer Terminal Emulator Ghostty

Info

Datum: 28. 12. 2024 um 01:08:21

Schlagworte: Shell Linux

Kategorie: Apple

erstellt von Stephan Bösebeck

logged in

ADMIN


Neuer Terminal Emulator Ghostty

Neuer Terminal Emulator Ghostty

Terminal Emulator - was?

Vielen ist der Begriff "Terminal Emulator" oder "Terminal" vermutlich nicht geläufig, aber es ist ein wichtiges Werzeug in der IT und Softwarentwicklung. Terminal ist das "Ding" was sich öffnet, wenn man die sog. "Eingabeaufforderung" in Windows oder eben das "Terminal" Programm auf Mac oder Linux öffnet. Dort kann man via Texteingaben und ~ausgaben mit dem System auf eine etwas andere Weise interagieren, wie z.B. mit einer Maus.

Die Geschichte dahinter geht zurück auf die guten alten Zeiten der großen IBM-Hosts. Damals hatte man nicht einen Computer unter dem Schreibtisch stehen, sondern man hat mehrere Terminals an den Host angeschlossen. An jedem Terminal konnte dan jemand arbeiten. Diese Terminals waren ziemlich "dumm" und haben nur über eine Serielle Schnittstelle mit dem Host kommuniziert. Und genau dieses Ding wird mit dem Terminal Emulator jetzt emuliert.

Das ist insofern wichtig, weil man damit quasi alles am Computer stuern, überprüfen und anpassen kann. Dabei ist es auf Grund der "seriellen" und schon in der Geschichte begründeten "entfernten" Natur des Terminal super einfach, sowas über das Netzwerk zu senden. Früher mit Hilfe von Tools wie Telnet heute eher nur noch via ssh.

Auf Linux oder allgemein Unix-Systemen (wie auch der Mac eines ist) hat die Shell vermutlich eine höhere Bedeutung als es unter Windows der Fall ist. Die dortige Eingabeaufforderung ist nicht so mächtig, wie die im Terminal auf Unix-Systemen laufende Shell. Jedoch mit PowerShell ist das auch stark erweitert worden und mit dem LinuxSubsystem für Windows kann man auch eine Unix-Shell auf Windows laufen lassen.

Terminal Emulatoren

Es gibt eine Reihe von Terminal Emulatoren, jedes Betriebssystem bringt seinen eigenen mit. Aber es gibt eben auch noch andere, die speziellere Fähigkeiten haben. Die meisten dieser Terminals (das "Emulator" lässt man gerne weg), sind so gebaut, dass sie auf jedem Unix-System und im idealfall auch noch auf Windows laufen. Das bringt gerne mal probleme mit sich, auf die ich noch zu sprechen kommen werde.

Wichtige Features von Terminals

Jetzt könnte man sich fragen, was sind den Features, die so ein Text-Ding überhaupt haben kann. Und genau da fängt es schon an. Denn die Oberflächen, auf denen wir uns bewegen sind eben nicht mehr textbasiert, sondern grafisch. Und der Text muss entsprechend dargestellt werden (Fonts rendering). Das ist ein erstaunlich komplexes und zuweilen auch echt langsames (weil ressurcenfressendes) Unterfangen.

Außerdem möchte ich als User natürlich ein gut lesbares Terminal nutzen, damit ich sinnvoll arbeiten kann. Heutzutage kann man sich nicht mehr auf dier 255 ASCII-Codes beschränken, nein wir haben mit Unicodes Millionen von Dingen, die angezeigt werden können und auch müssen.

Fonts sind wichtig, aber Farben helfen da auch ungemein. Damit tools wie z.B. "NeoVim" oder "LazyGit" richtig funktionieren, benötigt man mindestens 256 Farben. Das ist aber nun wirklich nicht mehr zeitgemäß. Die meisten mir bekannten Terminals beschränken sich aber darauf, weil es zum einen einen quais Standard xterm gibt, der eben nur 256 Farben unterstützt.

Darüber hinaus sollte das alles auch noch flott gehen. Da man im Terminal immer wieder mit einer großen Menge von Text zu tun hat, macht sich eine kleine Millisekunde beim rendern eines einzelnen Zeichens bei millionenfacher Ausführung sehr wohl bemerkbar. In meiner Arbeit laufen einige meiner Scripte auf grund dessen in xterm bzw. standard Terminal von MacOs merklich länger als z.B. in Kitty. Da man immer wieder hört, wie unwichtig Performance bei einem Terminal ist, möchte ich da deutlich widersprechen: Performance ist wichtig! Und da ist es wirklich sinnvoll, eine native Anwendung zu haben, die das maximale herausholt und nicht auf Zig verschiedene Übersetzer setzt. Auf dem Mac ist es wirklich hilfreich, Metal als Grafik-Library zu verwenden um maximale Performance herauszuholen. Viele andere Terminals nutzen zwar auch ne GPU, aber sprechen diese mit Hilfe von OpenGL an, was auf dem Mac z.B. "übersetzt" wird in Metal - und das kostet Zeit.

Weitere wirklich hilfreiche Features, die ich nicht missen möchte sind:

  • einfache Konfiguration: man muss des öfteren mal irgendwas umstellen, farben etc. Das muss einfach von Statten gehen. [wezterm](https://wezfurlong.org/wezterm/) hat z.B. eine auf Lua basierende Konfiguration - das ist super mächtig, aber kann auch sehr schnell echt kompliziert werden.
  • Schneller startup: wenn ich ein Terminal öffne, sollte es im idealfall sofort offen sein. Ich mache mein Terminal im Tag bestimmt 100e Mal auf und zu - wäre blöd, jedes mal warten zu müssen.
  • Anzeige von Grafiken. Ja, so ein Terminal ist textbasiert. Aber wir leben ja nicht mehr in den 70ern. Da kann man schon Bilder anzeigen. Zum Glück hat der Emulator kitty dafür ein Protokoll erschaffen, auf das sich eigentlich alle geeinigt haben. Damit kann man dann auch bilder innerhalb der Textoberfläche anzeigen.
  • File-Transfer und sonstige Gimmicks sind sicherlich auch nice to have. In meinem Fall allerdings von eher minderer Bedeutung. So kann ich in einigen Terminals dinge automatisieren. Das habe ich nie genutzt, da ich für so was die shell benutze. Kann aber sicher in einigen Fällen cool sein. File Transfers via Terminal sind in einigen Fällen vielleicht sinnvoll, aber ich nutze dafür tools, die direkt dafür gemacht wurden (scp z.B.).
  • Tabs und Splits: Wenn man mit Text argbeitet, hat man im Normalfall gerne ein großes Fenster, wenn nicht sogar Fullscreen vor sich. Dann kommt man schnell zu dem Punkt, dass man während man einen Blog-Eintrag tippt, dann doch noch was nachsehen muss. Man kann natürlich ein neues Fenster öffnen, aber warum nicht mit verschiedenen Tabs arbeiten, wie der Browser - Halte ich für essenziell! Ein Split ist quasi das Aufspalten des Fensters auf zwei hälften, in jeder der Hälften läuft dann eine unabhängige shell. Diese Hälften kann man dann wieder teilen und so weiter. Wichtig, wenn man verlgeichn muss oder so.
  • Kompatibilität: Das ist einer der wichtibsten Aspekte - es sollte alles darstellbar sein. Es ist super nervig, wenn ich den Super hyper Terminal Emulator habe, mit 100en features, die ich leider nicht nutzen kann, weil meine Shell nicht kompatibel ist, mein Editor da drin spinnt oder sonst etwas.

Terminals

Ich gehe hier die Sicht eines MacOS-Benutzers an, ich nutze Linux zwar jeden Tag aber nicht mit einer Grafischen Oberfläche. Aber hier gerne mal meine Lieblings-Terminal-Emulatoren. Eines der ältesten Terminals unter Unix ist vermutlich xterm - der Urvater alles Grafischen Terminal Emulatoren. Das wird immer noch auf jedem Linux installiert und kann quasi als vorhanden vorausgesetzt werden.

Ich habe hier einige Tests gemacht um wirklich mal einen guten Vergleich zwischen den Terminals auf dem Mac zu haben, insbesondere für meinen Usecase als Softwareentwickler, Devop und Admin.

Da die Performance ein meiner Meinung nach wirklich wichtiger Teil des ganzen ist, habe ich die Terminals mit verschiedenen Benschmarkprogrammen getestet. Dazu zählt:

  • Einfaches kleines Progrämmchen, welches einen langen Text incl. Unicodes zig mal aufs Terminal ausgibt. Gemessen mit time. Im folgenden "bench.sh" genannt. Das ist, könnte man sagen, der Naheliegendste Test, da hier normale Shell-Funktionen genutzt werden.
  • Ein Tool namens termbench, welches in C++ geschrieben ist und den Durchsatz misst.
  • Ein Tool namens vtebench, geschrieben in Rust.
  • Den Speicherbedarf habe ich mit der Aktivitätsanzeige von MacOS "gemessen", direkt nachdem die Benchmarks durchgelaufen sind.

Die OS-Eigenen Terminals

Die gehören hier hin, da man mit denen anfangen muss, wenn das System frisch installiert ist. Die sind zumeist vom Funktionsumfang eher beschränkt und sehen auch echt bescheiden aus. Meistens kann man ausßer dem Font nicht viel verändern, und langsam sind sie natürlich auch. hier am Beispiel von der MacOS eigenen Terminal App:

BerechWertungBemerkung
Features-zwar tabs und splits, das terminal selbst sehr beschrängt
Konfiguration-man kann nicht viel einstellen, so gibt es kauch keine echten Tastenkürzel, die man vergeben kann.
Optic--Font rendering Probleme
Stabilitätoist mir während der Benchmarks 2x abgestürzt
Kompatibilität++keine Probleme
Speicherbedarf++1GB
Performance++erstaunlich flott, selbst mit Unicode

Performance Tests

bench.sh

0,07s user 0,90s system 15% cpu 6,442 total

termbench

CPU: Apple M1 Ultra 20 Core Processor (HP:16 LP:4)
VT support: no
ManyLine: 46.4265s (0.0215gb/s)
LongLine: 35.8506s (0.0279gb/s)
FGPerChar: 21.0962s (0.0138gb/s)
FGBGPerChar: 31.9099s (0.0177gb/s)
TermMarkV2 Normal: 135.2832s (0.0211gb/s)

(ist danach abgestürzt)

vtebench

Results:

  dense_cells (299 samples @ 1 MiB):
    32.97ms avg (90% < 38ms) +-4.22ms

  medium_cells (164 samples @ 1.06 MiB):
    60.49ms avg (90% < 78ms) +-13.74ms

  scrolling (28 samples @ 1 MiB):
    302.11ms avg (90% < 315ms) +-10.97ms

  scrolling_bottom_region (39 samples @ 1 MiB):
    257.59ms avg (90% < 274ms) +-46.42ms

  scrolling_bottom_small_region (40 samples @ 1 MiB):
    250.95ms avg (90% < 265ms) +-11.03ms

  scrolling_fullscreen (17 samples @ 1 MiB):
    559.29ms avg (90% < 2747ms) +-856.96ms

  scrolling_top_region (30 samples @ 1 MiB):
    334.87ms avg (90% < 278ms) +-507.16ms

  scrolling_top_small_region (39 samples @ 1 MiB):
    261.49ms avg (90% < 280ms) +-9.94ms

  unicode (343 samples @ 1.06 MiB):
    28.66ms avg (90% < 61ms) +-53.92ms

iTerm2

Einer der älteren und immer wieder gern genutzten Terminals auf dem Mac. iTerm2 hat super viele Features, wie z.B. automatisch den Theme anpassen, wenn bestimmte Texte auf der Seite erscheinen. Oder Alarme auslösen, wenn irgendwas angezeigt wird. Leider ist iTerm2 einer der langsamsten im Vergleich. Und die Konfiguration ist komplett grafisch - was nicht wirklich ein Problem sein muss, aber dadurch, dass es so dermaßen viele Features gibt, komplett überladen und verwirrend (für mich). Dennoch habe ich iTerm eine halbe Ewigkeit genutzt, bis ich eine alternative hatte. (und ich wusste nicht mal, dass ich eine alternative brauche 😉 )

BerechWertungBemerkung
Features++Einzigartige Features
Konfiguration-zwar mit GUI (nur), allerdings zu überladen
Opticokann Themes, kann Hingergrundbilder etc.
Stabilität++keine Probleme
Kompatibilität++keine Probleme
Speicherbedarf++128MB+300MB Tmux
Performance--sehr langsam

Performance Tests

bench.sh

0,07s user 0,76s system 5% cpu 14,996 total

termbench

CPU: Apple M1 Ultra 20 Core Processor (HP:16 LP:4)
VT support: no
ManyLine: 102.4746s (0.0098gb/s)
LongLine: 111.7195s (0.0090gb/s)
FGPerChar: 15.3591s (0.0189gb/s)
FGBGPerChar: 21.7056s (0.0260gb/s)
TermMarkV2 Normal: 251.2588s (0.0114gb/s)

vtebench

Results:

  dense_cells (62 samples @ 1 MiB):
    162.79ms avg (90% < 182ms) +-11.96ms

  medium_cells (12 samples @ 1.06 MiB):
    860.58ms avg (90% < 883ms) +-26.82ms

  scrolling (7 samples @ 1 MiB):
    1296.57ms avg (90% < 1305ms) +-4.76ms

  scrolling_bottom_region (8 samples @ 1 MiB):
    1386.13ms avg (90% < 1442ms) +-24.15ms

  scrolling_bottom_small_region (8 samples @ 1 MiB):
    1352.75ms avg (90% < 1371ms) +-12.13ms

  scrolling_fullscreen (5 samples @ 1 MiB):
    2048.8ms avg (90% < 2062ms) +-9.31ms

  scrolling_top_region (3 samples @ 1 MiB):
    4859ms avg (90% < 4887ms) +-28ms

  scrolling_top_small_region (8 samples @ 1 MiB):
    1357.63ms avg (90% < 1371ms) +-10.53ms

  unicode (74 samples @ 1.06 MiB):
    143.46ms avg (90% < 137ms) +-156.46ms

Alacritty

Alacritty ist einer der ersten GPU-Basierten Terminal Emulatoren auch für den Mac, soweit ich weiß. Alacritty ist ausgelegt auf speed. Kann halt sonst nicht viel. Ohne TMUX ist Alacritty meiner Meinung nach nicht zu gebrauchen, da keine Tabs unterstützt werden. Ich hatte auch so meine schwierigkeiten, die besonderheiten des Mac auf Alacritty zu übertragen. So liefen viele Tastaturkürzel nicht. Ich musste ewig rumbasteln, um die Konfiguration einigermaßen am laufen zu haben. Und dann hatte ich immer das Problem, dass die Farben einfach nicht passen wollten.

Alacritty ist sehr beliebt, gerade auf Linux und Leuten, die Tmux mögen. Ich fand die Einstiegshürde zu extrem. Alacritty wurde im Zusammenspiel mit TMUX getestet, denn nur so kann ich es für mich nutzen.

Eigentlich hinkt der Vergleich hier, denn Alakritty bietet viele Funktionen, die die anderen Terminals anbieten, nicht an. Dazu gehört z.B. ein ScrollbackBuffer (dass man im Fenster "zurück" scrollen kann) und eben auch verschiedene Tabs. Deswegen muss ich hier die Kombination mit Tmux testen.

BerechWertungBemerkung
Features--Kann man mit Tmux und Co ändern, aber warum?
Konfiguration--Auf MacOS hatte ich damit echt Schwierigkeiten
Optic--Bei mir nicht gut, die Farben waren immer falsch
Stabilität++keine Probleme
Kompatibilität++keine Probleme
Speicherbedarf++128MB+300MB Tmux
Performance++flott

Performance Tests

bench.sh

0.07s user 0.99s system 15% cpu 6.815 total

ohne tmux:

0.07s user 0.69s system 24% cpu 3.057 total

termbench

CPU: Apple M1 Ultra 20 Core Processor (HP:16 LP:4)
VT support: no
ManyLine: 51.7055s (0.0193gb/s)
LongLine: 35.6015s (0.0281gb/s)
FGPerChar: 17.3334s (0.0168gb/s)
FGBGPerChar: 34.2513s (0.0165gb/s)
TermMarkV2 Normal: 138.8918s (0.0206gb/s)

ohne tmux:

CPU: Apple M1 Ultra 20 Core Processor (HP:16 LP:4)
VT support: no
ManyLine: 22.1249s (0.0452gb/s)
LongLine: 17.2509s (0.0580gb/s)
FGPerChar: 4.2486s (0.0683gb/s)
FGBGPerChar: 9.4715s (0.0595gb/s)
TermMarkV2 Normal: 53.0959s (0.0538gb/s)

vtebench

Results:

  dense_cells (229 samples @ 1 MiB):
    43.23ms avg (90% < 44ms) +-0.88ms

  medium_cells (169 samples @ 1.06 MiB):
    58.79ms avg (90% < 60ms) +-1.28ms

  scrolling (36 samples @ 1 MiB):
    235.94ms avg (90% < 242ms) +-4.35ms

  scrolling_bottom_region (44 samples @ 1 MiB):
    229.8ms avg (90% < 231ms) +-1.05ms

  scrolling_bottom_small_region (44 samples @ 1 MiB):
    228.82ms avg (90% < 230ms) +-0.72ms

  scrolling_fullscreen (38 samples @ 1 MiB):
    222.13ms avg (90% < 223ms) +-0.93ms

  scrolling_top_region (55 samples @ 1 MiB):
    183.44ms avg (90% < 184ms) +-0.86ms

  scrolling_top_small_region (44 samples @ 1 MiB):
    229.48ms avg (90% < 230ms) +-0.66ms

  unicode (95 samples @ 1.06 MiB):
    105.72ms avg (90% < 107ms) +-1.07ms

ohne Tmux:

Results:

  dense_cells (634 samples @ 1 MiB):
    15.29ms avg (90% < 16ms) +-0.73ms

  medium_cells (516 samples @ 1.06 MiB):
    18.92ms avg (90% < 20ms) +-0.69ms

  scrolling (46 samples @ 1 MiB):
    84ms avg (90% < 92ms) +-5ms

  scrolling_bottom_region (379 samples @ 1 MiB):
    25.9ms avg (90% < 26ms) +-0.66ms

  scrolling_bottom_small_region (380 samples @ 1 MiB):
    25.81ms avg (90% < 26ms) +-0.73ms

  scrolling_fullscreen (46 samples @ 1 MiB):
    84.04ms avg (90% < 89ms) +-3.54ms

  scrolling_top_region (255 samples @ 1 MiB):
    38.79ms avg (90% < 41ms) +-1.33ms

  scrolling_top_small_region (384 samples @ 1 MiB):
    25.6ms avg (90% < 26ms) +-0.72ms

  unicode (699 samples @ 1.06 MiB):
    13.79ms avg (90% < 15ms) +-1.4ms

Kitty

Das ist ein wirklich guter, flotter Terminal Emulator. Gibt es für alle möglichen Systeme und die Konfiguration ist einfach. Kitty gibt es schon ewig und ist auch der "Erfinder" des Protokolls zur Anzeige von Bildern in der Shell. Ich hatte Kitty eine ganze weile als meinen Default terminal eingesetzt. Doch ein paar Minuspunkte muss man vergeben. So nutzt Kitty aus verschiedenen gründen eine eigene TERM Variable über die man fähigkeiten des Terminal steuern kann. Leider ist diese bei vielen Systemen nicht bekannt, was dann zu problemen führt. Das kann man super einfach mit dem Hilfsprogramm kitten was mit kitty mit installiert wird, lösen. Aber ärgerlich ists schon.

BerechWertungBemerkung
Features++Kann wirklich viel, kitten ist ein hilfreiches tool
Konfiguration++super simpel
Optic++nette Gimmicks, wie z.B. "smear" cursor
Stabilität++keine Probleme
Kompatibilität++keine Probleme
Speicherbedarf++370Mb
Performance++flott

Performance Tests

bench.sh

0,07s user 0,72s system 15% cpu 5,203 total

termbench

CPU: Apple M1 Ultra 20 Core Processor (HP:16 LP:4)
VT support: no
ManyLine: 39.3815s (0.0254gb/s)
LongLine: 22.8285s (0.0438gb/s)
FGPerChar: 7.5034s (0.0387gb/s)
FGBGPerChar: 11.2190s (0.0503gb/s)
TermMarkV2 Normal: 80.9324s (0.0353gb/s)

vtebench

Results:

  dense_cells (233 samples @ 1 MiB):
    42.5ms avg (90% < 23ms) +-310.19ms

  medium_cells (242 samples @ 1.06 MiB):
    40.9ms avg (90% < 45ms) +-7.7ms

  scrolling (23 samples @ 1 MiB):
    353.7ms avg (90% < 477ms) +-119.18ms

  scrolling_bottom_region (153 samples @ 1 MiB):
    65.4ms avg (90% < 82ms) +-16.3ms

  scrolling_bottom_small_region (152 samples @ 1 MiB):
    65.3ms avg (90% < 82ms) +-16.26ms

  scrolling_fullscreen (13 samples @ 1 MiB):
    682.23ms avg (90% < 733ms) +-59.74ms

  scrolling_top_region (227 samples @ 1 MiB):
    43.74ms avg (90% < 53ms) +-9.15ms

  scrolling_top_small_region (152 samples @ 1 MiB):
    65.52ms avg (90% < 83ms) +-16.39ms

  unicode (401 samples @ 1.06 MiB):
    24.44ms avg (90% < 20ms) +-93.44ms

wezterm

Einer der coolsten Terminals. Ich hatte ihn eine ganze Weile als daily driver, da ich die Konfiguration mit Hilfe von der Programmiersprache Lua ganz sexy fand. Das bietet einige Optionen, die man sonst in der Konfiguration natürlich nicht abbilden kann. Das hat allerdings auch den Nachteil, dass die Konfiguration schnell unübersichtlich komplex wird.

BerechWertungBemerkung
Features+++Super viele, kann so gut wie alles
Konfiguration-Ist halt mehr programmieren, wie konfigurieren
Optic+sieht gut aus, der einzige mit Parallax effect beim Scrollen
Stabilität++keine Probleme
Kompatibilität++keine Probleme
Speicherbedarf++2,7GB
Performance++flott

Performance Tests

bench.sh

0.07s user 0.65s system 14% cpu 5.131 total

termbench

CPU: Apple M1 Ultra 20 Core Processor (HP:16 LP:4)
VT support: no
ManyLine: 42.2684s (0.0237gb/s)
LongLine: 46.8052s (0.0214gb/s)
FGPerChar: 4.9405s (0.0588gb/s)
FGBGPerChar: 8.6801s (0.0650gb/s)
TermMarkV2 Normal: 102.6943s (0.0278gb/s)

vtebench

Results:

  dense_cells (745 samples @ 1 MiB):
    12.91ms avg (90% < 13ms) +-0.51ms

  medium_cells (161 samples @ 1.06 MiB):
    61.7ms avg (90% < 69ms) +-5.62ms

  scrolling (86 samples @ 1 MiB):
    98.44ms avg (90% < 99ms) +-1.39ms

  scrolling_bottom_region (112 samples @ 1 MiB):
    89.27ms avg (90% < 91ms) +-1.45ms

  scrolling_bottom_small_region (109 samples @ 1 MiB):
    91.34ms avg (90% < 95ms) +-2.48ms

  scrolling_fullscreen (71 samples @ 1 MiB):
    123.15ms avg (90% < 124ms) +-1.02ms

  scrolling_top_region (81 samples @ 1 MiB):
    123.69ms avg (90% < 127ms) +-2.76ms

  scrolling_top_small_region (110 samples @ 1 MiB):
    91.16ms avg (90% < 94ms) +-2.51ms

  unicode (72 samples @ 1.06 MiB):
    138.42ms avg (90% < 207ms) +-56.64ms

Ghostty

Der Star der Show. Ich habe all diese anderen Terminals jeden Tag bentutzt und war zuletzt bei Kitty und wezterm hängen geblieben. Jetzt kommt ein Herausforderer und dieser macht die Sachen richtig gut. Die Konfiguration ist super einfach. Alle Parameter der Konfig kann man auch als Startupparameter mitgeben. Die Konfiguration besteht nur aus name = wert Paaren, nichts komplexes.

ghostty sieht out of the box schon gut aus und man muss eigentlich nichts mehr tun. Meine Konfiguration hat nur den Font vergrößert (bin alt 😉 ) und die Größe des Fensters angepasst - das war es schon. Man kann auch alle Tatenkürzel anpassen, die Ghostty versteht, die Standardwerte sind aber wirklich ok.

BerechWertungBemerkung
Features+Da fehlen noch ein paar, aber die Basis ist da
Konfiguration++super simpel, einfach verständlich
Optic+out of the box super, font rendering tadellos
Stabilität+ist mir beim Benchmark einmal abgestürzt
Kompatibilität++keine Probleme (bis auf TERM)
Speicherbedarf++730MB
Performance++flott

Performance Tests

bench.sh

0.06s user 0.65s system 31% cpu 2.247 total

termbench

CPU: Apple M1 Ultra 20 Core Processor (HP:16 LP:4)
VT support: no
ManyLine: 16.2177s (0.0617gb/s)
LongLine: 14.7059s (0.0680gb/s)
FGPerChar: 5.3566s (0.0542gb/s)
FGBGPerChar: 11.6974s (0.0482gb/s)
TermMarkV2 Normal: 47.9777s (0.0595gb/s)

vtebench

Results:

  dense_cells (337 samples @ 1 MiB):
    29.2ms avg (90% < 30ms) +-1.78ms

  medium_cells (354 samples @ 1.06 MiB):
    27.81ms avg (90% < 30ms) +-1.93ms

  scrolling (181 samples @ 1 MiB):
    45.3ms avg (90% < 49ms) +-4.93ms

  scrolling_bottom_region (210 samples @ 1 MiB):
    47.26ms avg (90% < 49ms) +-2.19ms

  scrolling_bottom_small_region (210 samples @ 1 MiB):
    47.2ms avg (90% < 48ms) +-0.7ms

  scrolling_fullscreen (120 samples @ 1 MiB):
    73.93ms avg (90% < 75ms) +-0.86ms

  scrolling_top_region (194 samples @ 1 MiB):
    51.09ms avg (90% < 53ms) +-1.24ms

  scrolling_top_small_region (209 samples @ 1 MiB):
    47.54ms avg (90% < 49ms) +-0.87ms

  unicode (784 samples @ 1.06 MiB):
    12.14ms avg (90% < 13ms) +-0.4ms

Performance ist wichtig

Das habe ich oben schon mal erwähnt, deswegen schauen wir uns die performance tests noch mal genauer an.

Mir ist völlig bewusst, dass diese Tests fürchterlich schwanken können und von vielen Faktoren abhängen können. Die Ergebnisse habe ich mehrmals überprüft und laufen lassen. Alle Terminals hatten die selbe größe und Einstellungen. Nur Alacritty wurde mit Tmux betrieben, weil sonst das Featureset unvergleichbar wäre. Der Vollständigkeit halber habe ich die Zeiten ohne tmux aber auch aufgelistet.

Wenn wir die Ergebnisse direkt nebeneinander stellen, bekommen wir folgende Reihenfolge:

bench.sh

  1. Ghostty: 2,247s
  2. wezterm: 5,131s
  3. Kitty: 5.203s
  4. OSX-Terminal: 6,442s
  5. Alacritty: 6,815s (ohne Tmux 3,057s)
  6. iTerm2: 14,996s

Was mich hier erstaunt, ist dass das OSX-Terminal genauso schnell ist wie Alacritty. Ich habe die Tests mehrfach laufen lassen. Wenn man TMUX weg lässt, ist Alacritty mit 3,057s auf platz 2, allerdings ist das nur wenig nützlich, weil die Tabs etc fehlen.

Mir war schon immer bewusst, dass iTerm2 relativ langsam ist, aber dass er so weit abgeschlagen auf dem letzten Platz landet, hätte ich so auch nicht gedacht.

termbench

  1. Ghostty: 48.9777s
  2. Kitty: 80.9324s
  3. wezterm: 102.6943s
  4. OSX-Terminal: 135.2832s
  5. Alacritty: 138.8918s (ohne Tmux 53,0959s - Platz 2)
  6. iTerm2: 251,2588s

vtebench

die Ergebnisse des vtebench lassen sich schwer auf einen Wert zusammen fassen, aber wenn wir uns hier mal das wichtige Unicode rendering ansehen, erhalten wir folgende Rangfolge:

  1. Ghostty: 12,14ms
  2. Kitty: 24,44ms
  3. OSX-Terminal: 28.66ms
  4. wezterm: 56,64ms
  5. Alacritty: 105,72ms (ohne tmux: 13,79ms)
  6. iTerm2: 143,46ms

Auch hier zeigt sich das gleiche Ergebnis, Ghostty auf Platz 1, Alacritty könnte Plazt 2 einnehmen, aber Tmux verhindert das.

Ergebnisse von einem Intel MacBookPro

Ich habe die tests auch auf einem älteren Mac mit Core i9 Prozessor laufen lassen. Die Tests liefen (naturgemäß) viel länger aber das Ergebnis blieb im Grund gleich:

OSX-Terminal

bench.sh

 0,07s user 1,28s system 21% cpu 6,244 total

termbench

CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
VT support: no
ManyLine: 49.8353s (0.0201gb/s)
LongLine: 25.0697s (0.0399gb/s)
FGPerChar: 17.8134s (0.0163gb/s)
FGBGPerChar: 57.5686s (0.0098gb/s)
TermMarkV2 Normal: 150.2870s (0.0190gb/s)

crashed aber beim ersten versuch. Scrollback buffer musste deaktiviert werden.

vtebench

Results:

  dense_cells (294 samples @ 1 MiB):
    33.6ms avg (90% < 38ms) +-3.72ms

  medium_cells (124 samples @ 1.06 MiB):
    80.58ms avg (90% < 92ms) +-11.45ms

  scrolling (26 samples @ 1 MiB):
    324.04ms avg (90% < 349ms) +-12.34ms

  scrolling_bottom_region (38 samples @ 1 MiB):
    268.37ms avg (90% < 284ms) +-28.3ms

  scrolling_bottom_small_region (37 samples @ 1 MiB):
    273.7ms avg (90% < 288ms) +-11.45ms

  scrolling_fullscreen (27 samples @ 1 MiB):
    323.19ms avg (90% < 334ms) +-6.96ms

  scrolling_top_region (38 samples @ 1 MiB):
    267.5ms avg (90% < 281ms) +-9.29ms

  scrolling_top_small_region (40 samples @ 1 MiB):
    255.33ms avg (90% < 266ms) +-9.5ms

  unicode (183 samples @ 1.06 MiB):
    54.32ms avg (90% < 177ms) +-112.46ms

iTerm2

bench.sh

0,07s user 1,12s system 4% cpu 29,147 total

termbench

CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
VT support: no
ManyLine: 199.4939s (0.0050gb/s)
LongLine: 99.7370s (0.0100gb/s)
FGPerChar: 24.9018s (0.0117gb/s)
FGBGPerChar: 38.7812s (0.0145gb/s)
TermMarkV2 Normal: 362.9138s (0.0079gb/s)

vtebench

Results:

  dense_cells (154 samples @ 1 MiB):
    64.53ms avg (90% < 34ms) +-414.61ms

  medium_cells (139 samples @ 1.06 MiB):
    71.72ms avg (90% < 80ms) +-8.25ms

  scrolling (28 samples @ 1 MiB):
    306.43ms avg (90% < 315ms) +-5.76ms

  scrolling_bottom_region (41 samples @ 1 MiB):
    247.93ms avg (90% < 259ms) +-51.69ms

  scrolling_bottom_small_region (41 samples @ 1 MiB):
    246.71ms avg (90% < 255ms) +-46.68ms

  scrolling_fullscreen (25 samples @ 1 MiB):
    341.28ms avg (90% < 362ms) +-50.75ms

  scrolling_top_region (39 samples @ 1 MiB):
    257.31ms avg (90% < 269ms) +-11.38ms

  scrolling_top_small_region (41 samples @ 1 MiB):
    248.63ms avg (90% < 254ms) +-6.38ms

  unicode (199 samples @ 1.06 MiB):
    50.16ms avg (90% < 139ms) +-121ms

Alacritty

bench.sh

0.08s user 0.98s system 27% cpu 3.870 total

termbench

CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
VT support: no
ManyLine: 40.0785s (0.0250gb/s)
LongLine: 29.5656s (0.0338gb/s)
FGPerChar: 4.6676s (0.0622gb/s)
FGBGPerChar: 10.1072s (0.0558gb/s)
TermMarkV2 Normal: 84.4189s (0.0338gb/s)

vtebench

Results:

  dense_cells (485 samples @ 1 MiB):
    20.13ms avg (90% < 21ms) +-1.33ms

  medium_cells (342 samples @ 1.06 MiB):
    28.8ms avg (90% < 30ms) +-0.9ms

  scrolling (29 samples @ 1 MiB):
    114.97ms avg (90% < 122ms) +-4.78ms

  scrolling_bottom_region (289 samples @ 1 MiB):
    34.13ms avg (90% < 35ms) +-1.09ms

  scrolling_bottom_small_region (289 samples @ 1 MiB):
    34.16ms avg (90% < 35ms) +-1.02ms

  scrolling_fullscreen (24 samples @ 1 MiB):
    194.67ms avg (90% < 203ms) +-4.66ms

  scrolling_top_region (194 samples @ 1 MiB):
    51.11ms avg (90% < 52ms) +-1.37ms

  scrolling_top_small_region (289 samples @ 1 MiB):
    34.12ms avg (90% < 36ms) +-1.3ms

  unicode (537 samples @ 1.06 MiB):
    18.13ms avg (90% < 20ms) +-1.35ms

Ghostty

bench.sh

 0.08s user 1.06s system 32% cpu 3.460 total

termbench

CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
VT support: no
ManyLine: 23.2250s (0.0431gb/s)
LongLine: 19.2002s (0.0521gb/s)
FGPerChar: 9.0523s (0.0321gb/s)
FGBGPerChar: 16.9596s (0.0333gb/s
TermMarkV2 Normal: 68.4370s (0.0417gb/s)

vtebench

Results:

  dense_cells (209 samples @ 1 MiB):
    47.47ms avg (90% < 50ms) +-2.22ms

  medium_cells (254 samples @ 1.06 MiB):
    39.19ms avg (90% < 61ms) +-15.37ms

  scrolling (97 samples @ 1 MiB):
    82.65ms avg (90% < 112ms) +-25.63ms

  scrolling_bottom_region (126 samples @ 1 MiB):
    78.93ms avg (90% < 89ms) +-7.09ms

  scrolling_bottom_small_region (128 samples @ 1 MiB):
    77.75ms avg (90% < 81ms) +-10.66ms

  scrolling_fullscreen (71 samples @ 1 MiB):
    123.48ms avg (90% < 138ms) +-10.86ms

  scrolling_top_region (185 samples @ 1 MiB):
    53.78ms avg (90% < 57ms) +-12.21ms

  scrolling_top_small_region (197 samples @ 1 MiB):
    50.46ms avg (90% < 54ms) +-2.53ms

  unicode (598 samples @ 1.06 MiB):
    16.22ms avg (90% < 18ms) +-1.36ms

wezterm

bench.sh

0.09s user 1.13s system 9% cpu 12.398 total

termbench

CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
VT support: no
ManyLine: 100.4589s (0.0100gb/s)
LongLine: 90.7136s (0.0110gb/s)
FGPerChar: 13.0643s (0.0222gb/s)
FGBGPerChar: 21.0286s (0.0268gb/s)
TermMarkV2 Normal: 225.2654s (0.0127gb/s)

vtebench

Results:

  dense_cells (316 samples @ 1 MiB):
    31.19ms avg (90% < 33ms) +-1.76ms

  medium_cells (62 samples @ 1.06 MiB):
    161.32ms avg (90% < 177ms) +-11.03ms

  scrolling (24 samples @ 1 MiB):
    349.21ms avg (90% < 370ms) +-17.57ms

  scrolling_bottom_region (40 samples @ 1 MiB):
    252.93ms avg (90% < 255ms) +-4.66ms

  scrolling_bottom_small_region (40 samples @ 1 MiB):
    252.63ms avg (90% < 256ms) +-4.09ms

  scrolling_fullscreen (20 samples @ 1 MiB):
    457.9ms avg (90% < 502ms) +-31.66ms

  scrolling_top_region (35 samples @ 1 MiB):
    288.03ms avg (90% < 295ms) +-7.85ms

  scrolling_top_small_region (40 samples @ 1 MiB):
    253.45ms avg (90% < 257ms) +-4.88ms

  unicode (20 samples @ 1.06 MiB):
    503.5ms avg (90% < 792ms) +-741.63ms#

Rangfolge auf dem Intel Mac

bench.sh

  1. Ghostty: 3,460s
  2. Alacritty: 3,870s (Ohne Tmux)
  3. OSX Terminal: 6,244s
  4. wezterm: 12,398s
  5. iTerm2: 29,147s

termbench

  1. Ghostty: 68,4370s
  2. Alacritty: 84,4189s
  3. OSX-Terminal: 150,2870s
  4. wezterm: 225,2654s
  5. iTerm2: 362,9138s

Sehr interessant ist, dass bei diesem Test, Alacritty ohne Tmux tatsächlich in einigen Runs schneller war als Ghostty. Jedoch, schwanken da die Ergebnisse etwas, so dass im Schnitt die Laufzeit ca. bei ca. 75s liegt.

vtebench (Unicode)

  1. Ghostty: 16,22 ms
  2. Alacritty; 18,13ms
  3. iTerm2: 50,16ms
  4. OSX-Terminal: 54,32ms
  5. wezterm: 503,5ms

Fazit

In allen Tests ist Ghostty einer der besten Terminal Emulatoren. Gerade was das super robuste Font-Rendering betrifft und die wirklich super performance ist er herausragend. Es fehlen noch ein paar Quality of Life Features und es könnte auch noch ein paar mehr Gimmicks geben, aber alles in allem ist Ghostty ein super Terminal Emulator und jedem Mac User, der auf der Shell arbeitet wärmstens zu empfehlen!