summaryrefslogtreecommitdiffstats
path: root/tests/benchmarks/corelib
Commit message (Collapse)AuthorAgeFilesLines
* Fix test compilation issues with QtLite configurationJari Helaakoski3 days3-3/+10
| | | | | | | | | | Now developer build tests compile, but some are not working. Functional fix will come later via separate tasks. Task-number: QTBUG-122999 Change-Id: I70487b46c1b32ba4279cb02a4978e4f55ac0d310 Reviewed-by: Alexey Edelev <alexey.edelev@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Add benchmarks for QDate::fromString()Edward Welbourne2024-04-221-0/+27
| | | | | | | | | | These reveal a roughly factor of six slow-down for two valid date formats and a roughly factor of twelve slow-down for an invalid one. Pick-to: 6.7 6.5 6.2 Task-number: QTBUG-124465 Change-Id: Ibd21e43d4c64aced33ba5b21e4602e0dc4fd7548 Reviewed-by: Mate Barany <mate.barany@qt.io>
* tst_bench_qdiriterator: fix build on VxWorksAhmad Samir2024-04-131-2/+1
| | | | | | | | | | | | | | | By removing fs::directory_options::skip_permission_denied which isn't available on VxWorks. It's not strictly needed for the benchmark. I had added it to test locally by listing some dirs under '/' (not all of them are readable for users), and saw no reason at the time to remove it. The benchmark itself listing dirs in the qtbase source dir tree. Pick-to: 6.7 Task-number: QTBUG-115777 Change-Id: I4e68d01abd707dbf553f0a5832739ef0f4c9d585 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* qHash: implement an AES hasher for QLatin1StringViewThiago Macieira2024-03-123-11/+51
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It's the same aeshash() as before, except we're passing a template parameter to indicate whether to read half and then zero-extend the data. That is, it will perform a conversion from Latin1 on the fly. When running in zero-extending mode, the length parameters are actually doubled (counting the number of UTF-16 code units) and we then divide again by 2 when advancing. The implementation should have the following performance characteristics: * QLatin1StringView now will be roughly half as fast as Qt 6.7 * QLatin1StringView now will be roughly as fast as QStringView For the aeshash128() in default builds of QtCore (will use SSE4.1), the long loop (32 characters or more) is: QStringView QLatin1StringView movdqu -0x20(%rax),%xmm4 | pmovzxbw -0x10(%rdx),%xmm2 movdqu -0x10(%rax),%xmm5 | pmovzxbw -0x8(%rdx),%xmm3 add $0x20,%rax | add $0x10,%rdx pxor %xmm4,%xmm0 | pxor %xmm2,%xmm0 pxor %xmm5,%xmm1 | pxor %xmm3,%xmm1 aesenc %xmm0,%xmm0 aesenc %xmm0,%xmm0 aesenc %xmm1,%xmm1 aesenc %xmm1,%xmm1 aesenc %xmm0,%xmm0 aesenc %xmm0,%xmm0 aesenc %xmm1,%xmm1 aesenc %xmm1,%xmm1 The number of instructions is identical, but there are actually 2 more uops per iteration. LLVM-MCA simulation shows this should execute in the same number of cycles on older CPUs that do not have support for VAES (see <https://analysis.godbolt.org/z/x95Mrfrf7>). For the VAES version in aeshash256() and the AVX10 version in aeshash256_256(): QStringView QLatin1StringView vpxor -0x40(%rax),%ymm1,%ym | vpmovzxbw -0x20(%rax),%ymm3 vpxor -0x20(%rax),%ymm0,%ym | vpmovzxbw -0x10(%rax),%ymm2 add $0x40,%rax | add $0x20,%rax | vpxor %ymm3,%ymm0,%ymm0 | vpxor %ymm2,%ymm1,%ymm1 vaesenc %ymm1,%ymm1,%ymm1 < vaesenc %ymm0,%ymm0,%ymm0 vaesenc %ymm0,%ymm0,%ymm0 vaesenc %ymm1,%ymm1,%ymm1 vaesenc %ymm1,%ymm1,%ymm1 vaesenc %ymm0,%ymm0,%ymm0 vaesenc %ymm0,%ymm0,%ymm0 > vaesenc %ymm1,%ymm1,%ymm1 In this case, the increase in number of instructions matches the increase in number of uops. The LLVM-MCA simulation says that the QLatin1StringView version is faster at 11 cycles/iteration vs 14 cyc/it (see <https://analysis.godbolt.org/z/1Gv1coz13>), but that can't be right. Measured performance of CPU cycles, on an Intel Core i9-7940X (Skylake, no VAES support), normalized on the QString performance (QByteArray is used as a stand-in for the performance in Qt 6.7): aeshash | siphash QByteArray QL1SV QString QByteArray QString dictionary 94.5% 79.7% 100.0% 150.5%* 159.8% paths-small 90.2% 93.2% 100.0% 202.8% 290.3% uuids 81.8% 100.7% 100.0% 215.2% 350.7% longstrings 42.5% 100.8% 100.0% 185.7% 353.2% numbers 95.5% 77.9% 100.0% 155.3%* 164.5% On an Intel Core i7-1165G7 (Tiger Lake, capable of VAES and AVX512VL): aeshash | siphash QByteArray QL1SV QString QByteArray QString dictionary 90.0% 91.1% 100.0% 103.3%* 157.1% paths-small 99.4% 104.8% 100.0% 237.5% 358.0% uuids 88.5% 117.6% 100.0% 274.5% 461.7% longstrings 57.4% 111.2% 100.0% 503.0% 974.3% numbers 90.6% 89.7% 100.0% 98.7%* 149.9% On an Intel 4th Generation Xeon Scalable Platinum (Sapphire Rapids, same Golden Cove core as Alder Lake): aeshash | siphash QByteArray QL1SV QString QByteArray QString dictionary 89.9% 102.1% 100.0% 158.1%* 172.7% paths-small 78.0% 89.4% 100.0% 159.4% 258.0% uuids 109.1% 107.9% 100.0% 279.0% 496.3% longstrings 52.1% 112.4% 100.0% 564.4% 1078.3% numbers 85.8% 98.9% 100.0% 152.6%* 190.4% * dictionary contains very short entries (6 characters) * paths-small contains strings of varying length, but very few over 32 * uuids-list contains fixed-length strings (38 characters) * longstrings is the same but 304 characters * numbers also a lot contains very short strings (1 to 6 chars) What this shows: * For short strings, the performance difference is negligible between all three * For longer strings, QLatin1StringView now costs between 7 and 17% more than QString on the tested machines instead of up to ~50% less, except on the older machine (where I think the main QString hashing is suffering from memory bandwidth limitations) * The AES hash implementation is anywhere from 1.6 to 11x faster than Siphash * Murmurhash (marked with asterisk) is much faster than Siphash, but it only managed to beat the AES hash in one test Change-Id: I664b9f014ffc48cbb49bfffd17b045c1811ac0ed Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* tst_bench_qdiriterator: add benchmark for QDirListingAhmad Samir2024-02-291-14/+65
| | | | | | | | | | | | | | | | | | | Make the benchmarks more comparable: - Store the QDir::Filters in one central var, this way it's the same in all the call sites - Add a `bool forceStat`, when true force calling stat(), either explicitly in posix_helper(), or implicitly in Qt classes by e.g. calling a QFileInfo method that would have to call system stat() internally. Otherwise benchmarking readdir()/dirent showed bigger times, which was mostly due to the explicit stat() calls, whereas we can use dirent::d_type (on the platforms where it's available) Drive by change: for std::filesystem::recursive_directory_iterator, set skip_permission_denied option and use the non-throwing constructor. Change-Id: Icf138a5dc41d32741c1be611d664b01008b2f3fe Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Change license for tests filesLucie Gérard2024-02-0466-66/+66
| | | | | | | | | | | | According to QUIP-18 [1], all tests file should be LicenseRef-Qt-Commercial OR GPL-3.0-only [1]: https://contribute.qt-project.org/quips/18 Pick-to: 6.7 Task-number: QTBUG-121787 Change-Id: I9657df5d660820e56c96d511ea49d321c54682e8 Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de>
* Bench QSet::uniteMårten Nordheim2024-02-011-0/+68
| | | | | | | | | It was shown to have poor performance compared to contains() and insert(). Pick-to: 6.7 6.6 6.5 Change-Id: I61cfbc8c34e325d677d7954118ef68057df640cb Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
* Remove qfunctions_vxworks files and usage as it is no longer neededMarcin Zdunek2024-01-251-2/+0
| | | | | | Task-number: QTBUG-115777 Change-Id: I0d803ac7ce067737b79a39a267a2b0eb509ae0b8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* tst_bench_{qhash,qset}: set deterministic seedMårten Nordheim2024-01-232-0/+8
| | | | | | | | | | | | | | There's a lot of variation in the benchmark graphs for QHash presumably caused by variation in seed. Optimally we would set deterministic seed for all benchmarks, but we don't know whether or not it is one until the macro is reached. Pick-to: 6.7 6.6 6.5 Change-Id: I4e412e4d4e2cc65eada94ed123243ed0047dd9cf Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Disable timezone which is not supported on VxworksMarcin Zdunek2023-11-292-14/+27
| | | | | | Task-number: QTBUG-115777 Change-Id: I69bf26d2e752d76d06edf569766d4298fb4fd1a8 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* Add QCborValue(StringLike) constructor benchmarkIvan Solovev2023-11-151-4/+27
| | | | | | | | | | | | | ... to test the impact of migrating the underlying implementation to QAnyStringView. As a drive-by: use [[maybe_unused]] instead of Q_UNUSED in the benchmark for operator[]. Task-number: QTBUG-101707 Pick-to: 6.6 6.5 6.2 Change-Id: I4bae7deadbe9bbd6f267364d78e94ea4541c1339 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QStringList: improve benchmark codeAhmad Samir2023-10-251-7/+12
| | | | | | | | | | | | Make the strings in the stringlist-to-be-joined unique, which matches actual use-cases better than joining a list of identical strings, especially with QString's implicit sharing, if it's copies of the same QString, it's sharing the underlying data. Pick-to: 6.6 6.5 6.2 5.15 Task-number: QTBUG-116859 Change-Id: I1da93885e938045322ba8337df5e4e96985f892f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QStringList: add filter(QStringMatcher) overloadAhmad Samir2023-10-221-6/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now that users can pass a QStringMatcher to do the matching, change the existing overload to not use QStringMatcher. Thanks to Giuseppe D'Angelo for the idea of passing a QStringMatcher to filter instead of using a magic number to decide whether to use QStringMatcher or not. Results of running filter() and filter_stringMatcher, times are in msecs and this was compiled with gcc -O3: Without With QStringMatcher list10 0.00022 0.000089 list20 0.00040 0.00014 list30 0.00058 0.00018 list40 0.000770 0.00023 list50 0.00094 0.00027 list70 0.0012 0.00037 list80 0.0014 0.00041 list100 0.0018 0.00050 list300 0.0054 0.0014 list500 0.0091 0.0023 list700 0.012 0.0032 list900 0.016 0.0041 list10000 0.17 0.045 Drive-by change: optimize tst_QStringList::populateList(). [ChangeLog][QtCore][QStringList] Added filter(const QStringMatcher &) overload, which may be faster for large lists and/or lists with very long strings. [ChangeLog][Possible Performance Changes][QtCore][QStringList] Changed the implementation of filter(QStringView) overload to not use QStringMatcher by default. Using QStringMatcher adds overhead, so it is beneficial/faster when searching for a pattern in large lists and/or lists with long strings, otherwise using plain string comparison is faster. If using QStringMatcher makes a difference in your code, you can use the newly added filter(QStringMatcher) overload. Change-Id: I7bb1262706d673f0ce0d9b7699f03c995ce28677 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* compressEvents: limit iterationMårten Nordheim2023-10-171-0/+26
| | | | | | | Slightly improves performance in the new benchmark Change-Id: I2d71143ff7bc1f32ebb172f20be1843dec123e6c Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
* QCborValue: add benchmark for operator[]Ivan Solovev2023-09-064-0/+87
| | | | | | | | | In order to test the impact of migration to QASV. Task-number: QTBUG-101707 Pick-to: 6.6 6.5 6.2 Change-Id: I17f84ca98fc87d89bb4cd6ad98c8a12aecd315ee Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QString: use new assign() in operator=({QByteArray, QChar, char *})Dennis Oberst2023-09-051-0/+55
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | operator=(~) and assign() share similar names but, until now, have not shared the same functionality. This patch introduces the usage of QString::assign() within the non-sharing assignment operators to effectively boost efficiency by reusing the available capacity. Since we're re-using the capacity we update the test case in places where they don't hold true anymore. Since these assignment operators are frequently used in many places, both within Qt and non-Qt code, this patch comes with benchmarks. The preview of the benchmark results are compared with this patch and before this patch. The results show a boost in performance for the QByteArray and 'const char*' overload. The QLatin1StringView overload already preserved the capacity and has a better performance than the assign() alternative, so don't us it there. (x86_64-little_endian-lp64 shared (dynamic) release build (O3); by gcc 13.2.1, endeavouros ; 13th Gen Intel(R) Core(TM) i9-13900K benchmarks executed with -perf -iterations 1000000 * The last value at the EOL represent the string size. QString &operator=(const QByteArray &a) (current) 64.3 cycles/iter; 300 instructions/iter; 17 nsec/iter (5) 65.8 cycles/iter; 366 instructions/iter; 12 nsec/iter (10) 62.9 cycles/iter; 301 instructions/iter; 11.5 nsec/iter (20) 61.3 cycles/iter; 315 instructions/iter; 11.1 nsec/iter (50) 71.4 cycles/iter; 386 instructions/iter; 13 nsec/iter (100) 136.9 cycles/iter; 811 instructions/iter; 24.5 nsec/iter (500) 245.8 cycles/iter; 1394 instructions/iter; 42.5 nsec/iter (1'000) QString &operator=(const QByteArray &a) (before) 78 cycles/iter; 399 instructions/iter; 15.3 nsec/iter (5) 82.3 cycles/iter; 465 instructions/iter; 15 nsec/iter (10) 76.7 cycles/iter; 400 instructions/iter; 14 nsec/iter (20) 79.5 cycles/iter; 414 instructions/iter; 14.5 nsec/iter (50) 91.4 cycles/iter; 485 instructions/iter; 16.7 nsec/iter (100) 189 cycles/iter; 910 instructions/iter; 34.4 nsec/iter (500) 320 cycles/iter; 1666 instructions/iter; 56 nsec/iter (1'000) QString &operator=(const char *ch) (current) 70 cycles/iter; 317 instructions/iter; 12 nsec/iter (5) 71 cycles/iter; 383 instructions/iter; 12.3 nsec/iter (10) 64 cycles/iter; 318 instructions/iter; 11.1 nsec/iter (20) 69 cycles/iter; 340 instructions/iter; 12 nsec/iter (50) 77 cycles/iter; 419 instructions/iter; 13.5 nsec/iter (100) 141 cycles/iter; 899 instructions/iter; 24.4 nsec/iter (500) 280 cycles/iter; 1518 instructions/iter; 48.4 nsec/iter (1'000) QString &operator=(const char *ch) (before) 86.7 cycles/iter; 416 instructions/iter; 15 nsec/iter (5) 87.8 cycles/iter; 482 instructions/iter; 15.7 nsec/iter (10) 82.4 cycles/iter; 417 instructions/iter; 14.3 nsec/iter (20) 90.2 cycles/iter; 443 instructions/iter; 15.6 nsec/iter (50) 101.4 cycles/iter; 518 instructions/iter; 17.7 nsec/iter (100) 204.4 cycles/iter; 994 instructions/iter; 36.5 nsec/iter (500) 337.9 cycles/iter; 1789 instructions/iter; 58.9 nsec/iter (1'000) * current implemented as: assign(other) QString &operator=(QLatin1StringView other) (current) 47.4 cycles/iter; 237 instructions/iter; 8.2 nsec/iter (5) 46.2 cycles/iter; 237 instructions/iter; 7.9 nsec/iter (10) 46.8 cycles/iter; 255 instructions/iter; 8 nsec/iter (20) 59 cycles/iter; 273 instructions/iter; 10.2 nsec/iter (50) 55 cycles/iter; 300 instructions/iter; 9.5 nsec/iter (100) 94.3 cycles/iter; 525 instructions/iter; 16.3 nsec/iter (500) 166 cycles/iter; 804 instructions/iter; 28.7 nsec/iter (1'000) QString &operator=(QLatin1StringView other) (before) 14 cycles/iter; 79 instructions/iter; 2.5 nsec/iter (5) 14 cycles/iter; 79 instructions/iter; 2.6 nsec/iter (10) 16 cycles/iter; 97 instructions/iter; 3 nsec/iter (20) 19 cycles/iter; 115 instructions/iter; 3.5 nsec/iter (50) 23 cycles/iter; 142 instructions/iter; 4.2 nsec/iter (100) 91 cycles/iter; 367 instructions/iter; 16.6 nsec/iter (500) 131 cycles/iter; 646 instructions/iter; 23.4 nsec/iter (1'000) Task-number: QTBUG-106201 Change-Id: Ie852f6abd1cf16164802acddb048eae5df59758f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Mark all of Qt as free of Q_FOREACH, except where it isn'tMarc Mutz2023-08-194-0/+8
| | | | | | | | | | | | | | | | | | | | | | The density of Q_FOREACH uses in this and some other modules is still extremely high, too high for anyone to tackle in a short amount of time. Even if they're not concentrated in just a few TUs, we need to make progress on a global QT_NO_FOREACH default, so grab the nettle and stick to our strategy: Mark the whole of Qt with QT_NO_FOREACH, to prevent new uses from creeping in, and whitelist the affected TUs by #undef'ing QT_NO_FOREACH locally, at the top of each file. For TUs that are part of a larger executable, this requires these files to be compiled separately, so add them to NO_PCH_SOURCES (which implies NO_UNITY_BUILD_SOURCES, too). In tst_qglobal.cpp and tst_qcollections.cpp change the comment on the #undef QT_NO_FOREACH to indicate that these actually test the macro. Task-number: QTBUG-115839 Change-Id: Iecc444eb7d43d7e4d037f6e155abe0e14a00a5d6 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QMimeDatabase benchmark: port away from Q_FOREACHMarc Mutz2023-08-141-12/+17
| | | | | | | | | | | | | | | | | | | | | | | The original code duplicated contained elements of a QStringList by repeated appending it to itself, preventing the container from being marked const. Instead, keep a list of unique mime-types, and iterate over the list eight times. As a drive-by, port from QList to a C array ("never use a dynamically-sized container for statically-sized data"), use u""_s UDLs (since we're touching almost all lines of the function, anyway, also in the unrelated mimeTypeForName() call). This allows porting the Q_FOREACH loop (which anyway cannot deal with C arrays) to a ranged for one (which can). Pick-to: 6.6 6.5 Task-number: QTBUG-115839 Change-Id: I844ae38104bb2980ea194b85f9017a3e95791ea2 Reviewed-by: Ahmad Samir <a.samirh78@gmail.com> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QByteArray: use new assign() in operator=(const char *)Dennis Oberst2023-08-111-0/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | operator=(~) and assign(~) share similar names but, until now, have not shared the same functionality. This patch introduces the usage of QByteArray::assign() within the non-sharing assignment operator to effectively boost efficiency by reusing the available capacity. Since these assignment operators are frequently used in many places, both within Qt and non-Qt code, this patch comes with benchmarks. The preview of the benchmark results are compared with this patch and before this patch. The findings indicate a slight enhancement in performance associated with the assignment operator. Despite the results displaying only a minor improvement, progress has been made. Therefore use assign(QByteArrayView) as replacement. (x86_64-little_endian-lp64 shared (dynamic) release build (O3); by gcc 13.2.1, endeavouros ; 13th Gen Intel(R) Core(TM) i9-13900K benchmarks executed with -perf -iterations 1000000 * The last value at the EOL represent the string size. QByteArray &operator=(const char *ch) (current) 65 cycles/iter; 317 instructions/iter; 16.0 nsec/iter (5) 71.7 cycles/iter; 383 instructions/iter; 13.0 nsec/iter (10) 59.8 cycles/iter; 318 instructions/iter; 10.9 nsec/iter (20) 70.8 cycles/iter; 340 instructions/iter; 12.9 nsec/iter (50) 80.2 cycles/iter; 419 instructions/iter; 14.6 nsec/iter (100) 164.2 cycles/iter; 899 instructions/iter; 29.9 nsec/iter (500) 260.5 cycles/iter; 1522 instructions/iter; 45.6 nsec/iter (1'000) QByteArray &operator=(const char *ch) (before) 66.8 cycles/iter; 317 instructions/iter; 16.9 nsec/iter (5) 76.5 cycles/iter; 383 instructions/iter; 13.9 nsec/iter (10) 63.7 cycles/iter; 318 instructions/iter; 11.6 nsec/iter (20) 71.6 cycles/iter; 344 instructions/iter; 13.0 nsec/iter (50) 77.5 cycles/iter; 419 instructions/iter; 14.1 nsec/iter (100) 143.4 cycles/iter; 893 instructions/iter; 26.1 nsec/iter (500) 270.8 cycles/iter; 1516 instructions/iter; 48.2 nsec/iter (1'000) Task-number: QTBUG-106201 Change-Id: I0745c33f0f61f1d844a60960cc55f565320d5945 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QMimeDatabase benchmark: measure only what it pertinentMarc Mutz2023-08-091-3/+5
| | | | | | | | | | | | | | | | | | | | Drag the QCOMPARE (which even dynamically allocated a QString fromLatin1()) out of the QBENCHMARK loop. Testing performance of QString::fromLatin1() and/or qCompare() is not pertinent to the task at hand, which, ideally, doesn't involve any memory allocations, so there's at least the chance that this skewed the result noticably. Didn't run the benchmark as this was developed on an asan build. Yes, this breaks comparability with the stone-age measurements reported in comments there, so sue me. As a drive-by, replace the fromLatin1() with a u_s UDL. Pick-to: 6.6 6.5 Change-Id: I9b2a8b2e3596ec9b07c6b4ea369257b1a86e09db Reviewed-by: Ahmad Samir <a.samirh78@gmail.com> Reviewed-by: David Faure <david.faure@kdab.com>
* CMake: remove check for cxx11_futureThiago Macieira2023-08-021-4/+0
| | | | | | | | | | | Everyone must have this by now. This test was 1193 ms of CMake time. Since this was a PUBLIC feature, I've left it around with a constant condition. Change-Id: Ifbf974a4d10745b099b1fffd177754538bbff245 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Simplify (and fix) initialization of a list of time-zonesEdward Welbourne2023-07-191-5/+2
| | | | | | | | | Looping over the entries had a typo in it and was quite unnecessary, as it just made a fresh copy of a list we already had. Pick-to: 6.6 6.5 6.2 5.15 Change-Id: I0f3023b06163e5854d425d816e465785cda5fc91 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Long live QtFuture::makeReadyVoidFuture() and QtFuture::makeReadyValueFuture()Ivan Solovev2023-04-051-9/+9
| | | | | | | | | | | | | | | | [ChangeLog][QtCore][QFuture] Added QtFuture::makeReadyVoidFuture() and QtFuture::makeReadyValueFuture(). Basically, these methods behave like QtFuture::makeReadyFuture(), but QtFuture::makeReadyValueFuture() does not have a "const QList<T> &" specialization returning QFuture<T> instead of QFuture<QList<T>>, which allows it to always behave consistently. This patch also introduces usage of the new methods around qtbase. Task-number: QTBUG-109677 Change-Id: I89df8b26d82c192baad69efb5df517a8b182995f Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* tst_bench_QCryptographicHash: use resultView()Marc Mutz2023-03-311-3/+3
| | | | | | | | | | | | | | | | | Don't benchmark the creation of the QByteArray from the internal buffer, that's not interesting. Call resultView() instead of result(). On the one hand, this skews comparisons with older benchmark data. OTOH, result() used to be the fastest way to get the result out of QCryptographicHash or QMessageAuthenticationCode, and now it's resultView(), so in a way, it still is a fair comparison. Pick-to: 6.5 Change-Id: I864b2f88f01e426c5d0967f57199e13dd7cb29f8 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_bench_QCryptographicHash: port from std::function to qxp::function_refMarc Mutz2023-03-311-3/+2
| | | | | | | | Because we can, and because function_ref is never null. Pick-to: 6.5 Change-Id: If71f98860d72eaa8cf8a93bb3c59a0260d3c7660 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_bench_QCryptographicHash: QSKIP unsupported algorithmsMarc Mutz2023-03-311-0/+19
| | | | | | | | | With the OpenSSL 3 backend, some algorithms may not be available. Skip benchmarking them. Pick-to: 6.5 Change-Id: I1275332993fe15c007410e25acf59f5e3ec27894 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_bench_QCryptographicHash: add benchmarks for QMessageAuthenticationCodeMarc Mutz2023-03-311-0/+80
| | | | | | | | | | | We could add a tst_QMessageAuthenticationCode, but it would have to duplicate a lot of the tst_QCryptographicHash machinery, so just add it here. Pick-to: 6.5 6.2 5.15 Change-Id: Icc60de865c72c5e423cb3be57f58297c522791f7 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* tst_bench_QCryptographicHash: swallow result() return valuesMarc Mutz2023-03-231-3/+6
| | | | | | | | | | | As usual, assign them to a [[maybe_unused]] variable, to avoid potential future [[nodiscard]] problems, and to indicate to readers of the code that there's a result that's being returned, we're just not interested in it. Pick-to: 6.5 6.2 Change-Id: I2bd47ca98418092ca885d50a1a6417a21a612a85 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_bench_QCryptographicHash: use QMetaEnum trickMarc Mutz2023-03-231-60/+20
| | | | | | | | | | | | | | | | ... conveniently wrapped in a generator, to not have to keep an algoname() function in sync with QCryptographicHash::Algorithm. The MaxCryptoAlgorithm constant was already stale following the addition of BLAKE2b/s algorithms in 5d69aa3ee1214cf689e2357bff8688f2ff138471. Also make the data-driven tests have an actual Algorithm column (was: int) to minimize casting. Pick-to: 6.5 6.2 5.15 Change-Id: I89a6098e512a72f623fd50a6f88fc351c7bb1418 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_bench_QCryptographicHash: port to QTest::addRow()Marc Mutz2023-03-231-24/+24
| | | | | | | | | Allows using printf-style tag formatting. Pick-to: 6.5 6.2 5.15 Change-Id: Icb8014dd476a32791c662a15b209dbb3bd7d6c96 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Silence warnings from unused variablesVolker Hilsheimer2023-03-214-2/+5
| | | | | | | | | | Use them, or replace them with existing constants. Pick-to: 6.5 Change-Id: I808028296305e15b68aecb1f961ba6a85b8e9cc7 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Øystein Heskestad <oystein.heskestad@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Replace ushort*/uint* with char16_t*/char32_t* in private API [1]Ahmad Samir2023-03-151-1/+1
| | | | | | | Task-number: QTBUG-110403 Pick-to: 6.5 Change-Id: Ie20a831f22212d56659cf3c6940d17134ab5f2c5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QThread: add sleep(std::chrono::nanoseconds) overloadAhmad Samir2023-03-131-9/+14
| | | | | | | | | | | | | | All the other overloads are implemented using the new one. Windows change relies on the pre-check in the code review making sure it compiles. [ChangeLog][QtCore][QThread] Added sleep(std::chrono::nanoseconds) overload. Task-number: QTBUG-110059 Change-Id: I9a4f4bf09041788ec9275093b6b8d0386521e286 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Silence warning, initialize variables before usingVolker Hilsheimer2023-03-061-2/+2
| | | | | | Pick-to: 6.5 Change-Id: I0e7db95bac48b5d79897402f23157d00c4abbdff Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Fix parsing of numbers to cope with non-single-character tokensEdward Welbourne2023-02-241-9/+0
| | | | | | | | | | | | | | | | | | | | In some locales signs and the exponent are not single character tokens. Replace QLocaleData::numericToCLocale() with a tokenizer that will cope with this. At the same time, cache the locale data needed in support of that, so that we don't repeatedly recreate QString() objects just to compare them against input tokens. The caching class is inspired by Thiago's proposal for fixing the performance, which also inspires the optimization of the C locale in the tokenizer used here. Add some testing that round-tripping numbers via strings works for the locales with signs and exponents that use more than one character. Task-number: QTBUG-107801 Change-Id: I9fd8409a371ed62ed969d9ebc8b09584e752f7fb Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* tests: Remove remains of qmake conversion from CMakeLists.txt filesFriedemann Kleint2023-02-1716-41/+0
| | | | | | | Pick-to: 6.5 Change-Id: I8d106554bb86ac1ec9bb7a4083de4c376bcbab1d Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* Fix QDir benchmark to do meaningful thingsDavid Faure2023-02-071-35/+25
| | | | | | | | | | | | | | | | | | * Include the creation of the QDir inside QBENCHMARK, otherwise the it can hit the cached code path where subsequent runs return results much faster. * Same for the opendir()/readdir() test: if opendir() isn't called again, readdir() will just return null right away. These two issues led to nonsense results like 0.00025 msecs per iteration, doing nothing is really quick. While at it, port the cleanup code to QDir::removeRecursively() Pick-to: 6.5 6.4 6.2 Change-Id: Ic1bdd92d41efe1f6d0eaaa33eca066cb7d19fc93 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QSortFilterProxyModel: port to PMF connects for performance reasonsDavid Faure2023-02-021-0/+14
| | | | | | | | | | | | | BEFORE: 0.21 msecs per iteration (total: 56, iterations: 256) 801,946 CPU cycles per iteration (total: 801,946, iterations: 1) AFTER: 0.084 msecs per iteration (total: 87, iterations: 1024) 300,259 CPU cycles per iteration (total: 300,259, iterations: 1) Change-Id: I5b2703c217bb25e18f1d9f6a1eda19c60e1edcb0 Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
* Deprecate QDateTime methods using plain Qt::TimeSpecEdward Welbourne2022-12-101-0/+14
| | | | | | | | | | As foreshadowed when QDateTime adapted to route all QTimeSpec use through QTimeZone, this commit deprecates the old API in favor of the newly more capable QTimeZone-based API. Fixes: QTBUG-108199 Change-Id: I9a3f9f94d4a5d8cc229db72b3e4731a9e318a076 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Adapt corelib to use QTimeZone in place of Qt::TimeSpecEdward Welbourne2022-12-092-8/+8
| | | | | | | | | This saves (mostly in corelib/time/) some complications that used to arise from needing different code-paths for different time-specs. Task-number: QTBUG-108199 Change-Id: I5dbd09859fce7599f1ba761f8a0bfc4633d0bef9 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Add In-place utf-8 case-insensitive comparisonsØystein Heskestad2022-12-023-0/+278
| | | | | | | | | | | Also add optimizations for more string comparisons and add tests and benchmarks. [ChangeLog][QtCore][QString] Added utf-8 case-insensitive comparisons Fixes: QTBUG-100235 Change-Id: I7c0809c6d80c00e9a5d0e8ac3ebb045cf7004a30 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Add benchmarks for QLocale number parsingEdward Welbourne2022-11-111-0/+230
| | | | | | | | | Based on those for QString, but with locale variation and exercising some of the locales with multi-character signs and exponents. Pick-to: 6.4 6.2 5.15 Change-Id: Id0253449f9abcc154285f89337aa0e26dd69900d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Add benchmarks for QString number parsingEdward Welbourne2022-11-111-8/+164
| | | | | | | | | | | Based on the tests for QString::number(), but run in reverse, with some embelishments. Also moved some shared code from number_*_data() to their shared number_integer_common template. Pick-to: 6.4 6.2 5.15 Change-Id: I74e7082372166c3cdbcd6bcbc31f9003e07cbcbc Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Port from container::count() and length() to size() - V5Marc Mutz2022-11-033-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a semantic patch using ClangTidyTransformator as in qtbase/df9d882d41b741fef7c5beeddb0abe9d904443d8, but extended to handle typedefs and accesses through pointers, too: const std::string o = "object"; auto hasTypeIgnoringPointer = [](auto type) { return anyOf(hasType(type), hasType(pointsTo(type))); }; auto derivedFromAnyOfClasses = [&](ArrayRef<StringRef> classes) { auto exprOfDeclaredType = [&](auto decl) { return expr(hasTypeIgnoringPointer(hasUnqualifiedDesugaredType(recordType(hasDeclaration(decl))))).bind(o); }; return exprOfDeclaredType(cxxRecordDecl(isSameOrDerivedFrom(hasAnyName(classes)))); }; auto renameMethod = [&] (ArrayRef<StringRef> classes, StringRef from, StringRef to) { return makeRule(cxxMemberCallExpr(on(derivedFromAnyOfClasses(classes)), callee(cxxMethodDecl(hasName(from), parameterCountIs(0)))), changeTo(cat(access(o, cat(to)), "()")), cat("use '", to, "' instead of '", from, "'")); }; renameMethod(<classes>, "count", "size"); renameMethod(<classes>, "length", "size"); except that the on() matcher has been replaced by one that doesn't ignoreParens(). a.k.a qt-port-to-std-compatible-api V5 with config Scope: 'Container'. Added two NOLINTNEXTLINEs in tst_qbitarray and tst_qcontiguouscache, to avoid porting calls that explicitly test count(). Change-Id: Icfb8808c2ff4a30187e9935a51cad26987451c22 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* tests: fix configuring with -no-feature-guiJohannes Kauffmann2022-10-291-3/+2
| | | | | | Pick-to: 6.2 6.4 Change-Id: I99765d38c9c37f1fe17b15f7736e4c78c7ffac20 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* Windows: bump NTDDI_VERSION to latest version and remove some duplicated codeYuhang Zhao2022-10-241-3/+0
| | | | | | | | | | | | | | | We have NTDDI_WIN10_NI (0x0A00000C) in the Win11 SDK (10.0.22621) so bump the value in Qt (currently 0x0A00000B) to it. And when searching for _WIN32_WINNT/WINVER/NTDDI_VERSION throughout the whole qtbase codebase, I found some duplicated code, mostly leftovers from the legacy time. Replace them with our own windows header can achieve the same effect: we have defined all the necessary macros to unblock the latest features. And place the header at the top most place to include the macros as early as possible. Change-Id: I37d9ac40ca9748208c7b2e89f374eda362dbefd6 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
* Long live Q_UNREACHABLE_RETURN()!Marc Mutz2022-10-151-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a combination of Q_UNREACHABLE() with a return statement. ATM, the return statement is unconditionally included. If we notice that some compilers warn about return after __builtin_unreachable(), then we can map Q_UNREACHABLE_RETURN(...) to Q_UNREACHABLE() without having to touch all the code that uses explicit Q_UNREACHABLE() + return. The fact that Boost has BOOST_UNREACHABLE_RETURN() indicates that there are compilers that complain about a lack of return after Q_UNREACHABLE (we know that MSVC, ICC, and GHS are among them), as well as compilers that complained about a return being present (Coverity). Take this opportunity to properly adapt to Coverity, by leaving out the return statement on this compiler. Apply the macro around the code base, using a clang-tidy transformer rule: const std::string unr = "unr", val = "val", ret = "ret"; auto makeUnreachableReturn = cat("Q_UNREACHABLE_RETURN(", ifBound(val, cat(node(val)), cat("")), ")"); auto ignoringSwitchCases = [](auto stmt) { return anyOf(stmt, switchCase(subStmt(stmt))); }; makeRule( stmt(ignoringSwitchCases(stmt(isExpandedFromMacro("Q_UNREACHABLE")).bind(unr)), nextStmt(returnStmt(optionally(hasReturnValue(expr().bind(val)))).bind(ret))), {changeTo(node(unr), cat(makeUnreachableReturn, ";")), // TODO: why is the ; lost w/o this? changeTo(node(ret), cat(""))}, cat("use ", makeUnreachableReturn)) ); where nextStmt() is copied from some upstream clang-tidy check's private implementation and subStmt() is a private matcher that gives access to SwitchCase's SubStmt. A.k.a. qt-use-unreachable-return. There were some false positives, suppressed them with NOLINTNEXTLINE. They're not really false positiives, it's just that Clang sees the world in one way and if conditonal compilation (#if) differs for other compilers, Clang doesn't know better. This is an artifact of matching two consecutive statements. I haven't figured out how to remove the empty line left by the deletion of the return statement, if it, indeed, was on a separate line, so post-processed the patch to remove all the lines matching ^\+ *$ from the diff: git commit -am meep git reset --hard HEAD^ git diff HEAD..HEAD@{1} | sed '/^\+ *$/d' | recountdiff - | patch -p1 [ChangeLog][QtCore][QtAssert] Added Q_UNREACHABLE_RETURN() macro. Change-Id: I9782939f16091c964f25b7826e1c0dbd13a71305 Reviewed-by: Marc Mutz <marc.mutz@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Port from qAsConst() to std::as_const()Marc Mutz2022-10-113-8/+8
| | | | | | | | | | | | | | | | We've been requiring C++17 since Qt 6.0, and our qAsConst use finally starts to bother us (QTBUG-99313), so time to port away from it now. Since qAsConst has exactly the same semantics as std::as_const (down to rvalue treatment, constexpr'ness and noexcept'ness), there's really nothing more to it than a global search-and-replace, with manual unstaging of the actual definition and documentation in dist/, src/corelib/doc/ and src/corelib/global/. Task-number: QTBUG-99313 Change-Id: I4c7114444a325ad4e62d0fcbfd347d2bbfb21541 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
* Port from container.count()/length() to size()Marc Mutz2022-10-042-10/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is semantic patch using ClangTidyTransformator: auto QtContainerClass = expr(hasType(namedDecl(hasAnyName(<classes>)))).bind(o) makeRule(cxxMemberCallExpr(on(QtContainerClass), callee(cxxMethodDecl(hasAnyName({"count", "length"), parameterCountIs(0))))), changeTo(cat(access(o, cat("size"), "()"))), cat("use 'size()' instead of 'count()/length()'")) a.k.a qt-port-to-std-compatible-api with config Scope: 'Container'. <classes> are: // sequential: "QByteArray", "QList", "QQueue", "QStack", "QString", "QVarLengthArray", "QVector", // associative: "QHash", "QMultiHash", "QMap", "QMultiMap", "QSet", // Qt has no QMultiSet Change-Id: Ibe8837be96e8d30d1846881ecd65180c1bc459af Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Update tst_bench_qhash hash functions to use size_tMårten Nordheim2022-09-272-10/+10
| | | | | | | | | | | Pre-requisite for a fix for qHash. The Qt50String inherits from QString and becomes ambiguous once it no longer goes through a catch-all template function because qHash(QString, size_t) has a better match for the second argument. Pick-to: 6.2 6.4 Change-Id: I23c7afb1b3aa167d40dc4838e82b7763de015f6b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>