Dart vs Node.js: comparando o desempenho em implementações de servidor HTTP


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


  • http_reqs: 309.10154 / s

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

Source: https://habr.com/ru/post/pt435014/


All Articles