From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 300B51F51F for ; Mon, 26 Sep 2022 10:17:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1664187436; bh=rbMgC5QtbTU9PPKh2RwxKl29ZBbA5Sbt3cHuPCsHcTA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=YeuErcFSqhicvLZNaWzo5JN85SuYKg+BMi6I9yYxKygkE4s11jfCkIa7U91mCbkB3 iGDBxUoSAA/oT5BPqBmfibVsY+GsKBfRgc3FoqA1IHi13dH+7YRr/z78Xr4Du5FVyU c9hFE9bnM7f+Oum/wfeTr2ODsz9Ifhn1/aoKXqb0= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 1/4] viewdiff: save memory by eliminating two captures Date: Mon, 26 Sep 2022 10:17:12 +0000 Message-Id: <20220926101715.1853-2-e@80x24.org> In-Reply-To: <20220926101715.1853-1-e@80x24.org> References: <20220926101715.1853-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Avoid relying on $DIGIT captures when @- and @+ to access last match start and end, respectively. The elimination of the post capture ought to allow the use of sv_chop to advance the string start pointer without memory copies. This ought to save 1-2MB of memory on my system since I've noticed the captures was using a big chunk of scratchpad space. --- lib/PublicInbox/ViewDiff.pm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/PublicInbox/ViewDiff.pm b/lib/PublicInbox/ViewDiff.pm index 9a7adb57..95bbf2d2 100644 --- a/lib/PublicInbox/ViewDiff.pm +++ b/lib/PublicInbox/ViewDiff.pm @@ -154,16 +154,16 @@ sub diff_header ($$$) { sub diff_before_or_after ($$) { my ($ctx, $x) = @_; - if (exists $ctx->{-anchors} && $$x =~ /\A(.*?) # likely "---\n" # \$1 - # diffstat lines: - ((?:^\x20(?:[^\n]+?)(?:\x20+\|\x20[^\n]*\n))+) - (\x20[0-9]+\x20files?\x20)changed, - (.*?)\z/msx) { # notes, commit message, etc - my @x = ($4, $3, $2, $1); - undef $$x; + if (exists $ctx->{-anchors} && $$x =~ # diffstat lines: + /((?:^\x20(?:[^\n]+?)(?:\x20+\|\x20[^\n]*\n))+) + (\x20[0-9]+\x20files?\x20)changed,/msx) { + my $pre = substr($$x, 0, $-[0]); # (likely) short prefix + substr($$x, 0, $+[0], ''); # sv_chop on $$x ($$x may be long) + my @x = ($2, $1); my $lnk = $ctx->{-linkify}; my $zfh = $ctx->{zfh}; - print $zfh $lnk->to_html(pop @x); # $1 uninteresting prefix + # uninteresting prefix + print $zfh $lnk->to_html($pre); for my $l (split(/^/m, pop(@x))) { # $2 per-file stat lines $l =~ /^ (.+)( +\| .*\z)/s and anchor0($ctx, $1, $2) and next; @@ -173,7 +173,7 @@ sub diff_before_or_after ($$) { print $zfh pop(@x), # $3 /^ \d+ files? / qq(changed,), # insertions/deletions, notes, commit message, etc: - $lnk->to_html(@x); + $lnk->to_html($$x); } else { print { $ctx->{zfh} } $ctx->{-linkify}->to_html($$x); }