「プライムナンバー」の計算例を使って、C ++、JS、Python、Python + numba、PHP7、PHP8、Golangを比較してみましょう。

すべてのトッププログラミング言語は、長い間その位置を証明し、それらの使用のニッチで「決定」されてきました。





ただし、すべてのプログラマーが、使用する各言語の定量的特性を理解することが重要です。





かなりの数のパラメータをさまざまな目的で測定できます。





一部のタスクでは、数学演算をすばやく計算することがより重要になります。また、他の人にとっては、ネットワークとファイルをより高速に操作する方が便利です。





この記事では、PythonおよびPHP言語のJITコンパイルを使用してプログラムを高速化する方法について説明します。





計算のタスクとして、数値がプライムであるかどうかをチェックする機能を取りましょう-「プライムです」。番号がプライムであることを確認するための基本的なアルゴリズムを見てみましょう。





  • 数は均等ではありません





  • そして、目的のルートまでの小さい数で割り切れません(つまり、ループ内で3から番号のルートに移動します)





最大までの一連のプライム数を計算する必要があります。この問題の最大数は10,000,000です。





アルゴリズムと以下のコードでは、実行時間のより「正直な」推定のために、並列化を使用しなかったことがわかります。





打ち上げが行われたマシン:





 :                     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)
      
      



:





注:少ないほど良いです。
: - .

, JS "".





:





  • python3 + numba ! Go. !





  • PHP8 JIT . Go!





, - - js Go.





, ? ?





, ?








All Articles