دعونا نقارن C ++ و JS و Python و Python + numba و PHP7 و PHP8 و Golang باستخدام مثال حساب "Prime Number"

لقد أثبتت جميع لغات البرمجة الممتازة مواقعها منذ فترة طويلة و "مصممة" مع مجالات استخدامها.





ومع ذلك ، من المهم لكل مبرمج أن يكون لديه فهم للخصائص الكمية لكل لغة من اللغات التي يستخدمها.





يمكن قياس عدد قليل جدًا من المعلمات لأغراض مختلفة.





بالنسبة لبعض المهام ، سيكون من الأهمية بمكان إجراء حساب سريع للعمليات الحسابية. وبالنسبة للآخرين ، يكون العمل بشكل أسرع مع الشبكة والملفات أكثر فائدة.





في هذه المقالة ، سننظر في تسريع برنامج يستخدم تجميع JIT للغات Python و PHP.





كمهمة للحساب ، لنأخذ وظيفة التحقق مما إذا كان الرقم أوليًا أم لا - "أولي". لنأخذ خوارزمية أساسية للتحقق من أن الرقم هو Prime:





  • الرقم ليس زوجي





  • ولا يقبل القسمة على رقم أصغر حتى جذر الرقم المطلوب (أي في الحلقة ننتقل من 3 إلى جذر الرقم)





سنحتاج إلى حساب سلسلة من الأعداد الأولية - إلى أقصى حد. سيكون العدد الأقصى في هذه المشكلة: 10000000.





في الخوارزمية وفي الكود أدناه ، يمكنك أن ترى أنني لم أستخدم التوازي ، لتقدير أكثر "صدقًا" لوقت التنفيذ.





الآلة التي تم إطلاقها:





 :                     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