No, I don't think so. I am not sure what your code has to do with anything. If you flush STDOUT after every write, that is same as un-buffering it.
Consider Program 1:
#!/usr/bin/perl
use warnings;
for my $i (1..5)
{
$x+1; # here just to throw an error to STDERR
print "$i\n";
}
__END__
Useless use of addition (+) in void context at C:\Projects_Perl\testin
+g\demoStdErrorTiming1.pl line 6.
Name "main::x" used only once: possible typo at C:\Projects_Perl\testi
+ng\demoStdErrorTiming1.pl line 6.
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming1.pl line 6.
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming1.pl line 6.
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming1.pl line 6.
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming1.pl line 6.
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming1.pl line 6.
1
2
3
4
5
Consider Program 2:
#!/usr/bin/perl
use warnings;
$|=1; ### BIG DEAL HERE ### Unbuffers STDOUT
for my $i (1..5)
{
$x+1; #here just to throw an error to STDERR
print "$i\n";
}
__END__
Useless use of addition (+) in void context at C:\Projects_Perl\testin
+g\demoStdErrorTiming2.pl line 7.
Name "main::x" used only once: possible typo at C:\Projects_Perl\testi
+ng\demoStdErrorTiming2.pl line 7.
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming2.pl line 7.
1
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming2.pl line 7.
2
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming2.pl line 7.
3
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming2.pl line 7.
4
Use of uninitialized value $x in addition (+) at C:\Projects_Perl\test
+ing\demoStdErrorTiming2.pl line 7.
5
Program 1's error messages come out right way while stdout messages come later because the stdout's filehandle's output buffer is not ready to be "flushed", "printed".
Program 2's error messages are interleaved with "normal" prints because the normal prints are being prematurely flushed out. There is a big,(can be HUGE) performance penalty for this but, this makes debugging easier. |