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.
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
#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
#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
import sys
while True:
sys.stdout.write('y\n')
Environ ** 14,2 Mo / s ** Plus rapide que pas de tampon C
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
$ while true; do echo y; done | pv -r > /dev/null
Environ ** 890 Kio / s **
$ 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 **
$ 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 ***
~~ Script shell ~~ La commande cat fonctionne bien Il semble y avoir une meilleure façon d'écrire