sort.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import * as B from 'benchmark'
  2. import * as Sort from 'mol-data/util'
  3. function shuffle(a: number[]) {
  4. for (let i = a.length - 1; i > 0; i--) {
  5. const j = Math.floor(Math.random() * (i + 1));
  6. const t = a[i];
  7. a[i] = a[j];
  8. a[j] = t;
  9. }
  10. return a;
  11. }
  12. function createTestData(n: number) {
  13. const data = new Int32Array(n); // new Array(n);
  14. for (let i = 0; i < n; i++) {
  15. data[i] = i;
  16. // data[i] = (n * Math.random()) | 0;
  17. }
  18. shuffle(data as any);
  19. return data;
  20. }
  21. export function copyArray(xs: any) {
  22. const ret = new xs.constructor(xs.length);
  23. for (let i = 0, _i = xs.length; i < _i; i++) ret[i] = xs[i];
  24. return ret;
  25. }
  26. export function checkSorted(arr: ArrayLike<number>) {
  27. for (let i = 0; i < arr.length - 1; i++) {
  28. if (arr[i] > arr[i + 1]) {
  29. return false;
  30. }
  31. }
  32. return true;
  33. }
  34. export function runTest(size: number) {
  35. const _data = createTestData(size);
  36. const dataCopies: number[][] = [];
  37. let dataOffset = 0;
  38. function prepareData() {
  39. dataOffset = 0;
  40. for (let i = 0; i < 100; i++) {
  41. dataCopies[i] = copyArray(_data);
  42. }
  43. }
  44. function getData() {
  45. if (dataOffset < dataCopies.length) return dataCopies[dataOffset++];
  46. return copyArray(_data);
  47. }
  48. prepareData();
  49. const suite = new B.Suite();
  50. function le(x: number, y: number) { return x - y; }
  51. function name(n: string) { return `${n} (${size} elems)` }
  52. // TODO: the data copying skewes the benchmark -- write a simple benchmark util that allows for a preparation step.
  53. suite
  54. .add(name('native'), () => Array.prototype.sort.call(getData(), le))
  55. .add(name('qsort'), () => Sort.sortArray(getData()))
  56. // .add(name('qsort'), () => Sort.sort(getData(), 0, _data.length, Sort.arrayLess, Sort.arraySwap))
  57. .add(name('native sorted'), () => Array.prototype.sort.call(_data, le))
  58. .add(name('qsort sorted'), () => Sort.sortArray(_data))
  59. // .add(name('qsort sorted'), () => Sort.sort(_data, 0, _data.length, Sort.arrayLess, Sort.arraySwap))
  60. .on('cycle', (e: any) => {
  61. prepareData();
  62. console.log(String(e.target));
  63. })
  64. .run();
  65. console.log('---------------------');
  66. }
  67. // runTest(10);
  68. // runTest(100);
  69. // runTest(1000);
  70. runTest(10000);
  71. // runTest(100000);