Skip to content

Commit

Permalink
perf(completion): use one call to globpath() for .vim and .lua #21942
Browse files Browse the repository at this point in the history
Test using the following test script (timings with ASAN):

    let start = reltime()
    for i in range(100)
      call getcompletion('', 'filetype')
    endfor
    echomsg reltimefloat(reltime(start))

Without this PR: 3.251825 seconds
With this PR: 2.747285 seconds
  • Loading branch information
zeertzjq committed Jan 23, 2023
1 parent 45d5115 commit d58bf4f
Showing 1 changed file with 11 additions and 21 deletions.
32 changes: 11 additions & 21 deletions src/nvim/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -1190,56 +1190,46 @@ int ExpandRTDir(char *pat, int flags, int *num_file, char ***file, char *dirname
garray_T ga;
ga_init(&ga, (int)sizeof(char *), 10);

// TODO(bfredl): this is bullshit, exandpath should not reinvent path logic.
// TODO(bfredl): this is bullshit, expandpath should not reinvent path logic.
for (int i = 0; dirnames[i] != NULL; i++) {
size_t size = strlen(dirnames[i]) + pat_len + 7;
size_t size = strlen(dirnames[i]) + pat_len + 16;
char *s = xmalloc(size);
snprintf(s, size, "%s/%s*.vim", dirnames[i], pat);
globpath(p_rtp, s, &ga, 0);
snprintf(s, size, "%s/%s*.lua", dirnames[i], pat);
snprintf(s, size, "%s/%s*.\\(vim\\|lua\\)", dirnames[i], pat);
globpath(p_rtp, s, &ga, 0);
xfree(s);
}

if (flags & DIP_START) {
for (int i = 0; dirnames[i] != NULL; i++) {
size_t size = strlen(dirnames[i]) + pat_len + 22;
size_t size = strlen(dirnames[i]) + pat_len + 31;
char *s = xmalloc(size);
snprintf(s, size, "pack/*/start/*/%s/%s*.vim", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
snprintf(s, size, "pack/*/start/*/%s/%s*.lua", dirnames[i], pat); // NOLINT
snprintf(s, size, "pack/*/start/*/%s/%s*.\\(vim\\|lua\\)", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
xfree(s);
}

for (int i = 0; dirnames[i] != NULL; i++) {
size_t size = strlen(dirnames[i]) + pat_len + 22;
size_t size = strlen(dirnames[i]) + pat_len + 31;
char *s = xmalloc(size);
snprintf(s, size, "start/*/%s/%s*.vim", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
snprintf(s, size, "start/*/%s/%s*.lua", dirnames[i], pat); // NOLINT
snprintf(s, size, "start/*/%s/%s*.\\(vim\\|lua\\)", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
xfree(s);
}
}

if (flags & DIP_OPT) {
for (int i = 0; dirnames[i] != NULL; i++) {
size_t size = strlen(dirnames[i]) + pat_len + 20;
size_t size = strlen(dirnames[i]) + pat_len + 29;
char *s = xmalloc(size);
snprintf(s, size, "pack/*/opt/*/%s/%s*.vim", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
snprintf(s, size, "pack/*/opt/*/%s/%s*.lua", dirnames[i], pat); // NOLINT
snprintf(s, size, "pack/*/opt/*/%s/%s*.\\(vim\\|lua\\)", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
xfree(s);
}

for (int i = 0; dirnames[i] != NULL; i++) {
size_t size = strlen(dirnames[i]) + pat_len + 20;
size_t size = strlen(dirnames[i]) + pat_len + 29;
char *s = xmalloc(size);
snprintf(s, size, "opt/*/%s/%s*.vim", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
snprintf(s, size, "opt/*/%s/%s*.lua", dirnames[i], pat); // NOLINT
snprintf(s, size, "opt/*/%s/%s*.\\(vim\\|lua\\)", dirnames[i], pat); // NOLINT
globpath(p_pp, s, &ga, 0);
xfree(s);
}
Expand Down

0 comments on commit d58bf4f

Please sign in to comment.