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/time/qtimezoneprivate_tz.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/time/qtimezoneprivate_tz.cpp')
-rw-r--r-- | src/corelib/time/qtimezoneprivate_tz.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp index 099bccb071..d7c529ad10 100644 --- a/src/corelib/time/qtimezoneprivate_tz.cpp +++ b/src/corelib/time/qtimezoneprivate_tz.cpp @@ -392,27 +392,28 @@ static int parsePosixTime(const char *begin, const char *end) int hour, min = 0, sec = 0; const int maxHour = 137; // POSIX's extended range. - bool ok = false; - const char *cut = begin; - hour = qstrntoll(begin, end - begin, &cut, 10, &ok); - if (!ok || hour < -maxHour || hour > maxHour || cut > begin + 2) + auto r = qstrntoll(begin, end - begin, 10); + hour = r.result; + if (!r.ok() || hour < -maxHour || hour > maxHour || r.endptr > begin + 2) return INT_MIN; - begin = cut; + begin = r.endptr; if (begin < end && *begin == ':') { // minutes ++begin; - min = qstrntoll(begin, end - begin, &cut, 10, &ok); - if (!ok || min < 0 || min > 59 || cut > begin + 2) + r = qstrntoll(begin, end - begin, 10); + min = r.result; + if (!r.ok() || min < 0 || min > 59 || r.endptr > begin + 2) return INT_MIN; - begin = cut; + begin = r.endptr; if (begin < end && *begin == ':') { // seconds ++begin; - sec = qstrntoll(begin, end - begin, &cut, 10, &ok); - if (!ok || sec < 0 || sec > 59 || cut > begin + 2) + r = qstrntoll(begin, end - begin, 10); + sec = r.result; + if (!r.ok() || sec < 0 || sec > 59 || r.endptr > begin + 2) return INT_MIN; - begin = cut; + begin = r.endptr; } } |