* [PATCH] ds: tmpio: avoid Perl target cache
@ 2021-10-06 11:50 Eric Wong
0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2021-10-06 11:50 UTC (permalink / raw)
To: meta
The use of `substr' here an argument to `print' was causing Perl
to internally cache its target buffer. Since `syswrite()'
already offers a buffer offset arg and length limits, just use
`syswrite' directly. We were using autoflush anyways, so the
lack of buffering was of no concern performance-wise.
The target buffer could get to roughly ~10MB under some loads,
but it was usually a cold path and using memory which cannot be
released nor reused in other places.
note: IO::Handle::write uses `substr' internally, too;
so nothing would be gained using IO::Handle:write.
---
lib/PublicInbox/DS.pm | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm
index debb777a..9cca02d7 100644
--- a/lib/PublicInbox/DS.pm
+++ b/lib/PublicInbox/DS.pm
@@ -494,16 +494,15 @@ sub drop {
$self->close;
}
-# n.b.: use ->write/->read for this buffer to allow compatibility with
-# PerlIO::mmap or PerlIO::scalar if needed
sub tmpio ($$$) {
my ($self, $bref, $off) = @_;
my $fh = tmpfile('wbuf', $self->{sock}, O_APPEND) or
return drop($self, "tmpfile $!");
$fh->autoflush(1);
my $len = length($$bref) - $off;
- print $fh substr($$bref, $off, $len) or
+ my $n = syswrite($fh, $$bref, $len, $off) //
return drop($self, "write ($len): $!");
+ $n == $len or return drop($self, "wrote $n < $len bytes");
[ $fh, 0 ] # [1] = offset, [2] = length, not set by us
}
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2021-10-06 11:50 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-06 11:50 [PATCH] ds: tmpio: avoid Perl target cache Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).