Skip to content

WIP: Added heap sort, tested against aseba_comb_sort and C++ std::sort#688

Open
shilingwang wants to merge 2 commits into
aseba-community:masterfrom
shilingwang:natives-heapsort
Open

WIP: Added heap sort, tested against aseba_comb_sort and C++ std::sort#688
shilingwang wants to merge 2 commits into
aseba-community:masterfrom
shilingwang:natives-heapsort

Conversation

@shilingwang

@shilingwang shilingwang commented Sep 18, 2017

Copy link
Copy Markdown
Contributor

As described in issue #674, the complexity of math.sort (comb sort) is worst case O(n^2) and best case O(n log(n)). Here I implement heap sort, which should be worst-case O(n log(n)) complexity. The test results (Linux x86_64, g++ 5.4.0, i7-5600U CPU, no optimisation) for comb sort, heap sort and c++ std::sort show that when the data are in random order, the three implementations are not much different and std::sort and comb sort are always a little bit better than heap sort. When the data are already in sorted order without duplication, heap sort is slower than the other two (no more than double). However, when the data is const, heap sort is much faster than comb sort (10 times or more).

@stephanemagnenat

Copy link
Copy Markdown
Member

Here (macOS 10.12.6, clang 8.1.0, Core i7-6700K, -O2), std::sort outperforms everything else in any condition. For 1k element arrays, heap sort is 4 times faster than comb sort on constant arrays, 4 times slower on already-sorted arrays, and about the same speed otherwise.

It would be very interesting to test on the typical target processor of Aseba, I expect heap sort to be proportionally faster when the processor becomes more primitive.

@stephanemagnenat

Copy link
Copy Markdown
Member

Do we have a way to run performance test on a simulator of the target's device?

@davidjsherman

Copy link
Copy Markdown
Collaborator

The Microchip simulator has a Stopwatch that can measure the number of milliseconds between breakpoints. So it should be possible to test the timing in the MPLABX IDE simulator.

While it is possible to submit a script of commands to Microchip's command-line simulator sim30, as far as I can tell the stopwatch isn't available.

If you write an Aseba language program that tests the sorting speed, for example by incrementing a counter with every onevent motor, then I suppose one could run that bytecode in the Microchip simulator. The sim30 script could write the contents of the counters to the pseudo-UART, so that it wouldn't be necessary to analyze a VM memory dump.

@stephanemagnenat

Copy link
Copy Markdown
Member

That's a good idea. Actually we could also try with the physical robot. One just need to recompile the firmware.

@stephanemagnenat stephanemagnenat changed the title Added heap sort, tested against aseba_comb_sort and C++ std::sort WIP: Added heap sort, tested against aseba_comb_sort and C++ std::sort Mar 1, 2018
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.

3 participants