[PYTHON] Verschiedene Ja-Befehle implementiert

Start

Ich habe zufällig einen Artikel über den Befehl yes gelesen und ihn ausprobiert. Eine kleine Geschichte über den Unix-Befehl "Ja"|Computerwissenschaften| POSTD Ich sperre den Standardeingang nicht. Grundsätzlich verwende ich Write, da die Unterstützung für variable Argumente die Druckfunktionen zu beeinträchtigen scheint.

Vorerst

Eingebauter Ja-Befehl für mein Arch Linux (GNU Coreutils 8.29)

$ yes | pv -r > /dev/null

Über ** 8,63 GiB / s **

C gcc (7.3.0) enthält keine spezielle Optimierung

Kein Puffer

#include <unistd.h>

#define LEN 2

int main() {

    char yes[LEN] = "y\n";

    while (1) {
        write(1, yes, LEN);
    }
}

Über ** 4,44 MiB / s ** Langsamer als ich erwartet hatte

Mit Puffer (8KB)

#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 8192
#define LEN 2

int main() {
    char *buf = malloc(BUFSIZE);

    int i;
    char yes[LEN] = "y\n";

    for (i = 0; i < BUFSIZE; i += LEN) {
        memcpy(buf + i, yes, sizeof(char) * LEN);
    }

    while (1) {
        write(1, buf, BUFSIZE);
    }
}

Über ** 8,85 GiB / s ** ~~ Oh, es ist wie in eine seltsame Erinnerung zu schreiben ~~ Ich denke, es liegt an der Puffergröße, dass es etwas schneller ist als das eingebaute Ja.

Python 3.6.4

Kein Puffer

import sys

while True:
    sys.stdout.write('y\n')

Über ** 14,2MiB / s ** Schneller als kein C-Puffer

Mit Puffer (8KB)

import sys

BUF_SIZE = 8192

yes = ''
while len(yes) <= BUF_SIZE:
    yes += 'y\n'

while True:
    sys.stdout.write(yes)

Über ** 4,07 GiB / s ** Sehr schnell für den Dolmetscher

~~ Favorit ~~ Ich habe es mit einem Shell-Skript versucht

Kein Puffer

$ while true; do echo y; done | pv -r > /dev/null 

Über ** 890 KiB / s **

Mit Puffer (8KB Datei)

$ for i in `seq 4096`; do echo y; done > yes8kb.txt; while true; do cat yes8kb.txt; done | pv -r > /dev/null

Über ** 2,93 MiB / s **

Zwangsweise (Ich habe eine 1-GB-Datei erstellt und ausprobiert)

$ for i in `seq 524288`; do echo y; done > yes1mb.txt; for i in `seq 1024`; do cat yes1mb.txt; done > yes1g.txt; while true; do cat yes1g.txt; done | pv -r > /dev/null

*** 4,93 GiB / s ***

Impressionen

~~ Shell-Skript ~~ cat Befehl läuft gut Es scheint einen besseren Weg zu geben, um zu schreiben

Recommended Posts

Verschiedene Ja-Befehle implementiert
Verschiedene Linux-Befehle
[Linux Mint 20] Verschiedene WiFi-Bestätigungsbefehle