[LINUX] J'ai oublié d'évaluer les performances à cause de l'habitude de sauter "J'ai essayé de viser le Fizz Buzz le plus rapide"

introduction

J'ai oublié d'évaluer les performances dans l'article que j'ai écrit plus tôt, "j'ai essayé de viser le FizzBuzz le plus rapide". Es-tu stupide? Pour cette raison, nous avons évalué les performances du programme manquant.

Méthode d'évaluation

Le programme FizzBuzz créé la dernière fois

$ time -p ./fizzbuzz >/dev/null
real 0.00
user 0.00
sys 0.00
$ 

Cela n'est pas utile car le temps d'exécution du programme est trop court pour être mesuré avec la commande time. Avec un peu d'ingéniosité

 $ time -p (for i in `seq 1 10000`; do ./fizzbuzz; done) >/dev/null
real 6.76
user 4.55
sys 4.41

Une méthode d'exécution multiple et de division du temps d'exécution par le nombre d'exécutions peut être envisagée, mais cette méthode n'est pas adoptée car la répétition par le shell semble être plus coûteuse que le temps d'exécution du programme. Cette fois, j'ai décidé de créer un programme court qui exécute à plusieurs reprises le même programme et l'utilise.

repeat.c


#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdbool.h>
#include <unistd.h>
#include <errno.h>
#include <spawn.h>
#include <sys/wait.h>

int main(int argc, char* argv[])
{
    int opt;
    int n = 1;
    bool f = false;
    int fd = -1;
    opterr = 0;
    while ((opt = getopt(argc, argv, "hfn:")) != -1) {
        switch (opt) {
        case 'h':
        default:
            fprintf(stderr, "Usage: repeat [options]... command\n");
            exit(EXIT_FAILURE);
            break;
        case 'f':
            f = true;
            break;
        case 'n':
            n = atoi(optarg);
            break;
        }
    }
    if (f) {
        fd = open("/proc/sys/vm/drop_caches", O_WRONLY);
    }
    for (int i = 1; i <= n; i++) {
        if (f && fd >= 0) {
            while (write(fd, "1", 1) == -1 && errno == EINTR) {
                ;
            }
        }
        pid_t pid;
        posix_spawn(&pid, argv[optind], NULL, NULL, &argv[optind], NULL);
        int status;
        wait(&status);
        if (status) {
            fprintf(stderr, "pid %d: %d\n", pid, status);
            exit(status);
        }
    }
    if (f && fd >= 0) {
        close(fd);
    }
}

cette

$ gcc -Wall -Wextra -O2 repeat.c -o repeat

Compilez comme

python


$ time -p ./repeat -n 10000 ./fizzbuzz >/dev/null
real 1.84
user 1.44
sys 0.48
$ 

Utilisé comme. L'option de ligne de commande \ -n value's spécifie le nombre de fois que le programme est exécuté de manière répétée, et le nombre produit par la commande time est divisé par le nombre d'exécutions pour obtenir le temps d'exécution par exécution. Une fois que le programme est lu à partir du disque, son contenu est enregistré dans le cache de page, et il n'ira pas lire le disque pendant une exécution répétée. Puisque nous voulons également évaluer la charge de lecture du programme à partir du disque, nous avons fourni une fonction pour exécuter le programme à partir de l'état où le cache de page est effacé en spécifiant l'option de ligne de commande \ -f '. Le cache de page est effacé en écrivant 1 dans / proc / sys / vm / drop_caches, et les privilèges d'administrateur sont requis, il est donc nécessaire d'utiliser sudo ensemble.

$ sudo time -p ./repeat -n 10000 -f ./fizzbuzz >/dev/null
real 85.90
user 3.26
sys 78.85
$ 

Comme dans l'exemple précédent, le nombre de sortie est divisé par le nombre de répétitions pour obtenir le temps d'exécution incluant le temps de chargement du programme.

Résultat de la mesure

Pas d'effacement du cache (* La valeur numérique est le temps (secondes) exécuté 10 000 fois)

Version du lien dynamique en langage C Version du lien statique en langage C Version assembleur
real 4.55 2.99 1.82
user 3.65 2.37 1.43
sys 0.91 0.69 0.47

Il y a une compensation de trésorerie (* comme ci-dessus)

Version du lien dynamique en langage C Version du lien statique en langage C Version assembleur
real 121.74 142.39 85.90
user 8.15 9.46 3.26
sys 93.45 95.96 78.85

Taille du fichier d'exécution (* l'unité est en octets)

Version du lien dynamique en langage C Version du lien statique en langage C Version assembleur
6112 714736 808

Évaluation

en conclusion

La fin.

Recommended Posts

J'ai oublié d'évaluer les performances à cause de l'habitude de sauter "J'ai essayé de viser le Fizz Buzz le plus rapide"
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de résumer les paramètres des différentes bases de données de Django (MySQL, PostgreSQL)
J'ai essayé d'automatiser le travail de masquage du visage de l'image de coordination pour l'usure
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de porter le code écrit pour TensorFlow sur Theano
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de visualiser Boeing de la performance du violon par estimation de pose
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de transcrire les actualités de l'exemple d'intégration commerciale sur Amazon Transcribe
zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de résumer la manière logique de penser l'orientation objet.
J'ai essayé de le restaurer car le paramètre d'initialisation de la base de données Oracle a échoué.
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
[Linux] J'ai essayé de vérifier la méthode de confirmation sécurisée du FQDN (CentOS7)
J'ai essayé d'obtenir automatiquement le RSS de la chanson la plus populaire de l'iTunes Store
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé de résumer la commande umask
J'ai essayé tensorflow pour la première fois
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
À la recherche du FizzBuzz le plus rapide en Python
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
J'ai essayé de résoudre la version 2020 de 100 problèmes de traitement du langage [Chapitre 3: Expressions régulières 20 à 24]