Skip to content

Commit 4073118

Browse files
refactor(sort): Optimize _pdqSort3 based on @lrhn's suggestion
Caches elements and keys in local variables within `_pdqSort3` to reduce `keyOf` calls from a potential 6 down to 3, and to minimize list access during pivot selection.
1 parent ec13079 commit 4073118

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

pkgs/collection/lib/src/algorithms.dart

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -615,15 +615,30 @@ void _pdqSiftDown<E, K>(List<E> elements, K Function(E) keyOf,
615615
/// Sorts three elements at indices [a], [b], and [c].
616616
void _pdqSort3<E, K>(List<E> elements, K Function(E) keyOf,
617617
int Function(K, K) compare, int a, int b, int c) {
618-
if (compare(keyOf(elements[a]), keyOf(elements[b])) > 0) {
619-
_pdqSwap(elements, a, b);
618+
var elementA = elements[a];
619+
var keyA = keyOf(elementA);
620+
var elementB = elements[b];
621+
var keyB = keyOf(elementB);
622+
var elementC = elements[c];
623+
var keyC = keyOf(elementC);
624+
625+
if (compare(keyA, keyB) > 0) {
626+
(elementA, elementB) = (elementB, elementA);
627+
(keyA, keyB) = (keyB, keyA);
620628
}
621-
if (compare(keyOf(elements[b]), keyOf(elements[c])) > 0) {
622-
_pdqSwap(elements, b, c);
623-
if (compare(keyOf(elements[a]), keyOf(elements[b])) > 0) {
624-
_pdqSwap(elements, a, b);
629+
630+
if (compare(keyB, keyC) > 0) {
631+
(elementB, elementC) = (elementC, elementB);
632+
(keyB, keyC) = (keyC, keyB);
633+
if (compare(keyA, keyB) > 0) {
634+
(elementA, elementB) = (elementB, elementA);
635+
(keyA, keyB) = (keyB, keyA);
625636
}
626637
}
638+
639+
elements[a] = elementA;
640+
elements[b] = elementB;
641+
elements[c] = elementC;
627642
}
628643

629644
/// The core implementation of Pattern-defeating Quicksort.

0 commit comments

Comments
 (0)