Comparação da velocidade de linguagens de programação usando o exemplo de solução do problema de treinamento de uma rede neural

objetivo do trabalho


Compare a velocidade dos programas escritos em diferentes idiomas e execute em diferentes sistemas operacionais. Os resultados do trabalho são principalmente interessantes para resolver problemas associados às redes neurais.

Ferro e SO


Para teste no Ubuntu e Windows (laptop DELL Inspiron-7577):

RAM: 16Gb

CPU: Intel Core i7-7700HQ @ 8x 3.8GHz


FIG. 1 (saída do comando screenfetch no laptop DELL Inspiron-7577 no Ubuntu OS )

Para testes em MAC:

RAM:

CPU de 8Gb : Intel Core i7 2.7GHz

Também testamos em Raspberry pi 4: 

RAM:

CPU de 4Gb : ARMv7 rev 3 (v7l) @ 4x 1,5Ghz


FIG. 2 (saída do comando screenfetch no raspberry pi 4 )

Programa de teste


Para realizar testes, foi simulado um programa que imitava uma rede de 5 neurônios; o objetivo do programa é aprender a resolver corretamente o problema de encontrar um delta exclusivo ou com precisão = 0,01. Todos os parâmetros e propriedades da rede neural, bem como o algoritmo de operação e treinamento, foram retirados desses 2 posts:

https://habr.com/en/post/312450/

https://habr.com/en/post/313216/

As únicas alterações foram são inseridos nos coeficientes E (epsilon) - velocidade de aprendizado, α (alfa) - momento (E = 0,3, α = 0,5). Ao usar os valores indicados no artigo, a rede neural por um longo período de tempo (8 horas) não conseguiu encontrar uma solução.

Por sua estrutura, o programa é um tipo de modelo OOP no qual a classe NeuronNet opera com matrizes de objetos da classe Neuron e Sinaps. Um objeto da classe Sinaps contém referências a 2 objetos da classe Neuron. Para cálculos de ponto flutuante, o tipo de dados duplo é usado.

Algoritmo de teste: 

  1. Um objeto da classe NeuronNet é criado.
  2. Passa em um conjunto de treinamento de teste. Os resultados do trabalho da rede neural antes do treinamento e depois são exibidos no console e são usados ​​para comparação com os de referência.
  3. O programa entra em um ciclo interminável, onde uma vez em 100.000 resultados. Se o erro for menor que delta = 0,01, o ciclo sem fim será encerrado. No futuro, chamarei cada uma dessas comparações de uma era. Quando a era passa, o tempo que leva e os resultados do cálculo da rede neural para cada valor da tabela que exclui ou é exibido no console.
  4. Depois de sair do ciclo, o programa imprime o tempo decorrido de 0 até a última era e termina.

O programa foi originalmente escrito em python3 (https://gitlab.com/di.romanov/neuron1.git) e posteriormente traduzido para Java, Kotlin, C ++ (gcc), php7, ruby


FIG. 3 (um exemplo da saída de um programa escrito na linguagem Kotlin em execução no Ubuntu OS)

Resultado dos testes


Ao trabalhar, os programas escritos em Kotlin, Java, php, ruby ​​e Python deram as mesmas respostas após o conjunto de treinamento, a saída após o conjunto de treinamento de um programa escrito em C ++ era diferente, o que implicou uma alteração no número de épocas necessárias para o treinamento adequado. Por esse motivo, serão apresentadas comparações entre o tempo de execução de todo o programa e o tempo necessário para passar uma era.

Tempo de treinamento [ms.]
UbuntujanelasRaspbianMAC
Pitão104569204239521112335621
Kotlin49684877199637775
Java48925994179737652
Rubi7968490524457229
C ++100990212000505377
php75591131170513996

aba. 1 (tempo de passagem de todas as épocas antes de treinar a rede neural) 

Tempo de viagem de uma época [ms.]
UbuntujanelasRaspbianMAC
Pitão8713169424331527576
Kotlin3924051631625
Java3954851434635
Rubi6667756638040
C ++4185883421057
php63811001243168

aba. 2 (tempo passando uma era) 

Análise de Resultados



gráfico. 1 (o tempo de passagem de todas as épocas dos programas em execução no Ubuntu OS)

Como esperado, Kotlin e Java mostraram a mesma velocidade de trabalho à frente do Python em cerca de 20 vezes. Vamos considerar algumas observações não tão óbvias.

Os resultados de um programa escrito em C ++ foram inesperadamente lentos. Em parte, isso pode ser explicado pelo grande número de épocas que ela levou para encontrar a resposta certa. No entanto, mesmo com isso em mente ( veja o gráfico 2 ), fica atrás dos programas Java em velocidade. 


gráfico. 2 (tempo de passagem de uma era para programas em execução no sistema operacional Ubuntu)

Outro motivo para tais resultados pode ser o uso diferente de recursos do processador ( consulte a Fig. 4, Fig. 5 )


. 4 ( Ubuntu Kotlin)




FIG. 5 (saída do monitor de porta Ubuntu durante a execução de um programa escrito em C ++)

Como você pode ver, Java usa pelo menos 4 núcleos por vez, enquanto um programa C ++ usa um. No entanto, isso não pode explicar a superioridade de velocidade de 8 vezes, pois o Java não usa todos os núcleos para 100%.

Diferenças significativas na velocidade de um programa escrito em Python, dependendo do sistema operacional. Ao executar programas Java em diferentes sistemas operacionais, as diferenças de velocidade não eram superiores a 40% (mesmo em máquinas diferentes, com exceção do raspberry), mas ao iniciar um programa Python, foram obtidos os seguintes valores: Ubuntu - 104c, Windows - 204c, MAC - 335c . A proporção da velocidade do programa no Kotlin para a velocidade do programa em Python é 21 para o Ubuntu OS, 26 para Raspberry e já 43 para Mac.

Todas as linguagens de programação interpretadas mostraram a mesma velocidade no Raspbery

Autores de tradução do Python3


Ruby, php

https://vk.com/silverlumen

Java

https://vk.com/id365699827

All Articles