From patchwork Tue Feb 4 21:22:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ren=C3=A9_Scharfe?= X-Patchwork-Id: 11365267 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E5D271398 for ; Tue, 4 Feb 2020 21:22:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C425521744 for ; Tue, 4 Feb 2020 21:22:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=web.de header.i=@web.de header.b="YJL+DP3s" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727494AbgBDVWn (ORCPT ); Tue, 4 Feb 2020 16:22:43 -0500 Received: from mout.web.de ([212.227.15.3]:58699 "EHLO mout.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727412AbgBDVWn (ORCPT ); Tue, 4 Feb 2020 16:22:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1580851356; bh=8JT4afp27C8mO92OF1egi7JO9F/1B7WdWcm0SouGrDY=; h=X-UI-Sender-Class:Subject:From:To:Cc:References:Date:In-Reply-To; b=YJL+DP3s0STU8l4bsTEP4g9l8VQ7h4EwwIqQT0c56SMyTwoQ4wAPJWTEXsWNiElyP 027NiDMOP1uqxfAHVbPOmVzhcTLo4Kn4ZNtRDOlVntZAfRen5tHBM/iz76GcLzn3bX jlFe5517PeSLlMV1UkYxjzuVHr5aQoyxNVEoqf2M= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Received: from [192.168.178.26] ([91.47.145.153]) by smtp.web.de (mrweb003 [213.165.67.108]) with ESMTPSA (Nemesis) id 0LhNmy-1jKvwi2o88-00mceF; Tue, 04 Feb 2020 22:22:36 +0100 Subject: [PATCH 06/10] name-rev: put struct rev_name into commit slab From: =?utf-8?q?Ren=C3=A9_Scharfe?= To: Git Mailing List Cc: =?utf-8?q?SZEDER_G=C3=A1bor?= , =?utf-8?q?Martin_?= =?utf-8?q?=C3=85gren?= , Junio C Hamano References: <084909f8-fefa-1fe0-b2ce-74eff47c4972@web.de> Message-ID: Date: Tue, 4 Feb 2020 22:22:36 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: <084909f8-fefa-1fe0-b2ce-74eff47c4972@web.de> Content-Language: en-US X-Provags-ID: V03:K1:5XxnMg4aEM/YN4BsbRLohtQtfc49hEKAaqEqiWAyGla0NHYypca mPp4MOxEdEttcIojRVUHLGGrsaWhgTkq3G2W/4upMxDLZe9jZqkZaFnp1DN+6VWJH9kKj05 SlZ1+MqEFb7wg1pzeA2ttIdUo4IenQuffYD613wNb8b1t5g1lUyJSf0gADg204kOoEgHV7H JCOaESDZo+0Utq131KjMA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:SQmLENH48TA=:7ZRmjO4wvHBRLLlnCC/XcM bkXsdgd7tzi12rPyj2lvPZ1Mx/x5SZ5/EOYRmFR6nYelCTNejtbkVwLYV/wU92L+dN8f2pddL NXyXP1El08Np5+L0DHz57MkE++1uLSgfb8ILRdZZAFRNGUShlHTzWSTmabypEdCNmxXxzaHjh 3FOB+/pXa2judeY56F/EV8Ic8LzTQdYp4G+FSffxfy5GJXWC1ozEh/xK5Q1JgoCMYNH6OJg0p mgcP56tuD8Hk0Z62adak791jH74gOharS5KVhb0eFGhXsRMvIlJ7A2h1d7u1ogj6gCXeu8uj0 Qi6RWJIU3aBli8yeYEQ1w2XSj0PhmE6TEuiTCyl5aJqdu2J6qGI3hQHUGvIgb3tGm9sdzvjj7 aQpWj2kCMYdAFAqDSbtfc2FYD/btBfB3ok4DLD6/dVg8l+z3zywbyiq95rvb1NE4d8lMK3LU2 ItgBPmYmyVFBpgzWJSfR1RCj+wcJVrwJZWAdqmNXashe9NASMc5FQeVka0PHyDn8jgOzGAlQT 4/tJPQtNr1orUHumYMgoavh8/2Lc3ZO9kwKd3fOzLtTd8nmFP5/+rqdv2KWO9frFz6S7XMCB2 AqnE1eAz6WA/fbCcYNr5dBwJLBT+Lw87HLsFYa13tV4JmayRjfO9xKwZeQ+CMBJ06Eh3LjwZj b9b+5PD1X5npG1uOI7W2YIDLlUkl2YQr34+bL5lZ07Xuh9raZVG2otAkxqOCENEEK/WQJPlKI awcqje7QgWDzGKOUZBjnkqPug7tZdgW/KcrtCrMkSD5AcarjsD0wtIEyKE0lnc+/8zuV/O87F GDDSxQVMj6pXo2SaV6V4bChVouLoL4ZjfznQQgWvxBtGxrpZ3WLaDNHhXI+q59xvvmKXcFmDk IhZC4Zf0D4dBO08UrO2PVyXeWGoaEDbqwbv0C6Wdpy66TFHx5rtcWEgZI8YbFJE17OqQeMTFc 4uk9C/nlXEbbYe3/VIeLuOYRztmKfNixCLO6b8PE55zu0RuM4LWvOlzoGC7J60gNmNi7AXFhy da+DOEvfNKwIq9dbX68x/pdze2oWbhiC9uCJKvZ+/ru1MlFlAOoVegPewbUwm4TRbxbyLQDYh I/weKPge0JEHjZktkYLDhkV0fBFg7ADO99D9w0B/d0DSfbQ6ff2wHf51XFuNK3AxeihrumV7D KAGv2TuyqZ+1jaAML89WmNaj7YhXdlLp227nnjACbT+7Hi0Nv2b/TU2ws0n3iph01C12/0vC/ 783qwgWNSXCwaDESA Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The commit slab commit_rev_name contains a pointer to a struct rev_name, and the actual struct is allocated separatly. Avoid that allocation and pointer indirection by storing the full struct in the commit slab. Use the tip_name member pointer to determine if the returned struct is initialized. Performance in the Linux repository measured with hyperfine before: Benchmark #1: ./git -C ../linux/ name-rev --all Time (mean ± σ): 953.5 ms ± 6.3 ms [User: 901.2 ms, System: 52.1 ms] Range (min … max): 945.2 ms … 968.5 ms 10 runs ... and with this patch: Benchmark #1: ./git -C ../linux/ name-rev --all Time (mean ± σ): 851.0 ms ± 3.1 ms [User: 807.4 ms, System: 43.6 ms] Range (min … max): 846.7 ms … 857.0 ms 10 runs Signed-off-by: René Scharfe --- builtin/name-rev.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) -- 2.25.0 diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 41aed436ca..14381a3c64 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -24,7 +24,7 @@ struct rev_name { int from_tag; }; -define_commit_slab(commit_rev_name, struct rev_name *); +define_commit_slab(commit_rev_name, struct rev_name); static timestamp_t cutoff = TIME_MAX; static struct commit_rev_name rev_names; @@ -32,11 +32,16 @@ static struct commit_rev_name rev_names; /* How many generations are maximally preferred over _one_ merge traversal? */ #define MERGE_TRAVERSAL_WEIGHT 65535 +static int is_valid_rev_name(const struct rev_name *name) +{ + return name && name->tip_name; +} + static struct rev_name *get_commit_rev_name(const struct commit *commit) { - struct rev_name **slot = commit_rev_name_peek(&rev_names, commit); + struct rev_name *name = commit_rev_name_peek(&rev_names, commit); - return slot ? *slot : NULL; + return is_valid_rev_name(name) ? name : NULL; } static int is_better_name(struct rev_name *name, @@ -81,15 +86,12 @@ static struct rev_name *create_or_update_name(struct commit *commit, int generation, int distance, int from_tag) { - struct rev_name **slot = commit_rev_name_at(&rev_names, commit); - struct rev_name *name = *slot; + struct rev_name *name = commit_rev_name_at(&rev_names, commit); - if (name && !is_better_name(name, taggerdate, distance, from_tag)) + if (is_valid_rev_name(name) && + !is_better_name(name, taggerdate, distance, from_tag)) return NULL; - if (!name) - name = *slot = xmalloc(sizeof(*name)); - name->tip_name = tip_name; name->taggerdate = taggerdate; name->generation = generation;