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.
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
#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
#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
import sys
while True:
sys.stdout.write('y\n')
Über ** 14,2MiB / s ** Schneller als kein C-Puffer
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
$ while true; do echo y; done | pv -r > /dev/null
Über ** 890 KiB / s **
$ 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 **
$ 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 ***
~~ Shell-Skript ~~ cat Befehl läuft gut Es scheint einen besseren Weg zu geben, um zu schreiben