2016-11-10 3 views
0

Ich schreibe gerade ein Bash-Skript, in dem ich viele Named Pipes verwende. Ich dachte mir, dass das im Vergleich zur direkten Verwendung von Pipes ein wenig Overhead verursachen könnte, aber ich entschied, dass ich damit einverstanden bin, ich wollte nur ein paar Statistiken bekommen, um herauszufinden, wie genau ich es genau mache. Ich daher diese beiden Befehle 50 Mal lief jeweils, bis dann durchschnittlich die Zeiten zu schreiben:Named Pipe schneller als normale Pipe in bash?

time seq 1000000 | sort | head; 
time seq 1000000 | cat >a | cat a | sort | head; #a was created with mkfifo 

Dies ist nicht die eigentliche Art, wie ich

Named Pipes sein werden mit den Zeiten aufzuschreiben, habe ich dieser Befehl:

for i in `seq 50`; do { time seq 1000000 | sort | head; } 2>&1 | grep real | cut -c8-12 >> normal_pipe; done 

zu meinem Erstaunen entdeckte ich diese Ergebnisse:

Normale Rohr:
Durchschnitt: 1.712 sec
stddev: 0,0157 sec

Unbenannt Rohr:
Durchschnitt: 1,644 sec
stddev: 0,0339 sec

Meine Fragen sind nun:

  • Warum ist die Named Pipe schneller?
  • Ist mein Benchmarking-Setup fehlerhaft?
  • Oder liegt der Unterschied wahrscheinlich nur an anderen Prozessen im Hintergrund?

Ich vermute, dass, da sort nur arbeiten kann, sobald es die ganzen Eingang (oder?), Dies, ist, wie schnell das Rohr der EOF ausspuckt ...

+0

'seq 100 | Katze> a | Katze a | sort' kann als 'seq 100> a & sort a' geschrieben werden. – choroba

+0

Zwei Sigma, nichts Besonderes. – MSalters

Antwort

1

lief ich die Die gleichen Tests wurden einige Male an meiner Maschine durchgeführt und die Ergebnisse zeigten wenig Unterschied zwischen den beiden Arten von Rohrleitungen. Meine Ahnung ist ein Unterschied von .068 Sekunden ist nichts besonderes und ist nur auf Hintergrundaufgaben zurückzuführen, wie Sie gesagt haben.