Quando um emulador de terminal GUI imprime uma string, ele precisa converter a string em pontos de código da fonte, enviar os pontos de código para um renderizador de fontes, recuperar um bitmap e blit esse mapa de bits para a exibição através do servidor X.
O renderizador de fontes precisa recuperar os glifos e executá-los (você sabia que as fontes Truetype / Opentype são programas em execução dentro de uma máquina virtual no renderizador de fontes?). Durante o processo de execução de cada glifo, um número insano de decisões é feito com respeito a métricas de fonte, kerning (embora fontes monoespaçadas e kerning não se misturem bem), conformidade Unicode, e isso antes mesmo de chegarmos ao rasteriser que provavelmente usa sub endereçamento de pixels. O terminal então tem que pegar o buffer produzido pelo rasteriser da fonte e colocá-lo no lugar certo, cuidando das conversões de formato de pixel, canais alfa (para endereçamento sub-pixel), rolagem (que envolve mais blitting), et cetera.
Em comparação, escrever uma string em um Terminal Virtual em execução no modo de texto (nota: não em um console gráfico) envolve gravar essa string na memória de vídeo. "Hello, World!" Envolve escrever 13 bytes (13 palavras de 16 bits, se você quiser cores também). O rasteriser da fonte X ainda não iniciou seus exercícios de alongamento e quebra de junta, e pronto. É por isso que o modo de texto foi incrivelmente importante em décadas passadas. É muito rápido de implementar. Mesmo a rolagem é mais fácil do que você pensa: mesmo no venerável MDA e CGA baseados no Motorola 6845, você poderia rolar a tela verticalmente escrevendo um único valor de 8 bits em um registrador (poderia ser 16 ... já faz muito tempo). A atualização da tela circuito fez o resto. Você estava essencialmente alterando o endereço inicial do buffer de quadros.
Não há nada que você possa fazer para fazer um terminal gráfico tão rápido quanto um terminal de modo de texto no mesmo computador . Mas lembre-se: tem havido computadores com modos de texto mais lentos do que o terminal gráfico mais lento que você provavelmente verá em um computador moderno. O IBM PC original era muito ruim (o DOS rodava software, suspirava). Quando vi meu primeiro console Minix em um 80286, fiquei impressionado com a velocidade da rolagem (de salto). O progresso é bom.
Atualização: como acelerar o terminal
@ poige já mencionou três em sua resposta , mas aqui está minha opinião sobre eles:
- Diminua o tamanho do terminal. Meus próprios terminais tendem a crescer até preencherem as telas, e ficam lentos quando fazem isso. Eu fico exasperado, incomodado com terminais gráficos, então eu os redimensiono e tudo fica melhor. :)
-
(@ poige) Use um emulador de terminal diferente. Você pode obter um enorme aumento de velocidade ao custo de alguns recursos modernos.
xterm
erxvt
funcionam muito bem, tem um fantástico emulador de terminal. Eu suspeito que seus testes podem ter mostrado que eles têm um desempenho melhor que os "modernos". - (@ poige) Não use fontes escaláveis. 1986 pode ligar e pedir seus terminais de volta, mas você não pode negar que eles são mais rápidos. ;)
- (@ poige) Elimine o rasteriser da fonte desativando o endereçamento e as insinuações de anti-aliasing / sub-pixel. A maioria permite substituições em variáveis de ambiente, portanto, você não precisa fazer isso globalmente. Nota: sem sentido, se você escolher uma fonte de bitmap.
- Isso vai doer mais: não use (vários painéis em)
tmux
- execute dois terminais separados lado a lado. Quandotmux
exibe dois painéis, ele precisa usar diretivas de terminal para mover muito o cursor. Mesmo que as bibliotecas de terminais modernos sejam muito rápidas e boas na otimização, elas ainda estão roubando bytes de sua largura de banda de terminal bruta. Para mover o cursor para uma linha arbitrária em um terminal compatível com DEC VT, envieESC [ row ; col H
. Isso é 6-10 bytes. Com vários terminais, você está segregando o trabalho, eliminando a necessidade de posicionamento, otimização, armazenamento em buffer e todas as outras coisas que ocurses
faz e aproveitando melhor os vários núcleos de CPU.