[LINUX] Ich habe vergessen, die Leistung zu bewerten, weil ich die Gewohnheit hatte, "Ich habe versucht, das schnellste Fizz Buzz anzustreben" zu überspringen.

Einführung

Ich habe vergessen, die Leistung in dem Artikel zu bewerten, den ich zuvor geschrieben habe: "Ich habe versucht, das schnellste FizzBuzz anzustreben". Bist du dumm? Aus diesem Grund haben wir die Leistung des fehlenden Programms bewertet.

Bewertungsmethoden

Das letzte FizzBuzz-Programm, das ich erstellt habe

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

Dies ist nicht sinnvoll, da die Ausführungszeit des Programms zu kurz ist, um mit dem Befehl time gemessen zu werden. Mit ein wenig Einfallsreichtum

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

Eine Methode zum mehrfachen Ausführen und Teilen der Ausführungszeit durch die Anzahl der Ausführungen kann in Betracht gezogen werden. Diese Methode wird jedoch nicht angewendet, da die Wiederholung durch die Shell teurer zu sein scheint als die Ausführungszeit des Programms. Dieses Mal habe ich beschlossen, ein kurzes Programm zu erstellen, das wiederholt dasselbe Programm ausführt und es verwendet.

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);
    }
}

Dies

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

Kompilieren als

python


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

Benutzen als. Die Befehlszeilenoption \ -n Wert gibt an, wie oft das Programm wiederholt ausgeführt wird, und die vom Zeitbefehl ausgegebene Anzahl wird durch die Anzahl der Ausführungen geteilt, um die Ausführungszeit pro Ausführung zu erhalten. Sobald das Programm von der Festplatte gelesen wurde, wird sein Inhalt im Seitencache registriert, und es wird die Festplatte bei wiederholter Ausführung nicht mehr lesen. Da wir auch die Last des Lesens des Programms von der Festplatte auswerten möchten, haben wir eine Funktion bereitgestellt, um das Programm aus dem Zustand auszuführen, in dem der Seitencache gelöscht wird, indem die Befehlszeilenoption \ -f 'angegeben wird. Der Seitencache wird durch Schreiben von 1 in / proc / sys / vm / drop_caches geleert. Administratorrechte sind erforderlich. Daher muss sudo zusammen verwendet werden.

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

Wie im vorherigen Beispiel wird die Ausgabenummer durch die Anzahl der Wiederholungen geteilt, um die Ausführungszeit einschließlich der Programmladezeit zu erhalten.

Messergebnis

Kein Cache löschen (* Der numerische Wert ist die Zeit (Sekunden), die 10.000 Mal ausgeführt wurde.)

Dynamische Link-Version in C-Sprache Statische Link-Version in C-Sprache Assembler-Version
real 4.55 2.99 1.82
user 3.65 2.37 1.43
sys 0.91 0.69 0.47

Es gibt Bargeld (* wie oben)

Dynamische Link-Version in C-Sprache Statische Link-Version in C-Sprache Assembler-Version
real 121.74 142.39 85.90
user 8.15 9.46 3.26
sys 93.45 95.96 78.85

Größe der Ausführungsdatei (* Einheit ist Bytes)

Dynamische Link-Version in C-Sprache Statische Link-Version in C-Sprache Assembler-Version
6112 714736 808

Auswertung

abschließend

Das Ende.

Recommended Posts

Ich habe vergessen, die Leistung zu bewerten, weil ich die Gewohnheit hatte, "Ich habe versucht, das schnellste Fizz Buzz anzustreben" zu überspringen.
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Einstellungen für verschiedene Datenbanken von Django (MySQL, PostgreSQL) zusammenzufassen.
Ich habe versucht, die Gesichtsverdeckungsarbeit des Koordinationsbildes für das Tragen zu automatisieren
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, den für TensorFlow geschriebenen Code nach Theano zu portieren
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, Boeing die Geigenleistung durch Posenschätzung vorzustellen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, die Beispielnachrichten zur Geschäftsintegration in Amazon Transcribe zu übertragen
zoom Ich habe versucht, den Grad der Aufregung der Geschichte auf der Konferenz zu quantifizieren
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Ich habe versucht, die logische Denkweise über Objektorientierung zusammenzufassen.
Ich habe versucht, es wiederherzustellen, da die Parametereinstellung für die Oracle-Datenbankinitialisierung fehlgeschlagen ist.
Ich habe versucht, die optimale Route des Traumlandes durch (Quanten-) Tempern zu finden
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
[Linux] Ich habe versucht, die sichere Bestätigungsmethode von FQDN (CentOS7) zu überprüfen.
Ich habe versucht, das RSS des Top-Songs des iTunes Store automatisch abzurufen
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe zum ersten Mal Tensorflow ausprobiert
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Auf der Suche nach dem schnellsten FizzBuzz in Python
Ich habe versucht, die Verschlechterung des Lithium-Ionen-Akkus mithilfe des Qore SDK vorherzusagen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 3: Reguläre Ausdrücke 20 bis 24]