- No ciclo do GNOME 46, a latência de entrada dos terminais baseados em VTE caiu bastante, chegando muito perto do Alacritty, usado como referência rápida nos testes do Fedora 40
- A medição foi feita com sensores de hardware para capturar a latência de entrada ponta a ponta, do pressionamento da tecla até a mudança de pixel na tela, refletindo junto os tempos de resposta do kernel, compositor, app e monitor
- Tanto na entrada simples com
cat > /dev/nullquanto no scroll do neovim mais complexo, Console, VTE Test App e GNOME Terminal mostraram melhora clara em relação ao GNOME 45 - A principal mudança provavelmente foi a troca no VTE do antigo temporizador de repaint de 40Hz por um redesenho a cada frame sincronizado com o monitor
- Os terminais do GNOME 46 com VTE 0.76 têm latência perceptível menor, então até quem evitava terminais baseados em VTE por serem lentos pode querer testá-los de novo
O que mudou nos terminais baseados em VTE
- VTE é a biblioteca Virtual TErminal que serve de base para vários emuladores de terminal do GNOME
- Fornece uma widget GTK para a visualização do terminal
- É usado em GNOME Terminal, Console, Black Box, Tilix, Terminator, Ptyxis
- Os terminais embutidos do Builder e do Workbench também usam VTE
- Durante o ciclo do GNOME 46, o VTE recebeu muitas melhorias de desempenho, e a latência de entrada percebida de fato pelos usuários virou um dos principais pontos de verificação
Como a latência de entrada foi medida
- Latência de entrada é o tempo entre apertar uma tecla no teclado e a mudança de cor de um pixel no monitor
- Quanto menor a latência, mais imediato o app parece responder
- A diferença fica mais evidente ao comparar alternadamente baixa e alta latência
- Em vez de captura de tela por software, foi usado um testador de latência de entrada em hardware
- Um sensor de luz foi conectado a uma placa Teensy, que por sua vez foi ligada ao computador via USB
- O sensor observa uma pequena área da tela, como uma célula de caractere do terminal, cujo brilho muda com a entrada do teclado
- A placa envia uma tecla como Space, detecta a mudança de luminosidade e depois usa uma segunda tecla como Backspace para voltar ao estado original
- Entre as repetições, é adicionado um tempo de espera aleatório para evitar que a medição fique presa à taxa de atualização do monitor
- Esse método mede a latência ponta a ponta, incluindo tempos de resposta do kernel, compositor, aplicação e monitor
- A latência do firmware do teclado fica de fora
- Com a placa e o firmware atuais, são registrados cerca de 35.500 valores do sensor de luz por segundo
- Cada teste foi repetido 120 vezes
- O formato esperado é uma distribuição de pontos espalhada de forma aproximadamente uniforme ao longo de um ciclo de atualização do monitor
- Em um monitor de 144Hz, um ciclo de atualização dura cerca de 6,94ms, e os pontos dos gráficos de exemplo se espalham na faixa de 7–8ms
- Outliers altos ou uma distribuição mais larga podem indicar latência maior ou processamento mais lento no app testado
Ambiente de teste e comparativos
- O sistema de teste foi um notebook Lenovo Legion 7 Gen 7 AMD
- CPU Ryzen 7 6800H
- GPU Radeon RX 6700M dGPU, usando apenas a dGPU via chave MUX
- Monitor Acer Nitro XV320QU, 2560×1440, 144Hz, escala de 100%
- Host com Fedora 40 Silverblue Beta e Mesa 24.0.4
- O compositor foi o raw Mutter 46.0
- raw Mutter é um ambiente de teste simples em que só o Mutter roda, sem o GNOME Shell
- Pode ser executado com um comando como
mutter --display-server -- alacritty - É uma condição próxima do ideal, com quase nenhuma sobrecarga do GNOME Shell
- Pode ser executado com um comando como
- Foram comparados quatro terminais
- Alacritty: não é baseado em VTE e serve como referência por ser consistentemente rápido em testes anteriores
- Console: terminal padrão do GNOME baseado em GTK 4
- VTE Test App: terminal de teste em GTK 4 presente no repositório do VTE
- GNOME Terminal: no GNOME 46, ainda é um app GTK 3 e vem por padrão em várias distribuições
- Para comparar GNOME 45 e GNOME 46, foram usados contêineres
toolboxdo Fedora 39 e Fedora 40- Cada terminal foi instalado a partir dos pacotes padrão do Fedora e executado sem ajustes extras
- As janelas foram posicionadas no canto superior esquerdo do monitor, e o cursor do mouse ficou fora da janela para que a lógica de detecção de links não distorcesse os resultados
Resultados com entrada simples e scroll no neovim
- O primeiro teste executou
cat > /dev/nulle mediu quanto tempo levava para o cursor em bloco se mover uma posição para a direita após pressionar Space- É um cenário de sobrecarga mínima, sem processamento extra como readline
- O Alacritty, como esperado, não mudou entre Fedora 39 e Fedora 40
- Os terminais baseados em VTE melhoraram bastante no GNOME 46 em relação ao GNOME 45, chegando quase ao mesmo nível do Alacritty
- Até o GNOME Terminal, baseado em GTK 3, apresentou resultado muito próximo
- A principal causa da grande melhora provavelmente foi uma mudança no VTE feita por Christian Hergert
- O VTE deixou para trás o antigo temporizador de repaint de 40Hz
- Como uma widget GTK, passou a desenhar a cada frame em sincronia com o monitor
- O Console teve alguns outliers, possivelmente por causa do rastreamento de processos
- Isso não é um fenômeno novo
- Fica como algo a observar no GNOME 47
- O segundo teste usou uma configuração mais realista de neovim
- Um snapshot da configuração do neovim abriu o README do Ptyxis, e parte do texto foi trocada por caracteres Unicode de bloco cheio para que o sensor óptico pudesse detectar a mudança
Ctrl+DeCtrl+Uforam repetidos para rolar o buffer de texto para baixo e para cima- O terminal precisava desenhar elementos de tela como sublinhado, undercurl, ícones da gutter e barra de status
- A melhora dos terminais do GNOME 46 também ficou clara no teste com neovim
- Os terminais baseados em VTE no GNOME 46 continuaram muito próximos do Alacritty
- Considerando só os resultados do Fedora 40, o teste com neovim aumentou a latência em relação ao teste simples com
cat, mas o aumento foi parecido em todos os terminais
As outras diferenças mostradas pelo vtebench
- vtebench é um benchmark automatizado que mede desempenho de leitura e parsing de PTY, não latência de entrada
- Como não trata de fatores importantes como frame rate ou latência, ele não basta para entender o desempenho geral de um terminal
- Ele pressiona fortemente apenas a velocidade com que o terminal lê do PTY
- O tempo de repaint também pode afetar os resultados do vtebench
- Isso pode pesar especialmente em terminais como o VTE, em que leitura/parsing do PTY e lógica de repaint rodam na mesma thread
- O VTE do GNOME 46 também melhorou no vtebench
- O tamanho do ganho foi mais variado do que nos testes de latência de entrada
- Ainda não alcança o nível do Alacritty, que faz leitura e parsing em threads separadas da renderização
- Essa melhora parece vir de várias otimizações aplicadas ao VTE durante o ciclo do GNOME 46
- Os benchmarks
dense_cellseunicodeforam excluídos do gráfico principal de resultados- Esses dois itens são os principais testes de estresse do vtebench
- O VTE ainda mostra resultados muito instáveis neles, o que prejudica a legibilidade do gráfico
- Pelos casos testados, a diferença restante está próxima de ser praticamente irrelevante
- Parte dela pode ser explicada pelo trabalho extra que o VTE faz para acessibilidade, cálculo da barra de rolagem e outros recursos
- A acessibilidade está ativada no GNOME Terminal e atualmente desativada nos terminais GTK 4
- Com VTE 0.76, dá para obter o desempenho com as melhorias do GNOME 46
1 comentários
Comentários do Hacker News
Graças a essa mudança, a mediana de latência de entrada na configuração testada finalmente ficou abaixo da do Apple //e. O Console ficou em cerca de 12 ms, enquanto o Apple //e de 1983 era de 30 ms; levou 41 anos
https://www.extremetech.com/computing/261148-modern-computer...
https://danluu.com/input-lag/
Dito isso, esse benchmark não usou o GNOME Shell, mas sim o compositor raw Mutter 46.0, e o raw Mutter é um ambiente muito básico, quase voltado a testes. Além disso, ele não inclui a latência do teclado, então também não é uma medição de ponta a ponta. Nesse teste, a placa envia a entrada de teclas via USB, mas só a latência interna do teclado pode chegar a 60 ms
https://danluu.com/keyboard-latency/
Eu queria muito saber os números reais de ponta a ponta da configuração padrão que realmente importa; teria sido bom se o artigo tivesse medido isso. O trabalho da equipe do GNOME e do autor do benchmark é excelente, mas a pergunta importante continua em aberto. O Apple //e usava aceleração por hardware e nem lidava com Unicode, então há muitas diferenças, mas ainda assim seria bom poder voltar à responsividade humana de uma máquina com mais de 41 anos
Se a latência desses componentes variar muito durante o teste, fica difícil analisar o ponto central deste texto, que é a melhoria de latência no VTE. Mesmo que ela fosse perfeitamente constante, apenas seria somada ao valor absoluto como uma constante, sem mudar a conclusão. Por isso, não se deve expressar diferenças de latência em percentual. No conjunto de amostras há uma constante que pode ser normalizada, mas na população total de usuários há muitas constantes que não podem ser normalizadas. A parte do Mutter é interessante; como o GNOME roda sobre o Mutter, parece provável que a melhoria absoluta de latência apareça de forma parecida. Ainda assim, o GNOME também pode criar variações indesejadas, como a latência do teclado, então eu gostaria de ver isso verificado na prática
O que realmente me incomodou neste texto foi que, antes da versão de teste mais recente, a taxa de redesenho no Gnome era fixa em 40 Hz. Quem diabos decidiu isso?
Ótimo. Também gosto do fato de os desenvolvedores do VTE terem se concentrado em desempenho, e o processo de medição baseado em hardware do texto é impressionante
O uso de um sensor óptico para medir latência me lembrou o produto de nome nada discreto “Xbox One Controller Monitor” [1], do Ben Heck. Ele lê diretamente o estado dos botões de um controle de console e o combina com um sensor óptico para ajudar desenvolvedores de jogos a manter a latência baixa. Parece bacana, mas custa 900 dólares
[1]: https://www.benheck.com/xbox1monitor/
Tanto este texto quanto o texto linkado colocam o sensor óptico mais ou menos no meio do monitor. Isso não é problema para comparar medições, mas em boa parte dos monitores comuns, a 60 Hz, colocar o sensor na parte de cima da tela mede cerca de 8 ms mais rápido, e colocá-lo na parte de baixo mede cerca de 8 ms mais lento. Isso acontece porque os pixels ou linhas são acionados de cima para baixo, basicamente como em um CRT
Então, se for entrar nos detalhes, isso também deveria ser mencionado, assim como onde definir o limiar do sinal do sensor óptico para considerar que o pixel acendeu. Pelos números do texto, 8 ms é uma diferença bem grande. Da mesma forma, apenas dizer “o monitor X é 30 ms mais lento que o monitor Y” pode ser um exagero. O correto é entender como “foi isso que medi na minha configuração e com as configurações X, Y e Z”. É preciso verificar se o monitor está aplicando algum recurso de melhoria estranho que só adiciona latência e não tem efeito perceptível, e também se, ao trocar de monitor, a placa de vídeo ou o driver não resolveu “ajudar” e mudou sorrateiramente para algum perfil de correção, escalonamento ou melhoria. Esses dispositivos normalmente não avisam nada, e eu já vi alguns casos assim
É engraçado vivermos em um mundo capaz de renderizar cenas 3D surreais e jogos que pareciam impossíveis em hardware de consumo, e ao mesmo tempo ainda estarmos tentando aperfeiçoar a tarefa de imprimir texto em um terminal
Não tem relação com velocidade, mas fiquei curioso se existe no Linux um terminal que, como o Terminal do Mac OSX, restaura todas as abas, o histórico de comandos de cada aba e o scrollback ao fechar e abrir de novo. No Mac, isso é tratado configurando um arquivo de histórico do bash diferente para cada aba
Para esse uso, prefiro um terminal com GUI
-CC, a sessão do tmux é mapeada para as janelas e abas da GUI do iterm2, e isso também funciona usando o tmux de uma máquina remota via sshEu sempre esqueço os atalhos e comandos de controle do tmux, então estou bem animado com esse recurso
[1] https://iterm2.com/documentation-tmux-integration.html
https://github.com/tmux/tmux/wiki
Claro, o tmux pode ser usado com qualquer emulador de terminal com GUI que você quiser
É uma pena que, tirando o warp, quase não existam soluções reais para esse problema. Meu pequeno sonho de UX é que essa funcionalidade de salvar espaço de trabalho seja integrada ao sistema operacional inteiro e aos apps dentro dele. Seria ótimo
Usei Gnome por alguns anos e mudei para sway e alacritty há 2 anos; sinceramente, não percebo diferença nenhuma. Como em equipamentos de áudio high-end, acho que meus ouvidos e olhos não são calibrados para distinguir essa diferença
Finalmente surgiu um benchmark de terminal que não é apenas dar
catem um arquivo enorme. Gostaria de ver mais terminais, especialmente até o console padrão do Linux, no mesmo testehttps://sw.kovidgoyal.net/kitty/performance/#throughput
ou
https://github.com/alacritty/vtebench/tree/master
Fugindo do assunto, o que mais odeio no Gnome Terminal é que ele abre uma janela pequena por padrão. Tem mais ou menos 1/4 da minha tela e, mesmo se eu redimensionar, ele não lembra depois de reiniciar. No fim, tenho que entrar nas configurações e especificar manualmente o número de colunas e linhas
Pessoalmente, prefiro manter o tamanho padrão e redimensionar só janelas específicas que precisam de mais espaço. Ainda assim, deveria haver pelo menos uma opção para lembrar o redimensionamento
Vá em menu hambúrguer > Preferences > nome do perfil. Meu perfil é simplesmente “Unnamed”. Altere “initial terminal size” e fica como você quiser. Eu deixei em 132x43
Por isso, prefiro que não tentem fazer isso. Quando o software pode ter certeza do que eu quero, tudo bem ele agir de forma inteligente; caso contrário, vira mais um caso de “eu estraguei tudo automaticamente para você. Agradeça?”
Quando for lançado, seria bom incluir também o terminal Ghostty de Mitchell Hashimoto nos benchmarks. Ele ainda está em desenvolvimento e polimento, em beta fechado
https://mitchellh.com/ghostty
Uso xterm e i3wn no debian e nunca experimentei nada mais rápido. Nunca nem pensei em desperdiçar GPU com um terminal, então, pessoalmente, acho o alacritty exagerado