write() und fprintf(), fflush()



  • Mal 'ne schnelle Frage, was ist effizienter, write() oder fprintf() mit fflush()?
    Und wieso benötigt man fflush() überhaupt?


  • Global Moderator

    Die spezialisierte Funktion (hier vermeintlich write, welches speziell nur rohe char-Arrays ausgeben kann) ist im Zweifelsfalle immer schneller als die allgemeine Funktion (hier vermeintlich fprintf, welches eine Funktion zum Ausgeben von komplex formatierten Daten ist). Warum sage ich "vermeintlich"? Weil write gar keine Spezialisierung von fprintf ist! fprintf kann gar keine rohen char-Arrays ausgeben. Die Frage macht daher nicht wirklich Sinn. Da beide Funktionen komplett unterschiedliche Dinge tun, musst du logischer die Funktion nehmen, die das Ding tut, das du möchtest.

    Passender wäre die Frage nach write vs. fwrite, oder die Frage nach fprintf vs. fputs oder fputc.

    Die Antwort auf write vs. fwrite ist: Gleich effizient, bloß ist das eine ANSI-C, das andere Posix, unter der Haube wird das gleiche passieren (im Zweifelsfall ruft fwrite einfach direkt write auf).

    Bei fprintf gegen fputs/fputc gilt das, was ich über spezialisierte Funktionen gegen allgemeine Funktionen gesagt habe: fprintf kann char, Zeichenketten und noch viel mehr ausgeben. Dazu muss es den Formatstring analysieren und ruft dann eventuell sogar selber die jeweilige Spezialfunktion auf. Es ist also effizienter direkt die Spezialfunktion aufzurufen. Viele Compiler sind aber in der Lage, einfache Formatstrings wie "%c" oder "%s\n" zu erkennen und setzen dann statt des fprintf-Aufrufs direkt die passende Spezialfunktion ein. Bei einem einigermaßen guten, optimierenden Compiler also auch kein Unterschied.

    wieso benötigt man fflush() überhaupt?

    Um das zu erreichen, was die Funktionsbeschreibung erklärt. Es ist sehr selten, dass man diesen Effekt in der Praxis benötigt.