summaryrefslogtreecommitdiff
path: root/deps/v8/test/js-perf-test/ArraySort/sort-base.js
blob: a3301752b28aabaaf62489b1fc3ab970d3a80139 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

const kArraySize = 4000;
let template_array = [];

for (let i = 0; i < kArraySize; ++i) {
  template_array[i] = Math.floor(Math.random() * kArraySize);
}

let array_to_sort = [];

function assert(condition, message) {
  if (!condition) {
    throw Error(message);
  }
}

function AssertPackedSmiElements() {
  assert(%HasFastPackedElements(array_to_sort) &&
         %HasSmiElements(array_to_sort),
         "Element kind is not PACKED_SMI_ELEMENTS");
}

function AssertPackedDoubleElements() {
  assert(%HasFastPackedElements(array_to_sort) &&
         %HasDoubleElements(array_to_sort),
         "Element kind is not PACKED_DOUBLE_ELEMENTS");
}

function AssertPackedObjectElements() {
  assert(%HasFastPackedElements(array_to_sort) &&
         %HasObjectElements(array_to_sort),
         "Element kind is not PACKED_ELEMENTS");
}

function AssertHoleySmiElements() {
  assert(%HasHoleyElements(array_to_sort) &&
         %HasSmiElements(array_to_sort),
         "Element kind is not HOLEY_SMI_ELEMENTS");
}

function AssertHoleyDoubleElements() {
  assert(%HasHoleyElements(array_to_sort) &&
         %HasDoubleElements(array_to_sort),
         "Element kind is not HOLEY_DOUBLE_ELEMENTS");
}

function AssertHoleyObjectElements() {
  assert(%HasHoleyElements(array_to_sort) &&
         %HasObjectElements(array_to_sort),
         "Element kind is not HOLEY_ELEMENTS");
}

function AssertDictionaryElements() {
  assert(%HasDictionaryElements(array_to_sort),
         "Element kind is not DICTIONARY_ELEMENTS");
}

function CreatePackedSmiArray() {
  array_to_sort = Array.from(template_array);
  AssertPackedSmiElements();
}

function CreatePackedDoubleArray() {
  array_to_sort = Array.from(template_array, (x,_) => x + 0.1);
  AssertPackedDoubleElements();
}

function CreatePackedObjectArray() {
  array_to_sort = Array.from(template_array, (x,_) => `value ${x}`);
  AssertPackedObjectElements();
}

function CreateHoleySmiArray() {
  array_to_sort = Array.from(template_array);
  delete array_to_sort[0];
  AssertHoleySmiElements();
}

function CreateHoleyDoubleArray() {
  array_to_sort = new Array(kArraySize);
  for (let i = 0; i < kArraySize; ++i) {
    array_to_sort[i] = template_array[i] + 0.1;
  }

  AssertHoleyDoubleElements();
}

function CreateHoleyObjectArray() {
  array_to_sort = new Array(kArraySize);
  for (let i = 0; i < kArraySize; ++i) {
    array_to_sort[i] = `value ${template_array[i]}`;
  }

  AssertHoleyObjectElements();
}

function CreateDictionaryArray() {
  array_to_sort = Array.from(template_array);
  array_to_sort[%MaxSmi()] = 42;

  AssertDictionaryElements();
}

function Sort() {
  array_to_sort.sort();
}

function CreateSortFn(comparefns = []) {
  return () => {
    for (let cmpfn of comparefns) {
      array_to_sort.sort(cmpfn);
    }
  }
}

function cmp_smaller(a, b) {
  if (a < b) return -1;
  if (b < a) return 1;
  return 0;
}

function cmp_greater(a, b) { return cmp_smaller(b, a); }

// The counter is used in some benchmarks to trigger actions during sorting.
// To keep benchmarks deterministic, the counter needs to be reset for each
// iteration.
let counter = 0;

// Sorting benchmarks need to execute setup and tearDown for each iteration.
// Otherwise the benchmarks would mainly measure sorting already sorted arrays
// which, depending on the strategy, is either the worst- or best case.
function createSortSuite(name, reference, run, setup, tearDown = () => {}) {
  let run_fn = () => {
    counter = 0;

    setup();
    run();
    tearDown();
  };

  return createSuite(name, reference, run_fn);
}