Stream mit Nullen füllen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Stream mit Nullen füllen

Beitrag von BeRsErKeR »

Mal eine grundsätzliche Frage. Sagen wir mal, ich habe einen Stream und muss nun einen großen Block Nullen einfügen (z.B. um einen Sektor aufzufüllen).

Wäre es performanter ein Byte-Array mit der Größe anzulegen und dieses Byte-Array in den Stream zu schreiben oder ist hier eine for-Schleife mit n WriteByte-Aufrufen besser? Speziell geht es hier um C#, genauer BinaryWriter / Stream.

Ich könnte mir vorstellen, dass 1 Aufruf besser ist als viele, aber ich muss halt ein dynamisches Array anlegen, also in den Heap langen. Wobei es hier eventuell auch auf die Größe des Blocks ankommt, da somit ja auch die WriteByte-Aufrufe in der Schleife bzw. die Schleifendurchläufe ansteigen.

Vielleicht kann mir ja jemand sagen, ab wann sich was lohnt oder ob womöglich eine Variante in jedem Fall die bessere ist. Oder vielleicht sogar noch eines bessere Möglichkeit zeigen. ;)

Was mir so spontan noch einfällt, wäre ein statisches Array auf dem Stack mit einer geeigneten Größe, welches ich mehrfach in den Stream schreibe, sodass ich am Ende maximal noch StaticArraySize - 1 einzelne Bytes rausschreiben muss. Allerdings ist dann wieder die Frage wie groß so ein Array sein sollte.

Zur Info: Ich habe viele Streams / Teilstreams wo ich das ganze tun muss. Die Größe der Null-Blöcke ist mir bekannt, allerdings ist diese für jeden Stream unterschiedlich und erst zur Laufzeit bekannt.
Ohne Input kein Output.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Stream mit Nullen füllen

Beitrag von Artificial Mind »

Wenn du in C# schreibst, dann musst du mit dieser Stack/Heap-Unterscheidung eh vorsichtig sein. Eine VM hat ihre eigenen Vorstellungen von Speicher, insbesondere mit JIT.
(Falls ich hier falsch liege, würde ich es _lieben_ wenn mir jemand zeigen kann, dass es doch deterministisch ist und wie man damit umgeht ....)

Und viele Funktionsaufrufe sind auch teuer.
Um den overhead also gering zu halten, würde ich die Array-Variante bevorzugen.
C# initialisiert doch afaik Speicher sowieso vor Benutzung, also sollte new byte[n] bereits reichen, oder?

Andere Frage: ist der Code wirklich dermaßen zeitkritisch? im Notfall kannst du einfach messen, welche Variante schneller ist. Aber ich kann mir auch gut vorstellen, dass du hier am falschen Ende optimierst.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: Stream mit Nullen füllen

Beitrag von BeRsErKeR »

Artificial Mind hat geschrieben:Andere Frage: ist der Code wirklich dermaßen zeitkritisch? im Notfall kannst du einfach messen, welche Variante schneller ist. Aber ich kann mir auch gut vorstellen, dass du hier am falschen Ende optimierst.
Naja es geht mir eigentlich weniger um die Optimierung meines Codes, der in der Tat nicht zeitkritisch ist. Ich bin halt über dieses Problem gestolpert und hab mir die oben genannte Frage gestellt. Die Frage ist aber eher interessehalber und wer weiß; vielleicht kommt mir das ganze mal wieder vor die Flinte, wenn das ganze doch mal zeitkritisch ist.

Danke für die Antwort. ;) Ich hatte in meinem Fall auch die Array-Variante benutzt. In meinem Fall ist die Größe des Blocks eh sehr limitiert auf rund 4000 Bytes (maximal).
Ohne Input kein Output.
Antworten