Skip to content

switch from heap-based partialSort to quickselect#25

Merged
niklasf merged 1 commit intomasterfrom
quickselect
Nov 12, 2025
Merged

switch from heap-based partialSort to quickselect#25
niklasf merged 1 commit intomasterfrom
quickselect

Conversation

@niklasf
Copy link
Member

@niklasf niklasf commented Nov 10, 2025

Before (based on 13a0d52):

  HuffmanPgnBench.decode  avgt   40  4297.839 ± 63.417  us/op

After:

  HuffmanPgnBench.decode  avgt   40  3344.431 ± 15.417  us/op  # quickselect only <--

  HuffmanPgnBench.decode  avgt   20  3344.925 ± 31.764  us/op  # insertionSortCutoff = 3
  HuffmanPgnBench.decode  avgt   20  3345.941 ± 29.388  us/op  # insertionSortCutoff = 4
  HuffmanPgnBench.decode  avgt   40  3370.571 ± 24.539  us/op  # insertionSortCutoff = 5
  HuffmanPgnBench.decode  avgt   40  3365.226 ± 25.166  us/op  # insertionSortCutoff = 6
  HuffmanPgnBench.decode  avgt  120  3390.946 ± 17.816  us/op  # insertionSortCutoff = 7

  HuffmanPgnBench.decode  avgt   40  3415.760 ± 27.759  us/op  # sortCutoff = 4
  HuffmanPgnBench.decode  avgt   40  3431.564 ± 17.375  us/op  # sortCutoff = 5
  HuffmanPgnBench.decode  avgt   40  3437.750 ± 23.575  us/op  # sortCutoff = 6
  HuffmanPgnBench.decode  avgt   40  3430.231 ± 30.012  us/op  # sortCutoff = 7
  HuffmanPgnBench.decode  avgt   40  3430.460 ± 16.339  us/op  # sortCutoff = 8
  HuffmanPgnBench.decode  avgt   40  3504.320 ± 20.214  us/op  # sortCutoff = 10

@niklasf
Copy link
Member Author

niklasf commented Nov 10, 2025

@isaacl Based on your hint that decoding can be optimized if we don't need the sorted list.

@niklasf niklasf force-pushed the quickselect branch 2 times, most recently from e52aabd to d64d8df Compare November 10, 2025 23:53
Before (based on 13a0d52):

    HuffmanPgnBench.decode  avgt   40  4297.839 ± 63.417  us/op

After:

    HuffmanPgnBench.decode  avgt   40  3344.431 ± 15.417  us/op  # quickselect only <--

    HuffmanPgnBench.decode  avgt   20  3344.925 ± 31.764  us/op  # insertionSortCutoff = 3
    HuffmanPgnBench.decode  avgt   20  3345.941 ± 29.388  us/op  # insertionSortCutoff = 4
    HuffmanPgnBench.decode  avgt   40  3370.571 ± 24.539  us/op  # insertionSortCutoff = 5
    HuffmanPgnBench.decode  avgt   40  3365.226 ± 25.166  us/op  # insertionSortCutoff = 6
    HuffmanPgnBench.decode  avgt  120  3390.946 ± 17.816  us/op  # insertionSortCutoff = 7

    HuffmanPgnBench.decode  avgt   40  3415.760 ± 27.759  us/op  # sortCutoff = 4
    HuffmanPgnBench.decode  avgt   40  3431.564 ± 17.375  us/op  # sortCutoff = 5
    HuffmanPgnBench.decode  avgt   40  3437.750 ± 23.575  us/op  # sortCutoff = 6
    HuffmanPgnBench.decode  avgt   40  3430.231 ± 30.012  us/op  # sortCutoff = 7
    HuffmanPgnBench.decode  avgt   40  3430.460 ± 16.339  us/op  # sortCutoff = 8
    HuffmanPgnBench.decode  avgt   40  3504.320 ± 20.214  us/op  # sortCutoff = 10
@niklasf niklasf changed the title switch from partialSort to quickselect switch from heap-based partialSort to quickselect Nov 11, 2025
@niklasf
Copy link
Member Author

niklasf commented Nov 11, 2025

Rebased and reevaluated. Switching from quickselect to sorting no longer seems to do much.

@isaacl
Copy link
Member

isaacl commented Nov 12, 2025

fyi -- before the rebase/merge from master, I tested Arrays.sort and saw as a bit slower than your insertionSort for 7 elements.

@niklasf niklasf merged commit c71e256 into master Nov 12, 2025
2 checks passed
@niklasf niklasf deleted the quickselect branch November 12, 2025 18:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants