すべてのトッププログラミング言語は、長い間その位置を証明し、それらの使用のニッチで「決定」されてきました。
ただし、すべてのプログラマーが、使用する各言語の定量的特性を理解することが重要です。
かなりの数のパラメータをさまざまな目的で測定できます。
一部のタスクでは、数学演算をすばやく計算することがより重要になります。また、他の人にとっては、ネットワークとファイルをより高速に操作する方が便利です。
この記事では、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.
, ? ?
, ?