perf dsos: When adding a dso into sorted dsos maintain the sort order
dsos__add would add at the end of the dso array possibly requiring a later find to re-sort the array. Patterns of find then add were becoming O(n*log n) due to the sorts. Change the add routine to be O(n) rather than O(1) but to maintain the sorted-ness of the dsos array so that later finds don't need the O(n*log n) sort. Fixes: 3f4ac23a9908 ("perf dsos: Switch backing storage to array from rbtree/list") Reported-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Ian Rogers <irogers@google.com> Cc: Steinar Gunderson <sesse@google.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Matt Fleming <matt@readmodwrite.com> Link: https://lore.kernel.org/r/20240703172117.810918-3-irogers@google.com Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
feaaa8be0b
commit
1059fb5291
@ -206,11 +206,27 @@ int __dsos__add(struct dsos *dsos, struct dso *dso)
|
||||
dsos->dsos = temp;
|
||||
dsos->allocated = to_allocate;
|
||||
}
|
||||
dsos->dsos[dsos->cnt++] = dso__get(dso);
|
||||
if (dsos->cnt >= 2 && dsos->sorted) {
|
||||
dsos->sorted = dsos__cmp_long_name_id_short_name(&dsos->dsos[dsos->cnt - 2],
|
||||
&dsos->dsos[dsos->cnt - 1])
|
||||
<= 0;
|
||||
if (!dsos->sorted) {
|
||||
dsos->dsos[dsos->cnt++] = dso__get(dso);
|
||||
} else {
|
||||
int low = 0, high = dsos->cnt - 1;
|
||||
int insert = dsos->cnt; /* Default to inserting at the end. */
|
||||
|
||||
while (low <= high) {
|
||||
int mid = low + (high - low) / 2;
|
||||
int cmp = dsos__cmp_long_name_id_short_name(&dsos->dsos[mid], &dso);
|
||||
|
||||
if (cmp < 0) {
|
||||
low = mid + 1;
|
||||
} else {
|
||||
high = mid - 1;
|
||||
insert = mid;
|
||||
}
|
||||
}
|
||||
memmove(&dsos->dsos[insert + 1], &dsos->dsos[insert],
|
||||
(dsos->cnt - insert) * sizeof(struct dso *));
|
||||
dsos->cnt++;
|
||||
dsos->dsos[insert] = dso__get(dso);
|
||||
}
|
||||
dso__set_dsos(dso, dsos);
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user