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