diff options
author | Andreas Buhr <andreas.buhr@qt.io> | 2020-10-26 19:33:47 +0100 |
---|---|---|
committer | Andreas Buhr <andreas.buhr@qt.io> | 2020-10-31 13:38:45 +0100 |
commit | 0d3fb3784b5de548e132f0c8e522a82adc1b9fd8 (patch) | |
tree | d9cfb5facd48a1661249562aee15989aea58634b | |
parent | 81957e753ea0f875556490857fbff50688db42f1 (diff) |
Performance improvement for integer->QString conversion
The compiler can generate better code when the base is known
in integer to string conversion. This patch creates separate branches
for known bases and leaves generic code as a fallback.
Saved about 12ns per conversion of 12345678 in one measurement.
Task-number: QTBUG-87330
Change-Id: I44c9bb467cf211f7e617ed55104476062296bba6
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r-- | src/corelib/text/qlocale_tools.cpp | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp index 80c9665c92..4421d40340 100644 --- a/src/corelib/text/qlocale_tools.cpp +++ b/src/corelib/text/qlocale_tools.cpp @@ -468,11 +468,50 @@ QString qulltoa(qulonglong number, int base, const QStringView zero) char16_t buff[maxlen]; char16_t *const end = buff + maxlen, *p = end; + // Performance-optimized code. Compiler can generate faster code when base is known. if (base != 10 || zero == u"0") { - while (number != 0) { - int c = number % base; - *--p = c < 10 ? '0' + c : c - 10 + 'a'; - number /= base; + switch (base) { +#ifndef __OPTIMIZE_SIZE__ + case 10: + while (number != 0) { + const int c = number % 10; + const qulonglong temp = number / 10; + *--p = '0' + c; + number = temp; + } + break; + case 2: + while (number != 0) { + const int c = number % 2; + const qulonglong temp = number / 2; + *--p = '0' + c; + number = temp; + } + break; + case 8: + while (number != 0) { + const int c = number % 8; + const qulonglong temp = number / 8; + *--p = '0' + c; + number = temp; + } + break; + case 16: + while (number != 0) { + const int c = number % 16; + const qulonglong temp = number / 16; + *--p = c < 10 ? '0' + c : c - 10 + 'a'; + number = temp; + } + break; +#endif + default: + while (number != 0) { + const int c = number % base; + const qulonglong temp = number / base; + *--p = c < 10 ? '0' + c : c - 10 + 'a'; + number = temp; + } } } else if (zero.size() && !zero.at(0).isSurrogate()) { const char16_t zeroUcs2 = zero.at(0).unicode(); |