[PYTHON] Implémentation de diverses commandes yes

Début

Il m'est arrivé de lire un article sur la commande yes, alors je l'ai essayé. Une petite histoire sur la commande Unix "oui"|L'informatique| POSTD Je ne verrouille pas l'entrée standard. J'utilise essentiellement write car le support des arguments variables semble interférer avec les fonctions d'impression.

Pour le moment

Commande yes intégrée pour mon Arch Linux (GNU coreutils 8.29)

$ yes | pv -r > /dev/null

Environ ** 8,63 Gio / s **

C gcc (7.3.0) n'inclut aucune optimisation spéciale

Pas de tampon

#include <unistd.h>

#define LEN 2

int main() {

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

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

Environ ** 4,44 Mio / s ** Plus lent que prévu

Avec tampon (8 Ko)

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

Environ ** 8,85 Gio / s ** ~~ Oh, c'est comme écrire dans un étrange souvenir ~~ Je pense que c'est à cause de la taille du tampon que c'est un peu plus rapide que le oui intégré.

Python 3.6.4

Pas de tampon

import sys

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

Environ ** 14,2 Mo / s ** Plus rapide que pas de tampon C

Avec tampon (8 Ko)

import sys

BUF_SIZE = 8192

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

while True:
    sys.stdout.write(yes)

Environ ** 4,07 Gio / s ** Assez rapide pour l'interprète

~~ Favorite ~~ Je l'ai essayé avec un script shell

Pas de tampon

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

Environ ** 890 Kio / s **

Avec tampon (fichier de 8 Ko)

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

Environ ** 2,93 Mio / s **

De force (j'ai créé un fichier de 1 Go et l'ai essayé)

$ 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 Gio / s ***

Impressions

~~ Script shell ~~ La commande cat fonctionne bien Il semble y avoir une meilleure façon d'écrire

Recommended Posts

Implémentation de diverses commandes yes
Diverses commandes Linux
[Linux Mint 20] Diverses commandes de confirmation WiFi