Comparez le coût en temps d'écriture d'un fichier en C et Python.
Le temps moyen requis pour chaque écriture lorsque les données appropriées ('COMMAND') sont écrites depuis le début du fichier dans le fichier approprié existant ('DRIVER') le nombre approprié de fois (10000 fois). Mesurez le coût. (L'ouverture / la fermeture du fichier n'est pas incluse dans le coût en temps.)
La raison de l'écriture des données depuis le début du fichier à chaque fois est à cause de Background décrit plus loin.
31313 J'exécute ev3dev sur Mindstorm EV3 et j'envoie des instructions au fichier de l'appareil lors du contrôle du moteur, mais je me demandais s'il y avait une différence de vitesse entre C et Python uniquement pour ce processus.
--31313 Mindstorm EV3 (https://www.lego.com/ja-jp/mindstorms/products/mindstorms-ev3-31313 mindstorms-ev3-31313)))
L'environnement est le suivant.
- macOS: 10.12.4
software:
- cc: Apple LLVM version 8.1.0 (clang-802.0.41)
- python: 3.6.1
Le code créé est le suivant. Il y avait plusieurs API de manipulation de fichiers Python, je vais donc essayer trois types (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()
Essayez d'exécuter le code. Un fichier approprié ('DRIVER') doit être créé à l'avance.
$ 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
Les io.FileIO et io.IOBase de Python ne sont pas capables de SYNC en premier lieu. Python os est plus lent que C, mais cela coûte du temps à comparer.
Je l'ai répété 5 fois au cas où.
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 prend environ deux fois plus de temps que C, mais je ne pense pas que ce soit un niveau de préoccupation absolu.
Recommended Posts