Test data: 500kLOC of benchmark.yaml, 23Mb. (that is a subset of the actual uops benchmark i was trying to analyze!)
Old time:
$ time ./bin/llvm-exegesis -mode=analysis -analysis-epsilon=100000 -benchmarks-file=/tmp/benchmarks.yaml -analysis-inconsistencies-output-file=/tmp/clusters.html &> /dev/null real 0m24.884s user 0m24.099s sys 0m0.785s
New time:
$ time ./bin/llvm-exegesis -mode=analysis -analysis-epsilon=100000 -benchmarks-file=/tmp/benchmarks.yaml -analysis-inconsistencies-output-file=/tmp/clusters.html &> /dev/null real 0m10.469s user 0m9.797s sys 0m0.672s
So -60%. And that isn't the good bit yet.
Old:
- calls to allocation functions: 106560180 (yes, 107 *million* allocations.)
- bytes allocated in total (ignoring deallocations): 12.17 GB
New:
- calls to allocation functions: 3347676 (-96.86%) (just 3 mil)
- bytes allocated in total (ignoring deallocations): 10.52 GB (~2GB less)
Two points i want to raise:
- std::unordered_set<> should not have been used there in the first place. It is banned by the https://llvm.org/docs/ProgrammersManual.html#other-set-like-container-options
- There is no tests, so i'm not fully sure this is correct. Since it was unordered set, i guess there are zero restrictions on the order, and anything will be ok?
- I tried other containers suggested in https://llvm.org/docs/ProgrammersManual.html#set-like-containers-std-set-smallset-setvector-etc, this llvm::SetVector<> seems to be best here.