diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2022-10-27 15:55:42 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2022-11-16 16:15:31 -0800 |
commit | d50d34e5de7f5cf5e34243210e3df519974d7794 (patch) | |
tree | ff86a644a6dc271da7817767e1f7668d7b82ed25 /src/corelib/tools/qversionnumber.cpp | |
parent | 649dccf57b18626f6a0790d46e5e619e4e603078 (diff) |
QLocale: make qstrnto(u)ll not have output arguments
That is, return everything in the return argument. On the SysV ABI, that
means everything gets returned in registers, in both 32- and 64-bit
platforms (unlike QtPrivate::ParsedNumber). There's a minor but
perceptible performance improvement in parsing strings and byte arrays.
Before:
Parsed string "42" "1234" "-1548860221"
Clock (ns) 16.673 18.878 25.517
CPU cycles 46.548 52.704 71.243
Instructions 201 233 331
After:
Parsed string "42" "1234" "-1548860221"
Clock (ns) 15.577 17.998 24.198
CPU cycles 43.491 49.942 67.552
Instructions 179 211 308
On my Core i7-1165G7 @ 2.80 GHz, the 22-23 instruction gain per
iteration results in half the expected clock gain in runtime (22 /
2.8 GHz = 7.8 ns) because of a slightly lower instruction per cycle
rate. That's acceptable because we need less speculative execution.
Pick-to: 6.4
Task-number: QTBUG-107788
Change-Id: I07ec23f3cb174fb197c3fffd17220fd64d473cc0
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src/corelib/tools/qversionnumber.cpp')
-rw-r--r-- | src/corelib/tools/qversionnumber.cpp | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/src/corelib/tools/qversionnumber.cpp b/src/corelib/tools/qversionnumber.cpp index 7d6ddc9bcd..f44d5e4e8c 100644 --- a/src/corelib/tools/qversionnumber.cpp +++ b/src/corelib/tools/qversionnumber.cpp @@ -404,19 +404,18 @@ static QVersionNumber from_string(QLatin1StringView string, qsizetype *suffixInd QVarLengthArray<int, 32> seg; const char *start = string.begin(); - const char *end = start; const char *lastGoodEnd = start; const char *endOfString = string.end(); do { - bool ok = false; - const qulonglong value = qstrntoull(start, endOfString - start, &end, 10, &ok); - if (!ok || value > qulonglong(std::numeric_limits<int>::max())) + // parsing as unsigned so a minus sign is rejected + auto [value, end] = qstrntoull(start, endOfString - start, 10); + if (!end || value > qulonglong(std::numeric_limits<int>::max())) break; seg.append(int(value)); start = end + 1; lastGoodEnd = end; - } while (start < endOfString && end < endOfString && *end == '.'); + } while (start < endOfString && *lastGoodEnd == '.'); if (suffixIndex) *suffixIndex = lastGoodEnd - string.begin(); |