13af6ab5fSopenharmony_ci/* 23af6ab5fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License. 53af6ab5fSopenharmony_ci * You may obtain a copy of the License at 63af6ab5fSopenharmony_ci * 73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83af6ab5fSopenharmony_ci * 93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and 133af6ab5fSopenharmony_ci * limitations under the License. 143af6ab5fSopenharmony_ci */ 153af6ab5fSopenharmony_ci 163af6ab5fSopenharmony_ci 173af6ab5fSopenharmony_ciimport type { RawSourceMap } from 'typescript'; 183af6ab5fSopenharmony_ciimport Benchmark from 'benchmark'; 193af6ab5fSopenharmony_ciimport { 203af6ab5fSopenharmony_ci ArkObfuscator, 213af6ab5fSopenharmony_ci renameIdentifierModule 223af6ab5fSopenharmony_ci} from '../../src/ArkObfuscator'; 233af6ab5fSopenharmony_ciimport { 243af6ab5fSopenharmony_ci decodeSourcemap, 253af6ab5fSopenharmony_ci mergeSourceMap, 263af6ab5fSopenharmony_ci Source, 273af6ab5fSopenharmony_ci SourceMapLink 283af6ab5fSopenharmony_ci} from '../../src/utils/SourceMapMergingUtil'; 293af6ab5fSopenharmony_ciimport { 303af6ab5fSopenharmony_ci IDENTIFIER_CACHE, 313af6ab5fSopenharmony_ci MEM_METHOD_CACHE, 323af6ab5fSopenharmony_ci} from '../../src/utils/NameCacheUtil'; 333af6ab5fSopenharmony_ci 343af6ab5fSopenharmony_ciconst benchmarkSuite = new Benchmark.Suite; 353af6ab5fSopenharmony_ciconst namePaddingSize: number = 56; 363af6ab5fSopenharmony_ciconst dataPaddingSize: number = 16; 373af6ab5fSopenharmony_ci 383af6ab5fSopenharmony_ciconst previousMap = { 393af6ab5fSopenharmony_ci version: 3, 403af6ab5fSopenharmony_ci file: 'EntryAbility.ts', 413af6ab5fSopenharmony_ci sourceRoot: '', 423af6ab5fSopenharmony_ci sources: [ 'entry/src/main/ets/entryability/EntryAbility.ts' ], 433af6ab5fSopenharmony_ci names: [], 443af6ab5fSopenharmony_ci mappings: 'OAAO,SAAS;OACT,KAAK;YACL,MAAM;AAEb,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IACjD,QAAQ,CAAC,IAAI,EAAE,WAAW;' 453af6ab5fSopenharmony_ci + 'QACxB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAClE,CAAC;' 463af6ab5fSopenharmony_ci + 'IAED,SAAS;QACP,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;' 473af6ab5fSopenharmony_ci + 'IACnE,CAAC;IAED,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW;QACjD,yDAAyD;' 483af6ab5fSopenharmony_ci + 'QACzD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;' 493af6ab5fSopenharmony_ci + 'QAE3E,WAAW,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACnD,IAAI,GAAG,CAAC,IAAI,EAAE;' 503af6ab5fSopenharmony_ci + 'gBACZ,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,+CAA+C,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;' 513af6ab5fSopenharmony_ci + 'gBAC3G,OAAO;aACR;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,oDAAoD,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;' 523af6ab5fSopenharmony_ci + 'QAClH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;QAClB,yDAAyD;QACzD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,8BAA8B,CAAC,CAAC;' 533af6ab5fSopenharmony_ci + 'IAC9E,CAAC;IAED,YAAY;QACV,oCAAoC;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACtE,CAAC;' 543af6ab5fSopenharmony_ci + 'IAED,YAAY;QACV,iCAAiC;QACjC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACtE,CAAC;CACF', 553af6ab5fSopenharmony_ci sourcesContent: undefined 563af6ab5fSopenharmony_ci}; 573af6ab5fSopenharmony_ci 583af6ab5fSopenharmony_ciconst currentMap = { 593af6ab5fSopenharmony_ci version: 3, 603af6ab5fSopenharmony_ci file: 'EntryAbility.ts', 613af6ab5fSopenharmony_ci sourceRoot: '', 623af6ab5fSopenharmony_ci sources: [ 633af6ab5fSopenharmony_ci 'entry/build/default/cache/default/default@CompileArkTS/esmodule/release/entry/src/main/ets/entryability/EntryAbility.ts' 643af6ab5fSopenharmony_ci ], 653af6ab5fSopenharmony_ci names: [], 663af6ab5fSopenharmony_ci mappings: 'AAAA,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;' 673af6ab5fSopenharmony_ci + 'AACvC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IAC/C,QAAQ,CAAC,CAAI,EAAE,CAAW;' 683af6ab5fSopenharmony_ci + 'QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;' 693af6ab5fSopenharmony_ci + 'IACpE,CAAC;IACD,SAAS;QACL,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;' 703af6ab5fSopenharmony_ci + 'IACrE,CAAC;IACD,mBAAmB,CAAC,GAAa,MAAM,CAAC,WAAW;QAE/C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;' 713af6ab5fSopenharmony_ci + 'QAC3E,EAAY,WAAW,CAAC,aAAa,EAAE,CAAC,CAAG,EAAE,CAAI,EAAE,EAAE;YACjD,IAAI,EAAI,IAAI,EAAE;' 723af6ab5fSopenharmony_ci + 'gBACV,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,+CAA+C,EAAE,IAAI,CAAC,SAAS,GAAK,IAAI,EAAE,CAAC,CAAC;' 733af6ab5fSopenharmony_ci + 'gBAC3G,OAAO;aACV;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,oDAAoD,EAAE,IAAI,CAAC,SAAS,GAAM,IAAI,EAAE,CAAC,CAAC;' 743af6ab5fSopenharmony_ci + 'QACpH,CAAC,CAAC,CAAC;IACP,CAAC;IACD,oBAAoB;QAEhB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,8BAA8B,CAAC,CAAC;' 753af6ab5fSopenharmony_ci + 'IAChF,CAAC;IACD,YAAY;QAER,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACxE,CAAC;IACD,YAAY;' 763af6ab5fSopenharmony_ci + 'QAER,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACxE,CAAC;CACJ', 773af6ab5fSopenharmony_ci sourcesContent: undefined 783af6ab5fSopenharmony_ci}; 793af6ab5fSopenharmony_ci 803af6ab5fSopenharmony_cirenameIdentifierModule.nameCache = new Map([ 813af6ab5fSopenharmony_ci [ 823af6ab5fSopenharmony_ci 'IdentifierCache', 833af6ab5fSopenharmony_ci new Map([ 843af6ab5fSopenharmony_ci ['EntryAbility#onWindowStageCreate#windowStage', 'a'], 853af6ab5fSopenharmony_ci ['EntryAbility#onWindowStageCreate#__function', 'b'], 863af6ab5fSopenharmony_ci ['EntryAbility#onWindowStageCreate#$0#err', 'c'], 873af6ab5fSopenharmony_ci ['EntryAbility#onWindowStageCreate#$0#data', 'd'], 883af6ab5fSopenharmony_ci ['EntryAbility#onCreate#want', 'e'], 893af6ab5fSopenharmony_ci ['EntryAbility#onCreate#launchParam', 'f'] 903af6ab5fSopenharmony_ci ]) 913af6ab5fSopenharmony_ci ], 923af6ab5fSopenharmony_ci [ 933af6ab5fSopenharmony_ci 'MemberMethodCache', 943af6ab5fSopenharmony_ci new Map([ 953af6ab5fSopenharmony_ci ['onCreate:5:5:7:6', 'onCreate'], 963af6ab5fSopenharmony_ci ['onDestroy:8:5:10:6', 'onDestroy'], 973af6ab5fSopenharmony_ci ['onWindowStageCreate:11:5:20:6', 'onWindowStageCreate'], 983af6ab5fSopenharmony_ci ['onWindowStageDestroy:21:5:23:6', 'onWindowStageDestroy'], 993af6ab5fSopenharmony_ci ['onForeground:24:5:26:6', 'onForeground'], 1003af6ab5fSopenharmony_ci ['onBackground:27:5:29:6', 'onBackground'] 1013af6ab5fSopenharmony_ci ]) 1023af6ab5fSopenharmony_ci ] 1033af6ab5fSopenharmony_ci]); 1043af6ab5fSopenharmony_ci 1053af6ab5fSopenharmony_cifunction alignColumn(name, ops, variance, runsSampled) { 1063af6ab5fSopenharmony_ci const namePadding = name.padEnd(namePaddingSize); 1073af6ab5fSopenharmony_ci const opsPadding = ops.padEnd(dataPaddingSize); 1083af6ab5fSopenharmony_ci const variancePadding = variance.padEnd(dataPaddingSize); 1093af6ab5fSopenharmony_ci const runsSampledPadding = runsSampled.toString().padEnd(dataPaddingSize); 1103af6ab5fSopenharmony_ci return `| ${namePadding} | ${opsPadding} | ${variancePadding} | ${runsSampledPadding} |`; 1113af6ab5fSopenharmony_ci} 1123af6ab5fSopenharmony_ci 1133af6ab5fSopenharmony_ciclass ArkObfuscatorMock extends ArkObfuscator { 1143af6ab5fSopenharmony_ci convertLineBasedOnSourceMapMock(targetCache: string, sourceMapLink?: SourceMapLink): Map<string, string> { 1153af6ab5fSopenharmony_ci // Ignore `property is private and only accessible within class` error 1163af6ab5fSopenharmony_ci // @ts-ignore 1173af6ab5fSopenharmony_ci return this.convertLineBasedOnSourceMap(targetCache, sourceMapLink); 1183af6ab5fSopenharmony_ci } 1193af6ab5fSopenharmony_ci}; 1203af6ab5fSopenharmony_ci 1213af6ab5fSopenharmony_cidescribe('SourceMap Benchmark Test', function() { 1223af6ab5fSopenharmony_ci after(() => { 1233af6ab5fSopenharmony_ci benchmarkSuite.on('complete', function() { 1243af6ab5fSopenharmony_ci console.log('\n Benchmark Summary Results:\n'); 1253af6ab5fSopenharmony_ci console.log(' ', alignColumn('Test Name', 'Ops/Sec', 'Variance', 'Number of Runs')); 1263af6ab5fSopenharmony_ci console.log(' ',alignColumn('-'.repeat(namePaddingSize), '-'.repeat(dataPaddingSize), 1273af6ab5fSopenharmony_ci '-'.repeat(dataPaddingSize), '-'.repeat(dataPaddingSize))); 1283af6ab5fSopenharmony_ci this.forEach(result => { 1293af6ab5fSopenharmony_ci console.log(' ', alignColumn(result.name, `${Math.round(result.hz)}`, 1303af6ab5fSopenharmony_ci `${result.stats.rme.toFixed(2)}%`, result.stats.sample.length)); 1313af6ab5fSopenharmony_ci }); 1323af6ab5fSopenharmony_ci console.log('\n'); 1333af6ab5fSopenharmony_ci }); 1343af6ab5fSopenharmony_ci }); 1353af6ab5fSopenharmony_ci 1363af6ab5fSopenharmony_ci it('run sourcemap benchmark test', function() { 1373af6ab5fSopenharmony_ci let decodedSourceMap; 1383af6ab5fSopenharmony_ci benchmarkSuite.add('decodeSourcemap', function() { 1393af6ab5fSopenharmony_ci decodedSourceMap = decodeSourcemap(previousMap as RawSourceMap); 1403af6ab5fSopenharmony_ci }); 1413af6ab5fSopenharmony_ci 1423af6ab5fSopenharmony_ci benchmarkSuite.add('mergeSourceMap', function() { 1433af6ab5fSopenharmony_ci mergeSourceMap(previousMap as RawSourceMap, currentMap as RawSourceMap); 1443af6ab5fSopenharmony_ci }); 1453af6ab5fSopenharmony_ci 1463af6ab5fSopenharmony_ci benchmarkSuite.add('convertLineBasedOnSourceMap', function() { 1473af6ab5fSopenharmony_ci const sourceFileName = previousMap.sources?.length === 1 ? previousMap.sources[0] : ''; 1483af6ab5fSopenharmony_ci const source = new Source(sourceFileName, null); 1493af6ab5fSopenharmony_ci const sourceMapLink = new SourceMapLink(decodedSourceMap!, [source]); 1503af6ab5fSopenharmony_ci const arkObfuscator = new ArkObfuscatorMock(); 1513af6ab5fSopenharmony_ci arkObfuscator.convertLineBasedOnSourceMapMock(IDENTIFIER_CACHE, sourceMapLink); 1523af6ab5fSopenharmony_ci arkObfuscator.convertLineBasedOnSourceMapMock(MEM_METHOD_CACHE, sourceMapLink); 1533af6ab5fSopenharmony_ci }); 1543af6ab5fSopenharmony_ci 1553af6ab5fSopenharmony_ci benchmarkSuite.on('cycle', (event: any) => { 1563af6ab5fSopenharmony_ci console.log(' ', String(event.target)); 1573af6ab5fSopenharmony_ci }); 1583af6ab5fSopenharmony_ci 1593af6ab5fSopenharmony_ci benchmarkSuite.run({ 'async': true }); 1603af6ab5fSopenharmony_ci }); 1613af6ab5fSopenharmony_ci});