From f3743073a70086cfcf39a2daf2c605993ab25ce3 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 30 Aug 2021 09:32:30 -0700 Subject: [PATCH] qstrnlen: micro-optimize further This is the kind of loop that the autovectorizer is pretty good at, but this is really just a type of memchr, so help dumber compilers and build modes without vectorization. Drive-up fix the style of the test code. Change-Id: Ie72b0dd0fbe84d2caae0fffd16a022a35fa24c17 Reviewed-by: Ievgenii Meshcheriakov Reviewed-by: Edward Welbourne --- src/corelib/text/qbytearrayalgorithms.h | 10 ++++------ .../corelib/text/qbytearray/tst_qbytearray.cpp | 14 +++++++------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/corelib/text/qbytearrayalgorithms.h b/src/corelib/text/qbytearrayalgorithms.h index 638af2948b4..a78e6e17099 100644 --- a/src/corelib/text/qbytearrayalgorithms.h +++ b/src/corelib/text/qbytearrayalgorithms.h @@ -96,12 +96,10 @@ inline size_t qstrlen(const char *str) inline size_t qstrnlen(const char *str, size_t maxlen) { - size_t length = 0; - if (str) { - while (length < maxlen && *str++) - length++; - } - return length; + if (!str) + return 0; + auto end = static_cast(memchr(str, '\0', maxlen)); + return end ? end - str : maxlen; } // implemented in qbytearray.cpp diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp index a4798e77aa4..0f1f00bf6ce 100644 --- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp +++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp @@ -803,18 +803,18 @@ void tst_QByteArray::qvsnprintf() void tst_QByteArray::qstrlen() { const char *src = "Something about ... \0 a string."; - QCOMPARE(::qstrlen((char*)0), (uint)0); - QCOMPARE(::qstrlen(src), (uint)20); + QCOMPARE(::qstrlen(nullptr), size_t(0)); + QCOMPARE(::qstrlen(src), size_t(20)); } void tst_QByteArray::qstrnlen() { const char *src = "Something about ... \0 a string."; - QCOMPARE(::qstrnlen((char*)0, 1), (uint)0); - QCOMPARE(::qstrnlen(src, 31), (uint)20); - QCOMPARE(::qstrnlen(src, 19), (uint)19); - QCOMPARE(::qstrnlen(src, 21), (uint)20); - QCOMPARE(::qstrnlen(src, 20), (uint)20); + QCOMPARE(::qstrnlen(nullptr, 1), size_t(0)); + QCOMPARE(::qstrnlen(src, 31), size_t(20)); + QCOMPARE(::qstrnlen(src, 19), size_t(19)); + QCOMPARE(::qstrnlen(src, 21), size_t(20)); + QCOMPARE(::qstrnlen(src, 20), size_t(20)); } void tst_QByteArray::qstrcpy()