[Development] A faster qUtf8Printable for static trace points?
Thiago Macieira
thiago.macieira at intel.com
Tue Sep 6 15:59:40 CEST 2016
Em segunda-feira, 5 de setembro de 2016, às 21:20:12 PDT, Milian Wolff
escreveu:
> Hey Thiago, others.
Hey Milian
Is this what you were looking for me for on Sunday afternoon?
> bool QLibraryPrivate::load()
> {
> ...
> TraceScope<...> ts(qUtf8Printable(fileName))
> ...
> }
Hmm... I only agreed to something that has no runtime impact when not in use.
I thought the traces were totally out-of-line (recorded in a separate
section). Annotating variables sounds like a good idea, but annotating the
result of function calls... not so much.
> Trace points have nearly zero runtime overhead when not used [1]. But the
> above has a super high cost due to calling QString::toUtf8, which constructs
> a temporary QByteArray and thus incurs a temporary runtime allocation. An
> alternative would be to use qUtf16Printable, which would be fast, but I
> fear it makes interoperability with existing trace point consumers hard.
>
> Can someone with experience on trace points confirm this assertion? If that
> is untrue, simply using qUtf16Printable above would make everything work,
> and be fast.
qUtf16Printable may reallocate if the QString in question was created with
fromRawData. But that's not a very common use-case. As for existing trace
point consumers, sorry, you're the expert. I have no clue if there are any
that dump UTF-16, but I wouldn't be surprised if there weren't. How hard would
it be to add them? Remeber that C++11 has char16_t.
> One way to handle the above case would be only doing the qUtf8Printable call
> when the trace point is enabled, but afaik that checking also is not done
> for free, and also makes the consumer code harder to write.
Right. Don't annotate with function calls. Annotate variables only. You can
mostly do this by adding an unreachable rvalue-ref overload, like qAsConst.
> https://github.com/milianw/bench_qt/blob/master/bench_qstring/
> bench_qstring.cpp#L118
>
> Would something like this be acceptable for upstream? E.g. change
> qUtf8Printable to not allocate memory for up to PATH_MAX chars or similar,
> and otherwise fallback to the slow QByteArray (or simply truncate, which
> would be an option for trace points actually).
That change is interesting and we could accept it, but I still wouldn't want
it used in tracepoints. You avoid the allocation, but you're still converting
to UTF-8. Your benchmark doesn't show it because your strings are probably
very short and our UTF-8 algorithm is very optimised. It is dwarfed by the
memory allocation.
No, instead the policy should be that we annotate only direct variables or
values that can be computed easily from the variable itself (like
constData()).
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
More information about the Development
mailing list