Les performances de PHP étaient meilleures que ce à quoi je m'attendais

Le début de ça

J'ai pensé à étudier Python depuis un moment récemment. Tout d'abord, vous écrivez un programme qui génère des nombres premiers pour en avoir une idée.

Alors, j'ai essayé de comparer la vitesse avec C, PHP, JavaScript (Node.js), Python3 car c'est une bonne idée.

version

Compilateur C

$ gcc --version
gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


PHP

$ php --version
PHP 7.2.19-0ubuntu0.19.04.1 (cli) (built: Jun  4 2019 14:44:42) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19-0ubuntu0.19.04.1, Copyright (c) 1999-2018, by Zend Technologies

Node.js

$ node --version
v10.16.0

Python

$ python --version
Python 3.7.3

Code source

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>

int main()
{
    int maxNum = 65536;
    bool *a = (bool *)calloc(maxNum, sizeof(bool));
    a[2] = true;
    for (int i = 3; i < maxNum; i += 2) {
        bool p = true;
        int checkMax = (int)round(sqrt((double)i));
        for (int j = 2; j <= checkMax; ++j) {
            if (!a[j]) {
                continue;
            }
            if (i % j == 0) {
                p = false;
                break;
            }
        }
        if (p) {
            a[i] = true;
        }
    }
    for (int i = 2; i < maxNum; ++i) {
        if (a[i]) {
            printf("%d\n", i);
        }
    }
    return 0;
}

PHP

<?php

$maxNum = 65536;
$a = array_fill(0, $maxNum, false);
$a[2] = true;
for ($i = 3; $i < $maxNum; $i += 2) {
    $p = true;
    $checkMax = (int)round(sqrt((double)$i));
    for ($j = 2; $j <= $checkMax; ++$j) {
        if (!$a[$j]) {
            continue;
        }
        if ($i % $j === 0) {
            $p = false;
            break;
        }
    }
    if ($p) {
        $a[$i] = true;
    }
}
for ($i = 2; $i < $maxNum; ++$i) {
    if ($a[$i]) {
        printf("%d\n", $i);
    }
}

JavaScript

const maxNum = 65536;
const a = Array(maxNum);
a.fill(false);
a[2] = true;
for (let i = 3; i < maxNum; i += 2) {
    let p = true;
    const checkMax = parseInt(Math.round(Math.sqrt(parseFloat(i))));
    for (let j = 2; j <= checkMax; ++j) {
        if (!a[j]) {
            continue;
        }
        if (i % j === 0) {
            p = false;
            break;
        }
    }
    if (p) {
        a[i] = true;
    }
}
for (i = 2; i < maxNum; ++i) {
    if (a[i]) {
        console.log(i);
    }
}

Python

import math
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

maxNum = 65536
a = [False] * maxNum;
a[2] = True
for i in range(3, maxNum, 2):
    p = True
    checkMax = int(Decimal(str(math.sqrt(i))).quantize(Decimal('0'), rounding=ROUND_HALF_UP))
    for j in range(2, checkMax + 1):
        if not a[j]:
            continue
        if i % j  == 0:
            p = False;
            break;
    if p:
        a[i] = True;
for i in range(2, maxNum):
    if a[i]:
        print('%d' % i)

résultat

C La compilation est la suivante. Aucune optimisation particulière n'est spécifiée.

$ gcc p.c -lm
$ time ./a.out > /dev/null
./a.out > /dev/null  0.02s user 0.00s system 76% cpu 0.021 total

PHP

$ time php p.php > /dev/null
php p.php > /dev/null  0.22s user 0.01s system 93% cpu 0.249 total

Cela prend 10 fois plus que C. Node.js

$ time node p.js > /dev/null
node p.js > /dev/null  0.53s user 0.04s system 74% cpu 0.768 total

30 fois C. Python

$ time python p.py > /dev/null
python p.py > /dev/null  0.77s user 0.02s system 77% cpu 1.020 total

50 fois C.

Résumé

Donc PHP était plus rapide que toute autre chose. Ceci est inévitable car C est le plus rapide.

À propos, le résultat de la redirection du résultat de sortie vers un fichier et de la recherche de la valeur de hachage est le suivant.

$ md5sum *.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_c.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_js.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_php.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_python.txt
$ sha512sum *.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_c.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_js.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_php.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_python.txt

Il semble que le même résultat ait été obtenu pour tous. Nous n'avons pas réellement vérifié si elle est correcte en tant que liste de nombres premiers. Parce que c'est une vérification de la façon dont la vitesse d'exécution est différente avec le même algorithme.

PHP, qui ne peut pas être multi-thread par défaut lorsqu'il s'agit de traitement parallèle, est un inconvénient.

Recommended Posts

Les performances de PHP étaient meilleures que ce à quoi je m'attendais
J'ai mesuré les performances d'un million de documents avec mongoDB
J'ai étudié le mécanisme de connexion flask!
J'ai vérifié les options de copyMakeBorder d'OpenCV
La structure des dossiers de Flask est résumée
Je ne connaissais pas les bases de Python
Le modèle de projet Python auquel je pense.
J'étais en difficulté car le comportement du conteneur docker n'a pas changé
P100-PCIE-16GB a été ajouté au GPU de Google Colab avant que je le sache
AtCoder AGC 041 C - J'étais accro à la recherche complète de Domino Quality
La gestion de la quantité de fonctionnalités de Kaggle était meilleure que ce à quoi je m'attendais avec PostgreSQL, j'ai donc créé un répertoire que tout le monde peut utiliser avec Docker.
J'ai essayé l'analyse par grappes de la carte météo
Résumé des différences entre PHP et Python
L'inexactitude de Tensorflow était due à log (0)
J'ai résolu le problème le plus profond d'Hiroshi Yuki.
J'ai vérifié la liste des touches de raccourci de Jupyter
J'ai essayé de corriger la forme trapézoïdale de l'image
Essayez Progate Free Edition [Python I]
La forme du tableau unidimensionnel de numpy était compliquée
J'ai vérifié la période de rétention de session de django
J'ai vérifié la vitesse de traitement de la numpy unidimensionnelle
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
J'ai lu et implémenté les variantes de UKR
Je souhaite personnaliser l'apparence de zabbix
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
En voici une, je vais résumer les applications équipées "d'intelligence artificielle" qui m'intéressaient
Je suis habitué à php + twig, j'ai donc changé le moteur de template de pyramid 1.5 en jinja2.
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②
[Probabilité] Je vais expliquer parce que le problème du robot de Center 2020 Mathematics 1 · A était intéressant.
Lorsque j'ai utilisé Plotly pour dessiner un graphique interactif, c'était plus que ce à quoi je m'attendais.