• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/**
17 * Based on the following test cases in JSPerf:
18 *   - https://gitee.com/dov1s/arkjs-perf-test/blob/builtins_test1110/js-perf-test/Array/includes.js
19 *   - https://gitee.com/dov1s/arkjs-perf-test/blob/builtins_test1110/js-perf-test/Array/index-of.js
20 *   - https://gitee.com/dov1s/arkjs-perf-test/blob/builtins_test1110/js-perf-test/Array/last-index-of.js
21 */
22
23const REP_COUNT = 1_000_000;
24
25const result = {}
26
27function addToResult(fnName, subCaseName, timeInMs) {
28    print(`${fnName}.${subCaseName}: ${timeInMs.toFixed(3)} ms.`);
29    result[`${fnName}.${subCaseName}`] = timeInMs;
30}
31
32function noOpFn(_) { /* no-op */ }
33
34const fnNames = ['includes', 'indexOf', 'lastIndexOf'];
35for (let i = 0; i < fnNames.length; i++) {
36    print(`==== Array.prototype.${fnNames[i]} ====`);
37    const fnName = fnNames[i];
38
39    let array1 = new Array();
40    let array2 = new Array();
41    let array3 = new Array();
42    let array4 = new Array();
43    let array_size = 1000;
44
45    for (let i = 0; i < array_size; ++i) array1[i] = i;
46    for (let i = 0; i < array_size; ++i) array2[i] = i * 0.9;
47    for (let i = 0; i < array_size; i++) array3[i] = `string.${i}`;
48    for (let i = 0; i < array_size; i++) array4[i] = { ["obj" + i]: i };
49
50    const arrays = [array1, array2, array3, array4];
51    for (let i = 0; i < arrays.length; i++) {
52        print(`ElementsKind of array${i + 1} = ${ArkTools.getElementsKind(arrays[i])}`);
53    }
54
55    addToResult(fnNames[i], 'int', (() => {
56        const s = ArkTools.timeInUs();
57        for (let i = 0; i < REP_COUNT; i++) {
58            array1[fnName](i);
59        }
60        const t = ArkTools.timeInUs();
61        for (let i = 0; i < REP_COUNT; i++) {
62            array1[fnName];
63            i;
64        }
65        const u = ArkTools.timeInUs();
66        return (2 * t - s - u) / 1000.0;
67    })());
68    addToResult(fnNames[i], 'double', (() => {
69        const s = ArkTools.timeInUs();
70        for (let i = 0; i < REP_COUNT; i++) {
71            array2[fnName](i);
72        }
73        const t = ArkTools.timeInUs();
74        for (let i = 0; i < REP_COUNT; i++) {
75            array2[fnName];
76            i;
77        }
78        const u = ArkTools.timeInUs();
79        return (2 * t - s - u) / 1000.0;
80    })());
81    addToResult(fnNames[i], 'string', (() => {
82        const s = ArkTools.timeInUs();
83        for (let i = 0; i < REP_COUNT; i++) {
84            array3[fnName](`string.${i}`);
85        }
86        const t = ArkTools.timeInUs();
87        for (let i = 0; i < REP_COUNT; i++) {
88            array3[fnName];
89            `string.${i}`;
90        }
91        const u = ArkTools.timeInUs();
92        return (2 * t - s - u) / 1000.0;
93    })());
94    addToResult(fnNames[i], 'object', (() => {
95        const s = ArkTools.timeInUs();
96        for (let i = 0; i < REP_COUNT; i++) {
97            array4[fnName]({ ['obj' + i]: i });
98        }
99        const t = ArkTools.timeInUs();
100        for (let i = 0; i < REP_COUNT; i++) {
101            array4[fnName];
102            ({ ['obj' + i]: i });
103        }
104        const u = ArkTools.timeInUs();
105        return (2 * t - s - u) / 1000.0;
106    })());
107}
108
109print(JSON.stringify(result, null, 4));
110