[PATCH] D50214: Add inherited attributes before parsed attributes.
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 14 12:34:26 PDT 2018
aaron.ballman added inline comments.
================
Comment at: lib/AST/DeclBase.cpp:854-859
+ auto I = Attrs.begin(), E = Attrs.end();
+ for (; I != E; ++I) {
+ if (!(*I)->isInherited())
+ break;
+ }
+ Attrs.insert(I, A);
----------------
Meinersbur wrote:
> aaron.ballman wrote:
> > The unfortunate part about this is that inherited attributes are fairly common, so this extra searching may happen more often than we'd like. I wonder how bad it would be to keep track of the location within the list where the inherited attributes start. Then again, the list of attributes should be relatively short in most cases, so this search isn't likely to be too expensive.
> >
> > Having some performance measurements might help decide this, too.
> Timed clang-compilation using perf (`perf stat bin/clang llvm/unittests/IR/InstructionsTest.cpp ...`), before this patch (r339574):
> ```
> 7647.415800 task-clock (msec) # 0.983 CPUs utilized
> 289 context-switches # 0.038 K/sec
> 26 cpu-migrations # 0.003 K/sec
> 86,494 page-faults # 0.011 M/sec
> 19,068,741,863 cycles # 2.493 GHz
> 26,581,355,844 instructions # 1.39 insn per cycle
> 6,242,394,037 branches # 816.275 M/sec
> 128,405,656 branch-misses # 2.06% of all branches
>
> 7.779848330 seconds time elapsed
> ```
>
> With this patch:
> ```
> 7679.173467 task-clock (msec) # 0.987 CPUs utilized
> 321 context-switches # 0.042 K/sec
> 23 cpu-migrations # 0.003 K/sec
> 86,071 page-faults # 0.011 M/sec
> 19,150,248,538 cycles # 2.494 GHz
> 26,667,465,697 instructions # 1.39 insn per cycle
> 6,262,381,898 branches # 815.502 M/sec
> 128,527,669 branch-misses # 2.05% of all branches
>
> 7.779477815 seconds time elapsed
> ```
> (Intel(R) Xeon(R) Platinum 8180M CPU @ 2.50GHz)
>
> The vector insert operation is also be `O(n)`. If the number of non-inherited is expected to be smaller, we can instead search for the first inherited attribute starting at the end of the vector. If we want to avoid the `O(n)` entirely, we need one list for inherited and another for non-inherited attributes.
Thank you for gathering this data -- those perf numbers look reasonable to me. We can refactor for performance later if it ever turns up on the hot path.
Repository:
rC Clang
https://reviews.llvm.org/D50214
More information about the cfe-commits
mailing list