mirror of
https://github.com/moparisthebest/pacman
synced 2024-11-02 00:25:07 -04:00
pacman/query.c : -Qo optimization.
I didn't understand why realpath was called on every files of every filelist in query_fileowner : ppath = resolve_path(path); It turns out this is needed for the diverted files. For example, cddb_get installs /usr/lib/perl5/site_perl/5.8.8/CDDB_get.pm which actually ends in /usr/lib/perl5/site_perl/current/CDDB_get.pm . And for making pacman -Qo /usr/lib/perl5/site_perl/current/CDDB_get.pm , realpath has to be called on both the target, and the file in the filelist. However, realpath is costly, and calling it on every single file resulted in a poor -Qo performance. Worst case : pacman -Qo /lib/libz.so.1 0.35s user 1.51s system 99% cpu 1.864 total So I did a little optimization to avoid calling realpath as much as possible: first compare the basename of each file. Result: src/pacman/pacman -Qo /lib/libz.so.1 0.24s user 0.05s system 99% cpu 0.298 total Obviously, the difference will be even bigger at the first run (no fs cache), though it's quite scary on my system : 1.7s vs 40s previously. Signed-off-by: Chantry Xavier <shiningxc@gmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
11133da587
commit
d683033d3e
@ -71,6 +71,7 @@ static int query_fileowner(alpm_list_t *targets)
|
||||
for(t = targets; t; t = alpm_list_next(t)) {
|
||||
int found = 0;
|
||||
char *filename = alpm_list_getdata(t);
|
||||
char *bname;
|
||||
char *rpath;
|
||||
struct stat buf;
|
||||
alpm_list_t *i, *j;
|
||||
@ -88,6 +89,8 @@ static int query_fileowner(alpm_list_t *targets)
|
||||
continue;
|
||||
}
|
||||
|
||||
bname = mbasename(filename);
|
||||
|
||||
if(!(rpath = resolve_path(filename))) {
|
||||
fprintf(stderr, _("error: cannot determine real path for '%s': %s\n"),
|
||||
filename, strerror(errno));
|
||||
@ -103,6 +106,11 @@ static int query_fileowner(alpm_list_t *targets)
|
||||
snprintf(path, PATH_MAX, "%s%s",
|
||||
alpm_option_get_root(), (const char *)alpm_list_getdata(j));
|
||||
|
||||
/* avoid the costly resolve_path usage if the basenames don't match */
|
||||
if(strcmp(mbasename(path), bname) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ppath = resolve_path(path);
|
||||
|
||||
if(ppath && strcmp(ppath, rpath) == 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user