Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge: break out of all_strategy loop when strategy is found #1429

Closed
wants to merge 1 commit into from

Conversation

AtariDreams
Copy link

strncmp does not modify any of the memory,
so looping through all elements is a waste of resources.

Signed-off-by: Seija Kijin doremylover123@gmail.com

@AtariDreams
Copy link
Author

/submit

@gitgitgadget-git
Copy link

Submitted as pull.1429.git.git.1673203153257.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-git-1429/AtariDreams/exit-v1

To fetch this version to local tag pr-git-1429/AtariDreams/exit-v1:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-git-1429/AtariDreams/exit-v1

@gitgitgadget-git
Copy link

On the Git mailing list, Junio C Hamano wrote (reply to this):

"Rose via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: Seija Kijin <doremylover123@gmail.com>
>
> strncmp does not modify any of the memory,
> so looping through all elements is a waste of resources.

Modifying or not probably has little to do with why we may want to
do this change.

Here, we are trying to see which commands that appear in the
main_cmds table do not appear in the all_strategy[] table.  The way
we do so is by iterating over the main_cmds table, and for each of
the command, if it is found in the all_strategy[] table.  If there
is one, then found bit is set.  If there isn't, then found bit is
left clear.  After looping over all_strategy[] table, we act upon
the value of the found bit.

So, as soon as we find one match in all_strategy[] table and flip
the found bit on, in the loop we never clear the bit.  So it does
make sense to break out of that inner loop once we find a single
match.

    Once we find a match, there is no point to try finding the
    second match in the inner loop.  Break out of the loop once we
    find the first match.

would be a more appropriate explanation.

>  builtin/merge.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/builtin/merge.c b/builtin/merge.c
> index 0f093f2a4f2..5ab0feb47b6 100644
> --- a/builtin/merge.c
> +++ b/builtin/merge.c
> @@ -189,9 +189,12 @@ static struct strategy *get_strategy(const char *name)
>  			int j, found = 0;
>  			struct cmdname *ent = main_cmds.names[i];
>  			for (j = 0; j < ARRAY_SIZE(all_strategy); j++)
> -				if (!strncmp(ent->name, all_strategy[j].name, ent->len)
> -						&& !all_strategy[j].name[ent->len])
> +				if (!strncmp(ent->name, all_strategy[j].name,
> +					     ent->len) &&
> +				    !all_strategy[j].name[ent->len]) {
>  					found = 1;
> +					break;
> +				}

The above is not wrong per-se, but we can do the same with less
damage to the code, e.g.

 builtin/merge.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git c/builtin/merge.c w/builtin/merge.c
index dd474371a2..2437aae6bc 100644
--- c/builtin/merge.c
+++ w/builtin/merge.c
@@ -188,7 +188,7 @@ static struct strategy *get_strategy(const char *name)
 		for (i = 0; i < main_cmds.cnt; i++) {
 			int j, found = 0;
 			struct cmdname *ent = main_cmds.names[i];
-			for (j = 0; j < ARRAY_SIZE(all_strategy); j++)
+			for (j = 0; !found && j < ARRAY_SIZE(all_strategy); j++)
 				if (!strncmp(ent->name, all_strategy[j].name, ent->len)
 						&& !all_strategy[j].name[ent->len])
 					found = 1;


I've mentioned it before, but could you please drop the

    Rose <83477269+AtariDreams@users.noreply.github.com>

address from the Cc: list?  It is rude to force those who want to
respond to you to remove the non-working address that is meant not
to receive any responses.

Thanks.

strncmp does not modify any of the memory.
Once we find a match, there is no point
in trying to find the second match
in the inner loop.

Break out of the loop once we
find the first match.

Signed-off-by: Seija Kijin <doremylover123@gmail.com>
@AtariDreams
Copy link
Author

/submit

@gitgitgadget-git
Copy link

Submitted as pull.1429.v2.git.git.1673285669004.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-git-1429/AtariDreams/exit-v2

To fetch this version to local tag pr-git-1429/AtariDreams/exit-v2:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-git-1429/AtariDreams/exit-v2

@gitgitgadget-git
Copy link

On the Git mailing list, Junio C Hamano wrote (reply to this):

"Rose via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: Seija Kijin <doremylover123@gmail.com>
>
> strncmp does not modify any of the memory.

It may be a correct statement, but so what?  It does not seem to
have relevance to this change.

> diff --git a/builtin/merge.c b/builtin/merge.c
> index 0f093f2a4f2..74de2ebd2b3 100644
> --- a/builtin/merge.c
> +++ b/builtin/merge.c
> @@ -188,7 +188,7 @@ static struct strategy *get_strategy(const char *name)
>  		for (i = 0; i < main_cmds.cnt; i++) {
>  			int j, found = 0;
>  			struct cmdname *ent = main_cmds.names[i];
> -			for (j = 0; j < ARRAY_SIZE(all_strategy); j++)
> +			for (j = 0; !found && j < ARRAY_SIZE(all_strategy); j++)
>  				if (!strncmp(ent->name, all_strategy[j].name, ent->len)
>  						&& !all_strategy[j].name[ent->len])
>  					found = 1;

I am not sure if this micro-optimization is worth it.  

If this loop is so costly that it needs optimization, a better thing
to do would be to rethink the way it filters main_cmds.names[] array
with all_strategy[].  The latter is a fairly small, and more
importantly, a constant set of known strategies, so there should be
a more efficient way than O(n*m) nested loop.

The code churn has already costed us too much, mostly reviewer and
maintainer time, for the value of the change itself.  I'll queue the
patch as-is, because this change is not making anything worse
per-se, but primarily because I do not want the topic to take any
more of our resources.

Thanks.

@gitgitgadget-git
Copy link

This branch is now known as sk/merge-filtering-strategies-micro-optim.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 61db8b8.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 4d5faa9.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 2319922.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via c920dfb.

@gitgitgadget-git
Copy link

There was a status update in the "New Topics" section about the branch sk/merge-filtering-strategies-micro-optim on the Git mailing list:

Micro optimization.

Will merge to 'next'.
source: <pull.1429.v2.git.git.1673285669004.gitgitgadget@gmail.com>

@gitgitgadget-git
Copy link

This patch series was integrated into seen via b940995.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 6fcb8cb.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 32dcc2c.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 3ab222e.

@gitgitgadget-git
Copy link

This patch series was integrated into next via f171559.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 5856d1b.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via a9f56d9.

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 7572b99.

@gitgitgadget-git
Copy link

There was a status update in the "Cooking" section about the branch sk/merge-filtering-strategies-micro-optim on the Git mailing list:

Micro optimization.

Will merge to 'master'.
source: <pull.1429.v2.git.git.1673285669004.gitgitgadget@gmail.com>

@gitgitgadget-git
Copy link

This patch series was integrated into seen via 6dba947.

@gitgitgadget-git
Copy link

There was a status update in the "Graduated to 'master'" section about the branch sk/merge-filtering-strategies-micro-optim on the Git mailing list:

Micro optimization.
source: <pull.1429.v2.git.git.1673285669004.gitgitgadget@gmail.com>

@gitgitgadget-git
Copy link

This patch series was integrated into seen via df786f6.

@gitgitgadget-git
Copy link

This patch series was integrated into master via df786f6.

@gitgitgadget-git
Copy link

This patch series was integrated into next via df786f6.

@gitgitgadget-git
Copy link

Closed via df786f6.

@AtariDreams AtariDreams deleted the exit branch January 31, 2023 14:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants