Vergleichen Sie die Zeitkosten für das Schreiben einer Datei in C und Python.
Die durchschnittliche Zeit, die für jedes Schreiben benötigt wird, wenn die entsprechenden Daten ('BEFEHL') vom Anfang der Datei in die vorhandene entsprechende Datei ('DRIVER') so oft (10000 Mal) geschrieben werden. Messen Sie die Kosten. (Das Öffnen / Schließen von Dateien ist nicht in den Zeitkosten enthalten.)
Der Grund für das Schreiben von Daten vom Anfang der Datei jedes Mal ist der später beschriebene Hintergrund.
31313 Ich führe ev3dev auf Mindstorm EV3 aus und sende Anweisungen an die Gerätedatei, wenn ich den Motor steuere, aber ich habe mich gefragt, ob es nur für diesen Prozess einen Geschwindigkeitsunterschied zwischen C und Python gibt.
--31313 Mindstorm EV3 (https://www.lego.com/ja-jp/mindstorms/products/mindstorms-ev3-31313 mindstorms-ev3-31313)))
Die Umgebung ist wie folgt.
- macOS: 10.12.4
software:
- cc: Apple LLVM version 8.1.0 (clang-802.0.41)
- python: 3.6.1
Der erstellte Code lautet wie folgt. Es gab mehrere APIs zur Manipulation von Python-Dateien, daher werde ich drei Typen ausprobieren (io.FileIO, io.BaseIO, os).
test_syncw.c
// cc -Weverything -Ofast test_syncw.c -o test_syncw
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define TEST_COUNT 10000
#define DRIVER_FILE "DRIVER"
#define COMMAND "COMMAND"
int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
int fd = open(DRIVER_FILE, O_WRONLY | O_SYNC);
do {
clock_t elapsed_time;
do {
clock_t start_clock = clock();
for (int i = 0; i < TEST_COUNT; ++i) {
lseek(fd, 0, SEEK_SET);
write(fd, COMMAND, sizeof(COMMAND));
}
elapsed_time = clock() - start_clock;
} while(0);
printf("%lfus\n", (double) elapsed_time / TEST_COUNT * (1000000.0 / CLOCKS_PER_SEC));
} while(0);
close(fd);
return EXIT_SUCCESS;
}
test_syncw.py
import os
import io
import datetime
import time
TEST_COUNT = 10000
DRIVER_FILE = 'DRIVER'
COMMAND = b'COMMAND'
def test_with_fileio():
elapsed_time = -1
with io.FileIO(DRIVER_FILE, mode='w') as file:
start = time.time()
for i in range(TEST_COUNT):
file.seek(0)
file.write(COMMAND)
file.flush()
elapsed_time = (time.time() - start) * 1000000
file.close()
print(f'io.FileIO: {elapsed_time / TEST_COUNT}us')
def test_with_iobase():
elapsed_time = -1
with open(DRIVER_FILE, mode='wb', buffering=0) as file:
start = time.time()
for i in range(TEST_COUNT):
file.seek(0)
file.write(COMMAND)
file.flush()
elapsed_time = (time.time() - start) * 1000000
file.close()
print(f'io.IOBase: {elapsed_time / TEST_COUNT}us')
def test_with_os():
elapsed_time = -1
fd = os.open(DRIVER_FILE, flags=(os.O_WRONLY | os.O_SYNC))
start = time.time()
for i in range(TEST_COUNT):
os.lseek(fd, 0, os.SEEK_SET)
os.write(fd, COMMAND)
os.close(fd)
elapsed_time = (time.time() - start) * 1000000
print(f'os: {elapsed_time / TEST_COUNT}us')
if __name__ == '__main__':
test_with_fileio()
test_with_iobase()
test_with_os()
Versuchen Sie, den Code auszuführen. Eine geeignete Datei ('DRIVER') muss im Voraus erstellt werden.
$ touch DRIVER
$ cc -Weverything -Ofast test_syncw.c -o test_syncw
$ ./test_syncw
30.814900us
$ python test_syncw.py
io.FileIO: 3.4329us
io.IOBase: 3.3681us
os: 61.7254us
Pythons io.FileIO und io.IOBase können überhaupt nicht SYNC. Python OS ist langsamer als C, aber dies ist ein Zeitaufwand für den Vergleich.
Ich habe es 5 Mal wiederholt, nur für den Fall.
C | Python (os) | |
---|---|---|
1 | 33.2873us | 58.1087us |
2 | 33.6538us | 72.6557us |
3 | 33.2398us | 64.4080us |
4 | 34.0902us | 60.7077us |
5 | 34.0923us | 62.3773us |
Python dauert ungefähr doppelt so lange wie C, aber ich denke nicht, dass es ein absolutes Problem darstellt.