Ich habe in letzter Zeit verschiedene Terminal-Emulatoren ausprobiert, vom eingebauten Gnome-Terminal über aterm, xterm, wterm bis hin zu rxvt. Der Test, den ich gemacht habe, ist in dieser Reihenfolge:
- Öffne ein tmux Fenster mit 2 Fenstern
- Der linke Bereich wird eine ausführliche Aufgabe wie
grep a /et/c -r
oder eine einfache seintime seq -f 'blah blah %g' 100000
- Das rechte Fenster ist ein vim-Fenster mit aktivierter Syntax, in dem alle Dateien mit mehr als 100 Codezeilen geöffnet werden.
Wenn im linken Bereich eine große Menge an Ausgaben gedruckt wird, scheint der rechte Bereich sehr langsam zu sein und nicht zu reagieren. Ich habe versucht, in vim zu scrollen, aber es dauert 1-2 Sekunden, bis er sich ändert. Wenn ich versuche, CtrlCauf das linke Fenster zu drücken , wartet es mehr als 10 Sekunden, bevor es gestoppt wird
Wenn ich in TTY dasselbe mache (drücke CTRL+ ALT+ ( F[1-6])), passiert das nicht und beide Fenster sind sehr reaktionsschnell.
Ich habe einige Konfigurationen wie Antialias-Schriften deaktiviert, die Farbgebung deaktiviert, Standardeinstellungen verwendet und zu xmonad und openbox gewechselt, aber es ändert sich nichts.
Das Ergebnis von time seq -f 'blah blah %g' 100000
ist bei diesen Terminals nicht wirklich unterschiedlich, aber die Reaktionszeit ist wirklich unterschiedlich, besonders wenn ich spitted pane tmux (oder andere Multiplexer) verwende. Zu Ihrer Information, ich starte sie alle in einem maximierten Modus.
Ich habe etwas über rahmengepufferte Terminals gelesen, bin mir aber nicht sicher, wie es funktioniert und wie es verwendet werden kann, um meinen Terminalemulator zu beschleunigen.
Meine Frage ist also, was macht Terminal-Emulator viel langsamer als TTY? Gibt es eine Möglichkeit, es so schnell wie TTY zu machen? Vielleicht Hardwarebeschleunigung oder so? Eine Sache, die ich weiß, ist meine Auflösung in X-Server, wenn ein maximierter Terminalemulator ausgeführt wird, 1920 x 1080, und wenn ich TTY ausführe, ist sie geringer, aber ich bin nicht sicher, wie sich dies auf die Leistung auswirken würde.
Antworten:
Wenn ein GUI - Terminal - Emulator druckt einen String aus, hat es die Zeichenfolge konvertieren Codepoints Schriftart, die Codepoints zu einem Font - Renderer senden, erhalten eine Bitmap und zurück blit , die über den X - Server auf dem Display Bitmap.
Der Zeichensatz-Renderer muss die Glyphen abrufen und ausführen (Wussten Sie, dass Truetype / Opentype-Zeichensätze Programme sind , die in einer virtuellen Maschine im Zeichensatz- Renderer ausgeführt werden?). Während der Ausführung der einzelnen Glyphen wird eine irrsinnige Anzahl von Entscheidungen in Bezug auf Schriftartmetriken, Kerning (obwohl Monospace-Schriftarten und Kerning nicht gut zusammenpassen) und Unicode-Kompatibilität getroffen, bevor wir überhaupt den Rasterer erreichen, der möglicherweise sub verwendet -Pixel-Adressierung. Das Terminal muss dann den vom Font-Rasterer erzeugten Puffer an die richtige Stelle bringen und sich um Pixelformatkonvertierungen, Alphakanäle (für die Subpixel-Adressierung), Scrollen (was mehr Blitting erfordert) usw. kümmern.
Zum Vergleich: Wenn Sie eine Zeichenfolge in ein virtuelles Terminal schreiben, das im Textmodus ausgeführt wird (Hinweis: keine grafische Konsole), müssen Sie diese Zeichenfolge in den Videospeicher schreiben. 'Hallo Welt!' beinhaltet das Schreiben von 13 Bytes (13 16-Bit-Wörter, wenn Sie auch Farben möchten). Der X-Font-Rasterer hat noch nicht einmal mit den Dehnübungen und dem Knöchelknacken begonnen, und wir sind fertig. Deshalb war der Textmodus in den vergangenen Jahrzehnten so unglaublich wichtig. Es ist sehr schnell zu implementieren. Selbst das Scrollen ist einfacher als Sie denken: Selbst auf dem ehrwürdigen Motorola 6845-basierten MDA und CGA können Sie den Bildschirm vertikal scrollen, indem Sie einen einzelnen 8-Bit-Wert in ein Register schreiben (könnte 16 sein ... es ist zu lang gewesen). Die Schaltung zur Bildschirmaktualisierungerledigte den Rest. Sie haben im Wesentlichen die Startadresse des Bildpuffers geändert.
Es gibt nichts, was Sie tun können, um ein Grafikterminal so schnell wie ein Terminal im Textmodus auf demselben Computer zu machen. Aber seien Sie vorsichtig: Es gab Computer mit langsameren Textmodi als das langsamste Grafikterminal, das Sie jemals auf einem modernen Computer sehen werden. Der ursprüngliche IBM-PC war ziemlich schlecht (DOS hat Software gescrollt, seufzt). Als ich meine erste Minix-Konsole auf einem 80286 sah, war ich erstaunt über die Geschwindigkeit des (Sprung-) Bildlaufs. Der Fortschritt ist gut.
Update: So beschleunigen Sie das Terminal
@ poige hat bereits drei in seiner Antwort erwähnt , aber hier ist meine eigene Sicht auf sie:
xterm
undrxvt
arbeiten wirklich gut, es hat einen fantastischen Terminal-Emulator. Ich vermute, Ihre Tests haben gezeigt, dass sie besser abschneiden als die "modernen".tmux
- zwei separate Terminals nebeneinander betreiben. Wenntmux
zwei Fenster angezeigt werden, müssen Terminal-Direktiven verwendet werden, um den Cursor stark zu bewegen. Obwohl moderne Terminalbibliotheken sehr schnell und gut zu optimieren sind, stehlen sie immer noch Bytes von Ihrer unformatierten Terminalbandbreite. Um den Cursor in einer beliebigen Zeile eines DEC VT-kompatiblen Terminals zu positionieren, senden SieESC [ row ; col H
. Das sind 6–10 Bytes. Mit mehreren Terminals können Sie die Arbeit trennen, müssen nicht mehr positionieren, optimieren, puffern und alle anderen Aufgaben erledigen und könnencurses
mehrere CPU-Kerne besser nutzen.quelle
Inzwischen hat @Alexios alle Gründe ziemlich gut beschrieben, ich kann einige Dinge erwähnen, die die Schmerzen relativ lindern:
Terminal
,Terminus
- das ist wirklich toll),konsole
.quelle
konsole
(was ich bevorzuge).konsole
Führt verzögerte Bildschirmaktualisierungen durch: Anstatt die Ausgabe sofort anzuzeigen, wartet das Programm ein wenig auf weitere Ausgaben, um Aktualisierungen im Stapelbetrieb durchzuführen. Das ist der Grund, warum es so gut abschneidet, dass es auf den OP-Stresstest vollständig reagiert.