Folgende Situation:
Ich messe gerade die Downloadgeschwindigkeit eines Rechners in verschiedenen Hardwarekonfigurationen im LAN, weil bei diesem aus bisher unerklärlichen Gründen der Download bzw. die Netzwerkverbindung immer wieder einbricht.
Dazu starte ich den Rechner mit einem Arch Live Stick und ziehe in Endlosschleife eine 1G große Datei von einem HTTP-Server, der sich im LAN befindet:
while true; do wget server/datei; rm datei; done
In einer weiteren virtuellen Console logge ich einmal pro Sekunde die Absolutzahl der gedownloadeten Bytes in eine Datei auf einen zweiten angesteckten Stick:
while true; do cat /sys/class/net/$DEV/statistics/rx_bytes >> logdatei; sleep 1s; done
Da die logdatei jedoch aus einer Reihe von Absolutwerten besteht, ich aber Traffic pro Sekunde haben möchte, muss ich jeden Wert einmal von seinem Nachfolger subtrahieren. Dazu habe ich mir ein kleines Python Script gemacht:
#!/usr/bin/python
import sys
f1 = open(sys.argv[1], 'r')
s1 = f1.readline()
s2 = f1.readline()
while (s2 != ''):
d = int(s2) - int(s1)
print(d)
s1 = s2
s2 = f1.readline()
while (s2 == '\n'):
s2 = f1.readline()
f1.close()
exit(0)
./pythonscript logdatei
schreibt mir also die entsprechenden Werte in Bytes pro Sekunde nach stdout.
Dann dachte ich: das Pythonscript ist so einfach - das hätte sich bestimmt auch ganz einfach in der Bash erledigen lassen. Gesagt, getan:
#!/bin/bash
PLINE=$(head -1 $1)
for LINE in $(tail -n +2 $1); do
expr $LINE - $PLINE
PLINE=$LINE
done
./bashscript logdatei
liefert wieder genau die gleichen Werte, die ich brauche, braucht dafür aber merkwürdigerweise sehr viel länger, als das pythonscript:
/usr/bin/time ./pythonscript logdatei | wc -l
0.10user 0.00system 0:00.11elapsed 96%CPU (0avgtext+0avgdata 8260maxresident)k
0inputs+0outputs (0major+1157minor)pagefaults 0swaps
4087
/usr/bin/time ./bashscript logdatei | wc -l
0.49user 0.86system 0:06.02elapsed 22%CPU (0avgtext+0avgdata 3864maxresident)k
0inputs+0outputs (0major+489510minor)pagefaults 0swaps
4087
Das viel kürzere Bashsrcipt braucht für die gleiche Aufgabe ganze 6 Sekunden, wo das längere Pythonscript gerade mal 11 Hundertstel Sekunden braucht.
Weiß jemand wieso das so ist?