Thread testcase schlägt fehl (36 answers)
Opened by GwenDragon at 2017-07-19 21:24

rosti
 2017-07-20 19:12
#186987 #186987
User since
2011-03-19
3243 Artikel
BenutzerIn
[Homepage]
user image
Was für Dich Best Practice ist, musst Du selbst entscheiden. Ich gebe hier nur Erfahrungen weiter, die ich beim Entwickeln eigener Serializer und mit Binärdateien gemacht habe. Auf die Idee, eine Binärdatei wie eine Textdatei zu lesen bin ich offen gestanden noch nie gekommen, Binaries lese ich grundsätzlich mit read(), das ist überhaupt keine Frage. Genauso wie es für einen c-Programmierer keine Frage ist, eine andere Funktion als fread() zu benutzen wenn Binaries zu lesen sind. Siehe auch http://rolfrost.de/abstraktc.html und http://rolfrost.de/perl2c.html

Das Proplem, dass binmode auf Win32 keinen Effekt hat, offenbarte sich bei mir mit einer älteren Perlversion. Es mag sein, dass dies Problem mittlerweile auch gar keins mehr ist. Ich für meinen Teil habe nunmal aus meinen Erfahrungen gelernt und nur das gebe ich gerne hier weiter. Dazu gehört auch, dass ich Dateiarbeit grundsätzlich mit IO::File erledige und aufgrund langjähriger Erfahrung in heterogenen Netzwerk- wie Rechnerumgebungen behandle ich auch Textdateien grundsätzlich wie Binärdateien. Schließlich arbeitet Perl per Default auch byteorientiert.

Und ja, eine Datei nur zum Schreiben zu locken verhindert lediglich eine mögliche Zerstörung infolge Raceconditions. Konsistente Daten jedoch bekommst Du nur, wenn Schreiben UND Lesen unteilbar zusammengehören. Von daher wäre es besser Du erstellst ein FileHandle, machst da den LOCK_EX und übergibst es zusammen mit der zu serialisierenden Datenstruktur in Deine Subs. Das $sereal Objekt könntest Du auch über die Funktionen stellen dann hast Du das auch aus der Schleife raus und gewinnst Performance.

MfG

Edit:

Fazit: In der Regel werden Binärdateien blockweise gelesen, so dass sich die Frage des Diamond Operators überhaupt nicht stellt. Siehe also read()
Last edited: 2017-07-21 14:14:00 +0200 (CEST)

View full thread testcase schlägt fehl