Pominąłem kilka kroków sugerowanych przez @ nicht-verstehen:
python -m timeit --setup 'import subprocess; p = subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)' 'p.stdin.write(b"z"); assert p.stdout.read(1) == b"z"'
Gdzie
python -m timeitwykonuje timeitmoduł Python.
Ta -s/--setupopcja informuje, timeitktóre instrukcje należy wykonać przed każdym powtórzeniem.
subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)uruchamia się ssh- uruchamiając catna twoim hoście - jako podrzędny / podproces, przekierowując swoje strumienie IO do obiektów podobnych do plików Pythona. bufsize=0upewnia się, że żadne IO nie jest buforowane, co może powodować, że IO czeka.
I dla każdej pętli:
p.stdin.write(b"z")zapisuje jeden bajt do dziecka (z kolei przez ssh do cat).
p.stdout.read(1)czyta pojedynczy bajt od dziecka. Twierdzenie wokół niego sprawdza, czy ten bajt jest taki sam, jak napisany do niego.
Sprowadza się do tego samego, ale pomija tworzenie nazwanych potoków ( mkfifo). Zauważyłem, że im więcej uruchomisz pętli, tym szybciej będzie każda pętla. Kontroluj za pomocą -n/--number:python -m timeit --number 50 ...