[Development] New assign() Functionality Added to Qt Containers
Dennis Oberst
dennis.oberst at qt.io
Wed Sep 6 11:30:09 CEST 2023
Hello everyone,
I would like to inform you that we've added assign(~) functionality to the following
Qt containers:
QVarLengthArray, QList, QByteArray, and QString.
It is now incorporated into certain non-sharing operator=(~) implementations.
As a quick heads up: assign() offers a convenient way to recycle allocated
memory, potentially resulting in greater efficiency compared to its
memory-allocating alternatives.
We observed that the efficiency of QString::operator=(~) could be boosted of up
to 30%! Here are some benchmarks to support this statement:
(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)
You can find the patch here: https://codereview.qt-project.org/c/qt/qtbase/+/494280
Best,
________________________
Dennis Oberst
Software Engineer
The Qt Company GmbH
Erich-Thilo-Str. 10
12489 Berlin, Germany
dennis.oberst at qt.io
https://www.qt.io
Geschäftsführer: Mika Pälsi,
Juha Varelius, Jouni Lintunen
Sitz der Gesellschaft: Berlin,
Registergericht: Amtsgericht
Charlottenburg, HRB 144331 B
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20230906/fcd90db5/attachment.htm>
More information about the Development
mailing list