Here's an interesting test for you ...
Using the STL I linked to, we can generate and sort 800 ints (not too bad on a 2 Kb machine):
// STL sort test
#include <iterator>
#include <vector>
#include <algorithm>
#include <Streaming.h>
#define ITEMS 800
void setup ()
{
Serial.begin (115200);
std::vector<int> v (ITEMS);
std::generate (v.begin (), v.end (), rand);
Serial << "Starting STL sort ... " << endl;
unsigned long start = millis ();
std::sort (v.begin (), v.end ());
unsigned long finish = millis ();
Serial << "Finished STL sort ... " << endl;
for (std::vector<int>::const_iterator i = v.begin (); i != v.end (); i++)
Serial << *i << endl;
Serial << "Took: " << (int) (finish - start) << " milliseconds." << endl;
}
void loop () {}
Output:
Starting STL sort ...
Finished STL sort ...
57
62
100
103
240
261
343
363
395
396
421
457
478
487
493
493
498
522
534
...
32449
32520
32558
32647
32660
32703
32723
Took: 10 milliseconds.
Now using qsort (first, it reset with 800 items, so I had to drop the test down to 700 items):
// qsort test
#include <iterator>
#include <algorithm>
#include <Streaming.h>
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
#define ITEMS 700
int v [ITEMS];
void setup ()
{
Serial.begin (115200);
std::generate_n (v, ITEMS, rand);
Serial << "Starting qsort ... " << endl;
unsigned long start = millis ();
qsort (v, ITEMS, sizeof(int), compare);
unsigned long finish = millis ();
Serial << "Finished qsort ... " << endl;
for (int i = 0; i < ITEMS; i++)
Serial << v [i] << endl;
Serial << "Took: " << (int) (finish - start) << " milliseconds." << endl;
}
void loop () {}
Output:
Starting qsort ...
Finished qsort ...
57
62
100
103
240
261
343
363
395
396
421
457
478
487
493
498
534
538
595
...
32006
32020
32059
32150
32291
32316
32320
32331
32334
32371
32449
32520
32558
32647
32660
32703
32723
Took: 32 milliseconds.
So qsort took 3 times as long to do 88% of the number of items!
And the STL version was more memory efficient. To compare apples with apples, dropping the STL sort down to 700 items, it only took 7 seconds.