
Bom dia a todos!
Este ano, com o lançamento do Flutter , uma estrutura para o desenvolvimento de aplicativos de plataforma cruzada, houve um aumento no hype na linguagem Dart. Como qualquer perfeccionista procrastinar o tédio preguiçoso Pensei em comparar o desempenho da implementação do servidor da máquina virtual Dart com seu potencial antagonista na pessoa do Node.js. Devo dizer imediatamente que a esperança estava ardendo dentro de mim de que Dart venceria, e eu ganharia o Santo Graal, me dando superioridade sobre os concorrentes em potencial pelos próximos dois períodos de cinco anos, mas a realidade era um pouco diferente ...
Toolkit
- Máquina de teste: Core I7, SSD, 12 GB de RAM (gentilmente fornecida por meu ex-empregador)
- Teste de carga: k6.io (a propósito, o framework é muito interessante em sua arquitetura)
Organização do código do aplicativo
Código fonte
Então eu decidi especialmente não me incomodar e decidi seguir as recomendações que li ao mesmo tempo em Habré. Em particular:
- Adicionada uma carga útil como um trabalho de geração de dados aleatórios (dados aleatórios para eliminar o cache potencial de resultados)
class Human { constructor (id, name, surname, age, gender) { this.id = id this.name = name this.surname = surname this.age = age this.gender = gender } }
- O Dart e o Node.js usaram opções de processamento de solicitações síncronas e assíncronas.
- Soluções e soluções nativas usadas em estruturas da indústria (aqueduto para dardo e expresso para node.js)
- Como o estudo conseguiu obter uma aceleração significativa do Dart ao usar o aqueduto, que executa isolamentos em cada núcleo, usei o módulo de cluster do node.js para balancear
Metodologia de teste
- executar testes de carga com um determinado número de solicitações por segundo (500, 750) e um limite no número de iterações de teste (o número de solicitações concluídas)
- o aplicativo e a estrutura de teste foram executados na mesma máquina, portanto, você deve entender que todos os resultados são relativos e só podem ser comparados entre si
Resultados
Dardo nativo
500 rps

750 rps
Estrutura de aqueduto para Dart
500 rps

750 rps

Nó nativo.js
500 rps

750 rps

Nó Express com Cluster
500 rps

750 rps

Conclusões
- Obviamente, depende muito de como você implementou a lógica do aplicativo, não tenho muita certeza de que meu código seja ideal tanto no caso de dart quanto no node.js
- Em particular, a função de gerar a matriz pode ser exibida em um fluxo de trabalho separado com saída assíncrona; no meu caso, não foi implementada; portanto, todo o mosh assíncrono não foi usado aqui
- Tanto no Dart quanto no Node.js, a saída pode ser organizada por meio de um fluxo
- Portanto, ainda há muito espaço para pesquisa e otimização de desempenho.
- O Dart na implementação nativa de manipuladores mostrou um arquivo épico; no entanto, quando implementado por meio da estrutura, mostrou resultados impressionantes, segundo os quais a máquina virtual Dart agora pode competir com o Node.js
- Até onde eu sei, uma quantidade enorme de horas de trabalho foi investida na otimização do V8, tenho mais certeza de que muito menos tempo é investido na máquina virtual Dart. Portanto, o segundo provavelmente tem um potencial suficientemente grande para otimizações antes da V8