Um grupo de pesquisadores de universidades alemãs resultados , durante o qual foram desenvolvidas 10 variantes de um driver padrão para placas de rede Intel Ixgbe (X5xx) em diferentes linguagens de programação. O driver opera no espaço de usuário e foi implementado nas linguagens C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript e Python. Ao escrever o código, a principal preocupação foi alcançar o máximo desempenho possível, considerando as características de cada linguagem. Em funcionalidade, todas as variantes são idênticas e consistem em aproximadamente 1000 linhas de código. Os resultados do projeto sob a licença BSD.
A variante do driver escrita em Rust apresentou um desempenho muito próximo ao do driver de referência em C. Sob carga com envio simultâneo de blocos de 32 pacotes, o driver em Rust ficou um pouco atrás, mas em testes com mais de 32 pacotes por bloco, a velocidade não diferiu praticamente do driver em C e demonstrou um desempenho de cerca de 28 milhões de pacotes por segundo em um servidor com CPU Xeon E3-1230 v2 a 3,3 GHz.
Os drivers em Go e C# ocuparam a próxima posição em termos de desempenho, apresentando resultados bastante próximos (o driver em Go teve vantagem em testes com blocos de até 16 pacotes, mas ficou um pouco atrás em testes com mais de 16 pacotes por bloco). Com 256 pacotes por bloco, o pico de desempenho do driver em C# foi de aproximadamente 28 milhões de pacotes por segundo, enquanto o driver em Go obteve cerca de 25 milhões de pacotes por segundo.
Em seguida, com resultados suficientemente próximos, vieram os drivers em
Java, OCaml e Haskell, que já apresentaram um desempenho visivelmente inferior em relação às variantes discutidas anteriormente, não conseguindo superar a marca de 12 milhões de pacotes por segundo. Um desempenho ainda mais inferior foi observado nos drivers em Swift e JavaScript, que conseguiram processar fluxos a uma taxa de 5 milhões de pacotes por segundo.
O ranking foi encerrado pelo driver em Python, que conseguiu processar apenas 0,14 milhões de pacotes por segundo. A implementação em Python foi utilizada para avaliar a velocidade de execução dos interpretadores sem JIT e sem otimizações específicas (o código foi executado usando CPython 3.7 e não era compatível com PyPy, mas é notado que a otimização das estruturas de armazenamento de dados poderia aumentar o desempenho em cerca de 10 vezes).
Adicionalmente, foram realizados testes de latência que mostraram a eficácia do buffer e o impacto do coletor de lixo. Durante os testes, foi medida a latência após o redirecionamento de cada pacote pelo driver em comparação com o tempo exato de envio. Os líderes permanecem sendo os drivers em C e Rust, cujos resultados foram praticamente indistinguíveis para um fluxo de 1 milhão de pacotes por segundo (cerca de 20 µs). O driver em Go também se destacou, ficando apenas um pouco atrás dos líderes e também mantendo um nível de 20 µs. O driver em C# apresentou latências de cerca de 50 µs.
As maiores latências foram apresentadas pelos drivers em JavaScript e Java (latências superiores a 300 µs).
A pesquisa foi realizada com o objetivo de avaliar a viabilidade de desenvolver drivers e componentes do sistema operacional em linguagens de nível mais alto do que C. Atualmente, 39 das 40 questões relacionadas à memória no Linux referem-se a drivers, portanto, as questões sobre a aplicação de uma linguagem mais segura e a transferência de drivers do kernel para o espaço do usuário e os fabricantes já estão experimentando ativamente nesta direção (por exemplo, o Google desenvolveu uma pilha TCP para o sistema operacional na linguagem Go, a empresa CloudFlare implementou o protocolo QUIC na linguagem Rust, e a Apple trasladou a pilha TCP nos dispositivos móveis para o espaço do usuário).
Com o trabalho realizado, ficou claro que a linguagem Rust é a melhor candidata para o desenvolvimento de drivers. Os recursos oferecidos pela Rust permitem resolver problemas decorrentes do trabalho de baixo nível com a memória, com uma redução de desempenho de cerca de 2%-10% em comparação com drivers em C. As linguagens Go e C# também são consideradas adequadas para a criação de componentes do sistema, em situações onde as latências em frações de milissegundos, causadas pelo uso do coletor de lixo, são aceitáveis.
Fonte: opennet.ru
