Schreiben Sie die O_SYNC-Datei in C und Python

Schreiben Sie die O_SYNC-Datei in C und Python

Überblick

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.

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

Vorbereitung

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

Experiment

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.

Recommended Posts

Schreiben Sie die O_SYNC-Datei in C und Python
Schreiben Sie einen C-Sprach-Unit-Test in Python
Implementieren Sie den FIR-Filter in Python und C.
Lesen und schreiben Sie JSON-Dateien mit Python
Dateiverarbeitung in Python
Schreiben Sie Python in MySQL
Weiter Python in C-Sprache
Dateimanipulation mit Python
C-API in Python 3
So generieren Sie eine Sequenz in Python und C ++
DL, Bytewert und Löschen der Datei in Python3
Erweitern Sie Python in C ++ (Boost.NumPy)
Datum / Uhrzeit und Schreiben und Sichern von Dateien
CSV-Datei lesen und schreiben
Schreiben Sie Pandec-Filter in Python
Schreiben Sie die Beta-Distribution in Python
Schreiben Sie Python in Rstudio (reticulate)
Experiment zum Vergleich der Schreibgeschwindigkeit von Dateien zwischen Python 2.7.9 und Pypy 2.5.0
Dateien lesen und schreiben
Binäre Suche in Python / C ++
Lesen und Schreiben von Gleitkommazahlen mit einfacher Genauigkeit in Python
Schreiben Sie Tests in Python, um die Abdeckung zu profilieren und zu überprüfen
Stapel und Warteschlange in Python
Dateien schreiben und lesen
Lesen und schreiben Sie NFC-Tags mit Python mit PaSoRi
Unittest und CI in Python
Holen Sie sich den MIME-Typ in Python und bestimmen Sie das Dateiformat
Überlegen Sie, ob das Programmieren in Python und C ein Anime war
Ruft Makrokonstanten aus der C (++) - Headerdatei (.h) in Python ab
Objektorientiert in C-Sprache: "○ ✕ game" wurde überarbeitet und nach Python portiert
Schreiben Sie eine Dichotomie in Python
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Manipulation des Datei- / Ordnerpfads in Python
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Speichern Sie die Binärdatei in Python
Schreiben Sie die AWS Lambda-Funktion in Python
ABC166 in Python A ~ C Problem
Bearbeiten Sie Dateien und Ordner in Python
Über Python und Cython dtype
Schreiben Sie A * (A-Stern) -Algorithmen in Python
Zuweisungen und Änderungen in Python-Objekten
Erstellen Sie eine Binärdatei in Python
Überprüfen und verschieben Sie das Verzeichnis in Python
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Lesen und Schreiben von Python CSV-Dateien
Schreiben Sie Selentestcode in Python
Hashing von Daten in R und Python
Löse ABC036 A ~ C mit Python
Schreiben Sie ein Kreisdiagramm in Python
Schreiben Sie das Vim-Plugin in Python
Schreiben Sie eine Suche mit Tiefenpriorität in Python
So verpacken Sie C in Python
Funktionssynthese und Anwendung in Python
Python-Memo ① Ordner- und Dateivorgänge
Exportieren und Ausgeben von Dateien in Python
ORC, Parkettdateivorgänge in Python
Reverse Flat Pseudonym und Katakana in Python2.7
Löse ABC037 A ~ C mit Python