diff --git a/demo_stable_sort.cpp b/demo_stable_sort.cpp new file mode 100644 index 0000000..8fef73a --- /dev/null +++ b/demo_stable_sort.cpp @@ -0,0 +1,73 @@ +// compile with: +// debug: cl /EHsc /W4 /WX /std:c++latest /Festable_sort_debug /MDd /Zi .\demo_stable_sort.cpp +// release: cl /EHsc /W4 /WX /std:c++latest /Festable_sort_release /MD /Zi /O2 .\demo_stable_sort.cpp +#include <stddef.h> +#include <stdio.h> +#include <algorithm> +#include <chrono> +#include <execution> +#include <ratio> +#include <random> +#include <charconv> +#include <vector> + +using namespace std; // sorry Titus +using namespace std::chrono; +using namespace std::execution; + +const int iterationCount = 10; + +template<class ExPo> +steady_clock::duration run_stable_sort(vector<double>& doubles, ExPo&& ex, + const char * const tag) { + steady_clock::duration totalTime{}; + for (int i = 0; i < iterationCount; ++i) + { + const auto startTime = steady_clock::now(); + stable_sort(forward<ExPo>(ex), doubles.begin(), doubles.end()); + const auto endTime = steady_clock::now(); + totalTime += endTime - startTime; + printf("%s: Min: %g Max: %g Time: %gms\n", tag, doubles.front(), doubles.back(), + duration_cast<duration<double, milli>>(endTime - startTime).count()); + } + + return totalTime; +} + +void print_diff(const char * const name, + const steady_clock::duration baselineTime, + const steady_clock::duration compareTime) { + const char * direction; + double times; + if (baselineTime < compareTime) { + times = static_cast<double>(compareTime.count()) / baselineTime.count(); + direction = "slower"; + } + else { + times = static_cast<double>(baselineTime.count()) / compareTime.count(); + direction = "faster"; + } + + printf("%s was %g times %s\n", name, times, direction); +} + +int main(int argc, char **argv) { + if (argc != 2) { printf("Usage: %s number\n", argv[0]); return 1; } + size_t testSize; + auto[ptr, ec] = from_chars(argv[1], argv[1] + strlen(argv[1]), testSize); + if (ec != errc{}) { printf("Bad %s parse as integer.\n", argv[1]); return 2; } + + // generate some doubles: + printf("Testing with %zu doubles (%gmb)...\n", testSize, + static_cast<double>(testSize) * sizeof(double) / (1024*1024)); + vector<double> doubles; + doubles.reserve(testSize); + minstd_rand lce(1729); + for (size_t idx = 0; idx < testSize; ++idx) { + doubles.push_back(lce()); + } + // time how long it takes to stable_sort them: + const auto serialTime = run_stable_sort(doubles, seq, "Serial"); + const auto parallelTime = run_stable_sort(doubles, par, "Parallel"); + print_diff("Parallel", serialTime, parallelTime); +}