From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4477 invoked by alias); 24 Dec 2016 17:22:46 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 40231 Received: (qmail 1067 invoked from network); 24 Dec 2016 17:22:45 -0000 X-Qmail-Scanner-Diagnostics: from out3-smtp.messagingengine.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(66.111.4.27):SA:0(-0.7/5.0):. Processed in 1.551498 secs); 24 Dec 2016 17:22:45 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: d.s@daniel.shahaf.name X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at daniel.shahaf.name does not designate permitted sender hosts) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= daniel.shahaf.name; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-sender :x-me-sender:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=4/p99IQPImI6X/v orlD9U0Ivjrs=; b=jZJAWH5Ur2OK6opgKtTczBaJdVOVfpEp4sqiEsExXoURlyf vQntEHy50ZGcoJhdAG/TTFIyHXkcyL9wyO//P3BiC6KmT65UqUsVMEluUSy1mMby iCzidLAs3mlWqg+8A28yvsjDvlzY6GESvMAxBa1s2ANd8jPxjvVue2HoG/Ls= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-sender :x-me-sender:x-sasl-enc:x-sasl-enc; s=smtpout; bh=4/p99IQPImI6X/ vorlD9U0Ivjrs=; b=HVBWaxtMq67+z2KFbWaCZNnDcdS/jOgL9FrYz/Ty7XDPGC pwuV3p/1YPsjSa0LUJC37rQcU6QXhASCuN86D68JvcLvHLrUDDsYsn5wPHueNlfQ uZ0SR/WKu/rLO3lAh/+dnMVIjv+dnJ7GTpiIQw+Gyrvzro8nksODU6fi9JT80= X-ME-Sender: X-Sasl-enc: tBG5+swlxcoakKGd1V3JumwvPAcLCYWN/utWFEv7nRV8 1482600155 Date: Sat, 24 Dec 2016 17:19:36 +0000 From: Daniel Shahaf To: Zsh hackers list Cc: Sebastian Gniazdowski Subject: Re: Possible huge setarrvalue optimization Message-ID: <20161224171936.GA19748@fujitsu.shahaf.local2> References: <1479449829.1305485.791811385.14DDFE28@webmail.messagingengine.com> <1479461540.1340250.791913609.27FAD722@webmail.messagingengine.com> <1479471620.1371132.792049209.295BE093@webmail.messagingengine.com> <20161120114648.GA6953@fujitsu.shahaf.local2> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bCsyhTFzCvuiizWE" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) --bCsyhTFzCvuiizWE Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Bart Schaefer wrote on Sun, Nov 20, 2016 at 09:41:48 -0800: > This and the proposed getstr optimization both make me nervous. I know > Sebastian is anxious to have them appear in the next release, but it feels > and if we should have more time using them in dev branches. I assume we can go ahead now. Here's a revised patch based on my review upthread: diff --git a/Src/params.c b/Src/params.c index 82554a7..c4dad8f 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2708,6 +2708,23 @@ setarrvalue(Value v, char **val) post_assignment_length += pre_assignment_length - v->end; } + if (pre_assignment_length == post_assignment_length + && v->pm->gsu.a->setfn == arrsetfn + /* ... and isn't something that arrsetfn() treats specially */ + && 0 == (v->pm->node.flags & (PM_SPECIAL|PM_UNIQUE)) + && NULL == v->pm->ename) + { + /* v->start is 0-based */ + p = old + v->start; + for (r = val; *r;) { + /* Free previous string */ + zsfree(*p); + /* Give away ownership of the string */ + *p++ = *r++; + } + } + else + { p = new = (char **) zalloc(sizeof(char *) * (post_assignment_length + 1)); @@ -2726,6 +2743,7 @@ setarrvalue(Value v, char **val) post_assignment_length, (unsigned long)(p - new)); v->pm->gsu.a->setfn(v->pm, new); + } /* Ownership of all strings has been * given away, can plainly free */ @@ -3485,6 +3503,8 @@ arrsetfn(Param pm, char **x) /* Arrays tied to colon-arrays may need to fix the environment */ if (pm->ename && x) arrfixenv(pm->ename, x); + /* If you extend this function, update the list of conditions in + * setarrvalue(). */ } /* Function to get value of an association parameter */ If no objections, I'll reindent and push. Cheers, Daniel --bCsyhTFzCvuiizWE Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="0001-39996-Optimize-setarrvalue.patch" >>From b4870d1cab9db235860adcadd821069b2e2162e9 Mon Sep 17 00:00:00 2001 From: Sebastian Gniazdowski Date: Tue, 22 Nov 2016 09:26:46 +0000 Subject: [PATCH] AFTER RELEASE: 39996: Optimize setarrvalue(). --- Src/params.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Src/params.c b/Src/params.c index 82554a7..c4dad8f 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2708,6 +2708,23 @@ setarrvalue(Value v, char **val) post_assignment_length += pre_assignment_length - v->end; } + if (pre_assignment_length == post_assignment_length + && v->pm->gsu.a->setfn == arrsetfn + /* ... and isn't something that arrsetfn() treats specially */ + && 0 == (v->pm->node.flags & (PM_SPECIAL|PM_UNIQUE)) + && NULL == v->pm->ename) + { + /* v->start is 0-based */ + p = old + v->start; + for (r = val; *r;) { + /* Free previous string */ + zsfree(*p); + /* Give away ownership of the string */ + *p++ = *r++; + } + } + else + { p = new = (char **) zalloc(sizeof(char *) * (post_assignment_length + 1)); @@ -2726,6 +2743,7 @@ setarrvalue(Value v, char **val) post_assignment_length, (unsigned long)(p - new)); v->pm->gsu.a->setfn(v->pm, new); + } /* Ownership of all strings has been * given away, can plainly free */ @@ -3485,6 +3503,8 @@ arrsetfn(Param pm, char **x) /* Arrays tied to colon-arrays may need to fix the environment */ if (pm->ename && x) arrfixenv(pm->ename, x); + /* If you extend this function, update the list of conditions in + * setarrvalue(). */ } /* Function to get value of an association parameter */ --bCsyhTFzCvuiizWE--