C/C++ beste Weg, um zu senden, eine Anzahl von bytes auf stdout
Profiling meinem Programm und der Funktion Druck ist dabei eine Menge Zeit zu führen. Wie kann ich senden "raw" - byte-output direkt auf stdout anstelle von fwrite, und macht es schneller (senden müssen alle 9bytes in der print() in der gleichen Zeit, um die stdout) ?
void print(){
unsigned char temp[9];
temp[0] = matrix[0][0];
temp[1] = matrix[0][1];
temp[2] = matrix[0][2];
temp[3] = matrix[1][0];
temp[4] = matrix[1][1];
temp[5] = matrix[1][2];
temp[6] = matrix[2][0];
temp[7] = matrix[2][1];
temp[8] = matrix[2][2];
fwrite(temp,1,9,stdout);
}
Matrix definiert ist weltweit ein unsigned char matrix[3][3];
das können Sie nicht. versuchen Sie drucken weniger, oder gepufferten Ausgabe ostream
InformationsquelleAutor Milan | 2009-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
IO ist nicht einer kostengünstigen Betrieb. Es ist in der Tat eine Sperrung Betrieb, was bedeutet, dass das OS kann preempt Ihren Prozess, wenn Sie anrufen
write
damit mehr CPU-gebundene Prozesse, die ausgeführt werden, bevor die IO-device schreiben Sie zum Abschluss des Vorgangs.Nur die unteren level-Funktion, die Sie verwenden können (wenn Sie die Entwicklung auf einem *nix-Maschine), ist die Verwendung des raw -
write
Funktion, aber auch dann Ihre Leistung wird nicht so viel schneller als es jetzt ist. Einfach ausgedrückt: IO ist teuer.InformationsquelleAutor FreeMemory
Am besten bewerteten Antwort behauptet, dass IO ist langsam.
Hier ein kurzer benchmark mit einem ausreichend großen Puffer zu nehmen, das OS aus der kritischen Leistung Weg, aber nur, wenn Sie bereit sind, erhalten Sie Ihre Ausgabe in riesigen blurps. Wenn die Latenz für den ersten byte, das ist Ihr problem, müssen Sie die Ausführung in "dribs" - Modus.
Schreibe 10 Millionen Datensätze aus einer neun-byte-array
Mint 12 auf AMD64 3GHz CoreDuo unter gcc 4.6.1
FreeBSD 9 AMD64 mit 2,4 GHz CoreDuo unter clang 3.0
Es ist nichts langsam über IO wenn Sie sich leisten können Puffer richtig.
InformationsquelleAutor Allan Stokes
Vielleicht ist Ihr problem ist nicht, dass fwrite() ist langsam, aber es ist gepuffert.
Versuchen Sie den Aufruf fflush(stdout) nach dem fwrite().
Dies alles hängt wirklich davon ab, Ihre definition von langsam in diesem Kontext.
InformationsquelleAutor Darron
Den rohsten form der Ausgabe, die Sie tun können, ist das wahrscheinlich die
write
- system aufrufen, wie dies1 ist der Datei-Deskriptor für standard (0 ist standard, und 2 standard-error). Ihre standard-out schreibt nur so schnell, wie das eine, es zu Lesen, am anderen Ende (d.h. das terminal oder das Programm, das Sie pipeing in), die möglicherweise eher langsam.
Bin ich mir nicht 100% sicher, aber Sie könnten versuchen, Einstellung, non-blocking IO auf fd 1 (
fcntl
) und hoffe, dass der OS-Puffer wird es für Sie, bis es verzehrt werden kann, indem das andere Ende. Es ist schon eine Weile her, aber ich denke, es funktioniert soYMMV though. Bitte korrigieren Sie mich, wenn ich falsch bin, auf die syntax, wie ich schon sagte, es ist schon eine Weile her.
Verwenden
stdout
statt der magischen Zahl 1, besser lesbaren, mindestens.außer
stdout
ist einFILE*
nicht ein file-descriptor, also das wäre falsch. Ich denke, es gibt einige standardisierte Konstanten irgendwo wieFILENO_STDOUT
oder so etwas. Nicht 100% sicher, aber.InformationsquelleAutor falstro
Alle Druck ist ziemlich langsam, obwohl iostreams sind wirklich langsam den Druck.
Ihre beste Wette wäre die Verwendung von printf, etwas entlang der Linien von:
InformationsquelleAutor jasedit
Können Sie einfach:
printf ist mehr C-Style.
Doch, IO-Operationen sind teuer, so setze Sie mit bedacht.
InformationsquelleAutor vdsf
Wie jeder darauf hingewiesen hat IO in engen innere Schleife ist teuer. Ich habe normalerweise endete damit, dass bedingte cout Matrix basierend auf einigen Kriterien, wenn erforderlich, um zu Debuggen.
Wenn Ihre app console app dann versuchen Sie umleiten in eine Datei, es wird viel schneller als Konsole aktualisiert. e.g app.exe > matrixDump.txt
InformationsquelleAutor Ketan
Was ist falsch mit:
sowohl die eins und die zwei eindimensionale arrays nehmen den gleichen Speicher.
InformationsquelleAutor
Versuchen, das Programm zweimal. Sobald mit der Ausgabe und einmal ohne. Sie werden feststellen, dass, insgesamt gesehen, das eine ist ohne das io ist der Schnellste. Außerdem könnten Sie Gabel-der Prozess (oder einen thread eröffnen), ein schreiben in eine Datei um(stdout), und man dabei die Vorgänge.
InformationsquelleAutor Daniel