Kann ein Terminalemulator so schnell sein wie TTY 1-6?


59

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:

  1. Öffne ein tmux Fenster mit 2 Fenstern
  2. Der linke Bereich wird eine ausführliche Aufgabe wie grep a /et/c -roder eine einfache seintime seq -f 'blah blah %g' 100000
  3. 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' 100000ist 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.


Klingt so, als gäbe es irgendwo einen großen Puffer
Thorbjørn Ravn Andersen

2
Beachten Sie, dass tty [1-6] nicht immer schnell sind. Auf einer der Maschinen, die ich benutze, ist die Textkonsole sehr sehr langsam, während ein xterm eine anständige Leistung erbringt.
把 把 留 留 在 盐

Antworten:


75

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:

  • Verkleinern Sie das Terminal. Meine eigenen Terminals neigen dazu zu wachsen, bis sie Bildschirme füllen, und sie werden dabei langsam. Ich ärgere mich, ärgere mich über Grafikterminals, ändere die Größe und alles ist besser. :)
  • (@poige) Verwenden Sie einen anderen Terminalemulator. Sie können eine enorme Geschwindigkeitssteigerung auf Kosten einiger moderner Funktionen erzielen. xtermund rxvtarbeiten wirklich gut, es hat einen fantastischen Terminal-Emulator. Ich vermute, Ihre Tests haben gezeigt, dass sie besser abschneiden als die "modernen".
  • (@poige) Verwenden Sie keine skalierbaren Schriftarten. 1986 kann anrufen und nach seinen Terminals fragen, aber man kann nicht leugnen, dass sie schneller sind. ;)
  • (@poige) Deaktivieren Sie das Anti-Aliasing / Sub-Pixel-Adressieren und -Hinweisen, um das Font-Raster zu reduzieren . Die meisten von ihnen erlauben das Überschreiben von Umgebungsvariablen, sodass Sie dies nicht global tun müssen. Hinweis: Sinnlos, wenn Sie eine Bitmap-Schriftart auswählen.
  • Dies tut am meisten weh: Nicht verwenden (mehrere Fenster gleichzeitig)tmux - zwei separate Terminals nebeneinander betreiben. Wenn tmuxzwei 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 Sie ESC [ 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önnen cursesmehrere CPU-Kerne besser nutzen.

5
+1, aber die Sache mit dem tmux ist noch komplizierter, als nur ein paar zusätzliche Escape-Codes zu senden. Terminals dienen zum Scrollen des gesamten Fensters, nicht der Hälfte. Wenn tmux also den gesamten Text im linken Fensterbereich um eine Zeile nach oben verschieben muss, kann es nicht einfach eine neue Zeile erstellen und das Terminal muss den gesamten Fensterbereich neu zeichnen.
Patrick

1
Ganz recht! Ich habe das vergessen. Obwohl es haben Terminals gewesen, die einen Teil des Bildschirms bewegen konnte (IIRC wurde es zum Schutz 'Teil des Bildschirms genannt - es für Formulare usw. verwendet wurde), war es nie besonders flexibel und wahrscheinlich nicht von modernen Terminal - Emulatoren unterstützt. Auch wenn Sie einige wirklich bizarre veraltete Richtlinien finden, die noch heute umgesetzt werden.
Alexios

Antworte dies nach 3 Jahren, hoffe aber, dass jemand dies nützlich findet. Ich bemerke die Verzögerung nur, wenn ich in meinem Vim vertikale Teilung mache (ja, sogar NERDTree), aber die normale Teilung scheint beim Scrollen überhaupt kein Problem zu sein.
Schrei

17

Inzwischen hat @Alexios alle Gründe ziemlich gut beschrieben, ich kann einige Dinge erwähnen, die die Schmerzen relativ lindern:

  • Verwenden Sie Bitmap-Schriften ( Terminal, Terminus- das ist wirklich toll),
  • Deaktivieren Sie das Anti-Aliasing, oder verwenden Sie zumindest kein Subpixel-Rendering .
  • benutze das Terminal von KDE - konsole.

1
Reduzieren Sie auch, und das ist schmerzhaft, die Größe des Terminals (das OP verwendet ein 1920x1200px-Fenster). Ich liebe große Terminals, und meine wachsen in der Regel, bis sie fast so groß wie der Bildschirm werden, aber die Geschwindigkeit des Terminals sinkt, wenn das Terminal wächst. Sogar konsole(was ich bevorzuge).
Alexios

3
konsoleFü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.
Ninjalj

2
Ziemlich sicher, dass die Schriftwiedergabe irgendwann zwischengespeichert wird. Ich glaube nicht, dass die Pixel, die den Buchstaben f darstellen, bei jedem Kopieren in eine Pixmap aus der Vektordefinition neu gerendert werden. (es sei denn, es muss in einer neuen Größe oder einem neuen Winkel gerendert werden). Ich werde die Tatsache nicht bestreiten, dass es einige wirklich nette Bitmap-Schriften gibt, die die beste Option sein können, nur um alleine zu erscheinen, wenn sie zufällig für die gewünschte Größe existieren.
Peter Cordes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.