Ecrire le fichier O_SYNC en C et Python

Ecrire le fichier O_SYNC en C et Python

Aperçu

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.

Contexte

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)))

Préparation

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()

Expérience

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

Ecrire le fichier O_SYNC en C et Python
Ecrire un test unitaire de langage C en Python
Implémenter le filtre FIR en langage Python et C
Lire et écrire des fichiers JSON avec Python
Traitement de fichiers en Python
Ecrire Python dans MySQL
Next Python en langage C
Manipulation de fichiers avec Python
API C en Python 3
Comment générer une séquence en Python et C ++
DL, valeur d'octet et suppression de fichier en Python3
Étendre python en C ++ (Boost.NumPy)
datetime et écriture et sauvegarde de fichiers
Lire et écrire un fichier csv
Ecrire des filtres Pandec en Python
Écrire une distribution bêta en Python
Ecrire python dans Rstudio (réticulé)
Expérience de comparaison de la vitesse d'écriture de fichier entre python 2.7.9 et pypy 2.5.0
Lire et écrire des fichiers
Recherche binaire en Python / C ++
Lire et écrire en virgule flottante simple précision en Python
Écrire des tests en Python pour profiler et vérifier la couverture
Pile et file d'attente en Python
Écrire et lire des fichiers
Lire et écrire des balises NFC avec python en utilisant PaSoRi
Unittest et CI en Python
Obtenez le type MIME en Python et déterminez le format de fichier
Considérez si la programmation était un anime en Python et C
Obtenir des constantes de macro à partir du fichier d'en-tête C (++) (.h) en Python
Orienté objet en langage C: "○ ✕ game" a été refacturé et porté en Python
Ecrire une dichotomie en Python
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Manipulation de chemin de fichier / dossier en Python
Différence entre list () et [] en Python
Différence entre == et est en python
Afficher les photos en Python et html
Algorithme de tri et implémentation en Python
Enregistrez le fichier binaire en Python
Ecrire une fonction AWS Lambda en Python
ABC166 en Python A ~ C problème
Manipuler des fichiers et des dossiers en Python
À propos de Python et Cython dtype
Ecrire des algorithmes A * (A-star) en Python
Affectations et modifications des objets Python
Créer un fichier binaire en Python
Vérifiez et déplacez le répertoire en Python
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Lecture et écriture de fichiers CSV Python
Ecrire le code de test du sélénium en python
Hashing de données en R et Python
Résoudre ABC036 A ~ C avec Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Comment envelopper C en Python
Synthèse de fonctions et application en Python
Mémo Python ① Opérations sur les dossiers et fichiers
Exporter et exporter des fichiers en Python
ORC, opérations de fichier Parquet en Python
Inverser le pseudonyme plat et le katakana en Python2.7
Résoudre ABC037 A ~ C avec Python