Bei der Fehlerbehebung einige Leistungsprobleme in unseren Anwendungen, fand ich heraus, dass C stdio.h
Funktionen (und zumindest für unseren Hersteller, C++ fstream
Klassen) Threadssafe sind. Als Ergebnis muss die RTL jedes Mal, wenn ich etwas so Einfaches wie mache, eine Sperre erfassen, ein Byte lesen und die Sperre aufheben.Nicht-ThreadSafe-Datei E/A in C/C++
Dies ist nicht gut für die Leistung.
Was ist der beste Weg, um non-threadsafe Datei-I/O in C und C++ zu bekommen, so dass ich mich selbst sperren kann und bessere Leistung bekomme?
- MSVC bietet
_fputc_nolock
und GCC bietetunlocked_stdio
undflockfile
, aber ich kann keine ähnlichen Funktionen in meinem Compiler (CodeGear C++ Builder) finden. - Ich könnte die rohe Windows-API verwenden, aber das ist nicht portierbar und ich nehme an, wäre langsamer als ein entsperrtes fgetc für Zeichen-zu-Zeit-I/O.
- Ich könnte zu etwas wie die Apache Portable Runtime wechseln, aber das könnte möglicherweise eine Menge Arbeit sein.
Wie nähern sich andere diesem?
Bearbeiten: Da ein paar Leute sich wunderten, hatte ich dies vor dem Posten getestet. fgetc
führt keine Systemaufrufe aus, wenn es Lesevorgänge aus seinem Puffer erfüllen kann, aber es macht immer noch Sperren, so dass die Sperrung einen enormen Prozentsatz an Zeit beansprucht (Hunderte von Sperren für einen einzelnen Datenblock, der von der Festplatte gelesen wird)). Es wäre keine Lösung, Zeichen-auf-Zeit-E/A zu verwenden, aber die Klassen fstream
von C++ Builder verwenden leider fgetc (wenn ich also iostream
Klassen verwenden möchte, bin ich damit beschäftigt), und ich habe eine Menge von altem Code, der fgetc
und Freunde verwendet, um Felder aus Record-style-Dateien zu lesen (was vernünftig wäre, wenn es keine Sperrprobleme gäbe).
Cs stdio.h Funktionen sind nicht threadsafe; das ist auch dein Verkäufer. – MSalters
Nicht nur mein Verkäufer; POSIX zum Beispiel benötigt es. –