Info
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
kittydafü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:
| Berech | Wertung | Bemerkung |
|---|---|---|
| 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ät | o | ist mir während der Benchmarks 2x abgestürzt |
| Kompatibilität | ++ | keine Probleme |
| Speicherbedarf | ++ | 1GB |
| Performance | ++ | erstaunlich flott, selbst mit Unicode |
Performance Tests
bench.sh
termbench
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
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 😉 )
| Berech | Wertung | Bemerkung |
|---|---|---|
| Features | ++ | Einzigartige Features |
| Konfiguration | - | zwar mit GUI (nur), allerdings zu überladen |
| Optic | o | kann Themes, kann Hingergrundbilder etc. |
| Stabilität | ++ | keine Probleme |
| Kompatibilität | ++ | keine Probleme |
| Speicherbedarf | ++ | 128MB+300MB Tmux |
| Performance | -- | sehr langsam |
Performance Tests
bench.sh
termbench
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
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.
| Berech | Wertung | Bemerkung |
|---|---|---|
| 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
ohne tmux:
termbench
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:
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
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:
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.
| Berech | Wertung | Bemerkung |
|---|---|---|
| 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
termbench
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
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.
| Berech | Wertung | Bemerkung |
|---|---|---|
| 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
termbench
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
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.
| Berech | Wertung | Bemerkung |
|---|---|---|
| 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
termbench
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
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
- Ghostty: 2,247s
- wezterm: 5,131s
- Kitty: 5.203s
- OSX-Terminal: 6,442s
- Alacritty: 6,815s (ohne Tmux 3,057s)
- 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
- Ghostty: 48.9777s
- Kitty: 80.9324s
- wezterm: 102.6943s
- OSX-Terminal: 135.2832s
- Alacritty: 138.8918s (ohne Tmux 53,0959s - Platz 2)
- 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:
- Ghostty: 12,14ms
- Kitty: 24,44ms
- OSX-Terminal: 28.66ms
- wezterm: 56,64ms
- Alacritty: 105,72ms (ohne tmux: 13,79ms)
- 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
termbench
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
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
termbench
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
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
termbench
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
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
termbench
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
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
termbench
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
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
termbench
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)
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!