Vamos comparar C ++, JS, Python, Python + numba, PHP7, PHP8 e Golang usando o exemplo de cálculo de "Número Primo"

Todas as principais linguagens de programação há muito provaram suas posições e "determinadas" com os nichos de seu uso.





No entanto, é importante para cada programador ter uma compreensão das características quantitativas de cada uma das linguagens que usa.





Muitos parâmetros podem ser medidos para diferentes fins.





Para algumas tarefas, será mais importante ter um cálculo rápido das operações matemáticas. E para outros, trabalhar mais rápido com a rede e os arquivos é mais útil.





Neste artigo, veremos como acelerar um programa usando a compilação JIT para as linguagens Python e PHP.





Como tarefa de cálculo, tomemos a função de verificar se um número é primo ou não - "é primo". Vamos usar um algoritmo básico para verificar se o número é primo:





  • o número não é par





  • e não é divisível por um número menor até a raiz do desejado (ou seja, no loop vamos de 3 à raiz do número)





Precisamos calcular uma série de números primos - até o máximo. O número máximo neste problema seria: 10.000.000.





No algoritmo e no código abaixo, você pode ver que não usei a paralelização, para uma estimativa mais "honesta" do tempo de execução.





A máquina na qual os lançamentos foram feitos:





 :                     MacBook Pro
 :                MacBookPro14,1
 :                     Dual-Core Intel Core i5
 :                 2,3 GHz
 :              1
  :              2
 2-  (  ):    256 
 3- :                  4 
 Hyper-Threading:       
:                          8 
 Boot ROM:                 428.0.0.0.0
 SMC ():              2.43f10
      
      



:





C++

g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
      
      



#include <iostream>
#include <cmath>
#include <time.h>

using namespace std;

bool isPrime(int num)
{
    if (num == 2) {
        return true;
    }
    if (num <= 1 || num % 2 == 0) {
        return false;
    }

    double sqrt_num = sqrt(double(num));
    for (int div = 3; div <= sqrt_num; div +=2)
    {
        if (num % div == 0) {
            return false;
        }
    }
    return true;
}


int main()
{
    int N = 10000000;
    clock_t start, end;
    start = clock();
    for (int i = 0; i < N; i++) {
        isPrime(i);
    }
    end = clock();
    cout << (end - start) / ((double) CLOCKS_PER_SEC);
    cout << " sec \n";
    return 0;
}
      
      



Go (golang)





go version
go version go1.15.4 darwin/amd64
      
      



package main

import (
   "fmt"
   "math"
   "time"
)

func isPrime(num int) bool {
   if num == 2 {
      return true
   }
   if num == 1 || num%2 == 0 {
      return false
   }
   to := int(math.Sqrt(float64(num)))
   for div := 3; div <= to; div += 2 {
      if num%div == 0 {
         return false
      }
   }
   return true
}

func do(N int) {
   for i := 0; i < N; i++ {
      prime := isPrime(i)
      if prime {
         // fmt.Printf("%+v: %+v\n", i, prime)
      }
   }
}

func main() {
   st := time.Now()
   do(10_000_000)
   fmt.Printf("%+v\n", time.Since(st))
}
      
      



Node.js

node --version  
v15.0.1
      
      



function isPrime(num) {
    if (num === 2) {
        return true;
    }
    if (num <= 1 || num % 2 === 0) {
        return false
    }
    for (let div = 3; div <= Math.sqrt(num); div += 2) {
        if (num % div === 0) {
            return false;
        }
    }
    return true;
}

function main(N) {
    const st = new Date().getTime();
    for (let i = 0; i < N; i++) {
        let prime = isPrime(i);
        if (prime) {
            // console.log(i + ': ' + prime);
        }
    }
    console.log((new Date().getTime() - st) / 1000);
}

(function (){
    const N = 10_000_000;
    main(N)
})()
      
      



PHP

<?php

function isPrime($num)
{
    if ($num == 2) {
        return true;
    }
    if ($num == 1 || $num %2 == 0) {
        return false;
    }
    $to = sqrt($num) + 1;
    for ($i = 3; $i <= $to; $i += 2) {
        if ($num % $i == 0) {
            return false;
        }
    }
    return true;
}

function run($N)
{
    for ($i = 0; $i <= $N; $i++) {
        isPrime($i);
    }
}

function main()
{
    $st = microtime(true);
    run(10000000);

    echo microtime(true) - $st;
}

// ,   -))      .
main();
      
      



Python (without "numba")

python3 --version
Python 3.8.5
      
      



import math
from time import perf_counter


def is_prime(num):
    if num == 2:
        return True
    if num == 1 or not num % 2:
        return False
    for div in range(3, int(math.sqrt(num)) + 1, 2):
        if not num % div:
            return False
    return True


def do(n):
    for i in range(n):
        is_prime(i)


if __name__ == '__main__':
    N = 10_000_000
    st = perf_counter()
    do(N)
    end = perf_counter()
    print(end - st)
      
      



Python with "numba"

import math
from time import perf_counter

from numba import njit


@njit(fastmath=True)
def is_prime(num):
    if num == 2:
        return True
    if num == 1 or not num % 2:
        return False
    for div in range(3, int(math.sqrt(num)) + 1, 2):
        if not num % div:
            return False
    return True


@njit(fastmath=True)
def do(n):
    for i in range(n):
        is_prime(i)


if __name__ == '__main__':
    N = 10_000_000
    st = perf_counter()
    do(N)
    end = perf_counter()
    print(end - st)
      
      



:





Nota: menos é melhor.
: - .

, JS "".





:





  • python3 + numba ! Go. !





  • PHP8 JIT . Go!





, - - js Go.





, ? ?





, ?








All Articles