browser_metrics_pool.js (3419B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const { 7 DevToolsServer, 8 } = require("resource://devtools/server/devtools-server.js"); 9 const { Pool } = require("resource://devtools/shared/protocol.js"); 10 11 // Test parameters 12 const ROOT_POOLS = 100; 13 const POOL_DEPTH = 10; 14 const POOLS_BY_LEVEL = 100; 15 // Number of Pools that will be added once the environment is set up. 16 const ADDITIONAL_POOLS = 5000; 17 18 add_task(async function () { 19 DevToolsServer.init(); 20 DevToolsServer.registerAllActors(); 21 const conn = DevToolsServer.connectPipe()._serverConnection; 22 23 info("Add multiple Pools to the connection"); 24 const pools = setupTestEnvironment(conn); 25 26 let sumResult = 0; 27 28 info("Test how long it takes to manage new Pools"); 29 let start = performance.now(); 30 let parentPool = pools[pools.length - 1]; 31 const newPools = []; 32 for (let i = 0; i < ADDITIONAL_POOLS; i++) { 33 const pool = new Pool(conn, `${parentPool.label}-${i}`); 34 newPools.push(pool); 35 parentPool.manage(pool); 36 } 37 const manageResult = performance.now() - start; 38 sumResult += manageResult; 39 40 info("Test how long it takes to manage Pools that were already managed"); 41 start = performance.now(); 42 parentPool = pools[pools.length - 2]; 43 for (const pool of newPools) { 44 parentPool.manage(pool); 45 } 46 const manageAlreadyManagedResult = performance.now() - start; 47 sumResult += manageAlreadyManagedResult; 48 49 info("Test how long it takes to unmanage Pools"); 50 start = performance.now(); 51 for (const pool of newPools) { 52 parentPool.unmanage(pool); 53 } 54 const unmanageResult = performance.now() - start; 55 sumResult += unmanageResult; 56 57 info("Test how long it takes to destroy all the Pools"); 58 start = performance.now(); 59 conn.onTransportClosed(); 60 const destroyResult = performance.now() - start; 61 sumResult += destroyResult; 62 63 const PERFHERDER_DATA = { 64 framework: { 65 name: "devtools", 66 }, 67 suites: [ 68 { 69 name: "server.pool", 70 value: sumResult, 71 subtests: [ 72 { 73 name: "server.pool.manage", 74 value: manageResult, 75 }, 76 { 77 name: "server.pool.manage-already-managed", 78 value: manageAlreadyManagedResult, 79 }, 80 { 81 name: "server.pool.unmanage", 82 value: unmanageResult, 83 }, 84 { 85 name: "server.pool.destroy", 86 value: destroyResult, 87 }, 88 ], 89 }, 90 ], 91 }; 92 info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); 93 }); 94 95 // Some Pool operations might be impacted by the number of existing pools in a connection, 96 // so it's important to have a sizeable number of Pools in order to assert Pool performances. 97 function setupTestEnvironment(conn) { 98 const pools = []; 99 for (let i = 0; i < ROOT_POOLS; i++) { 100 const rootPool = new Pool(conn, "root-pool-" + i); 101 pools.push(rootPool); 102 let parent = rootPool; 103 for (let j = 0; j < POOL_DEPTH; j++) { 104 const intermediatePool = new Pool(conn, `pool-${i}-${j}`); 105 pools.push(intermediatePool); 106 parent.manage(intermediatePool); 107 108 for (let k = 0; k < POOLS_BY_LEVEL; k++) { 109 const pool = new Pool(conn, `pool-${i}-${j}-${k}`); 110 pools.push(pool); 111 intermediatePool.manage(pool); 112 } 113 114 parent = intermediatePool; 115 } 116 } 117 return pools; 118 }