From 80b66c849a7e0ddde61719976c30dc92d281ac29 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 1 Mar 2024 17:26:21 -0500 Subject: [PATCH] Add more benchmark tools to devtool page --- src/devtools.html | 2 ++ src/js/benchmarks.js | 57 +++++++++++++++++++++++------------- src/js/cosmetic-filtering.js | 4 +-- src/js/devtools.js | 20 +++++++++++++ src/js/messaging.js | 24 ++++++++++++--- 5 files changed, 80 insertions(+), 27 deletions(-) diff --git a/src/devtools.html b/src/devtools.html index af7b972af..f4626353f 100644 --- a/src/devtools.html +++ b/src/devtools.html @@ -29,6 +29,8 @@ + +
diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index f3fc53d9e..9fdc6ec10 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -74,8 +74,8 @@ const loadBenchmarkDataset = (( ) => { datasetPromise = undefined; }); - return function() { - ttlTimer.offon({ min: 5 }); + return async function() { + ttlTimer.offon({ min: 2 }); if ( datasetPromise !== undefined ) { return datasetPromise; @@ -84,7 +84,7 @@ const loadBenchmarkDataset = (( ) => { const datasetURL = µb.hiddenSettings.benchmarkDatasetURL; if ( datasetURL === 'unset' ) { console.info(`No benchmark dataset available.`); - return Promise.resolve(); + return; } console.info(`Loading benchmark dataset...`); datasetPromise = io.fetchText(datasetURL).then(details => { @@ -136,7 +136,7 @@ const loadBenchmarkDataset = (( ) => { // action: 1=test -µb.benchmarkStaticNetFiltering = async function(options = {}) { +export async function benchmarkStaticNetFiltering(options = {}) { const { target, redirectEngine } = options; const requests = await loadBenchmarkDataset(); @@ -231,11 +231,11 @@ const loadBenchmarkDataset = (( ) => { const s = output.join('\n'); console.info(s); return s; -}; +} /******************************************************************************/ -µb.tokenHistograms = async function() { +export async function tokenHistogramsfunction() { const requests = await loadBenchmarkDataset(); if ( Array.isArray(requests) === false || requests.length === 0 ) { console.info('No requests found to benchmark'); @@ -272,11 +272,11 @@ const loadBenchmarkDataset = (( ) => { const tophits = Array.from(hitTokenMap).sort(customSort).slice(0, 100); console.info('Misses:', JSON.stringify(topmisses)); console.info('Hits:', JSON.stringify(tophits)); -}; +} /******************************************************************************/ -µb.benchmarkDynamicNetFiltering = async function() { +export async function benchmarkDynamicNetFiltering() { const requests = await loadBenchmarkDataset(); if ( Array.isArray(requests) === false || requests.length === 0 ) { console.info('No requests found to benchmark'); @@ -299,17 +299,19 @@ const loadBenchmarkDataset = (( ) => { const dur = t1 - t0; console.info(`Evaluated ${requests.length} requests in ${dur.toFixed(0)} ms`); console.info(`\tAverage: ${(dur / requests.length).toFixed(3)} ms per request`); -}; +} /******************************************************************************/ -µb.benchmarkCosmeticFiltering = async function() { +export async function benchmarkCosmeticFiltering() { const requests = await loadBenchmarkDataset(); if ( Array.isArray(requests) === false || requests.length === 0 ) { console.info('No requests found to benchmark'); return; } - console.info('Benchmarking cosmeticFilteringEngine.retrieveSpecificSelectors()...'); + const output = [ + 'Benchmarking cosmeticFilteringEngine.retrieveSpecificSelectors()...', + ]; const details = { tabId: undefined, frameId: undefined, @@ -320,6 +322,7 @@ const loadBenchmarkDataset = (( ) => { const options = { noSpecificCosmeticFiltering: false, noGenericCosmeticFiltering: false, + dontInject: true, }; let count = 0; const t0 = performance.now(); @@ -334,19 +337,26 @@ const loadBenchmarkDataset = (( ) => { } const t1 = performance.now(); const dur = t1 - t0; - console.info(`Evaluated ${count} requests in ${dur.toFixed(0)} ms`); - console.info(`\tAverage: ${(dur / count).toFixed(3)} ms per request`); -}; + output.push( + `Evaluated ${count} retrieval in ${dur.toFixed(0)} ms`, + `\tAverage: ${(dur / count).toFixed(3)} ms per document` + ); + const s = output.join('\n'); + console.info(s); + return s; +} /******************************************************************************/ -µb.benchmarkScriptletFiltering = async function() { +export async function benchmarkScriptletFiltering() { const requests = await loadBenchmarkDataset(); if ( Array.isArray(requests) === false || requests.length === 0 ) { console.info('No requests found to benchmark'); return; } - console.info('Benchmarking scriptletFilteringEngine.retrieve()...'); + const output = [ + 'Benchmarking scriptletFilteringEngine.retrieve()...', + ]; const details = { domain: '', entity: '', @@ -369,13 +379,18 @@ const loadBenchmarkDataset = (( ) => { } const t1 = performance.now(); const dur = t1 - t0; - console.info(`Evaluated ${count} requests in ${dur.toFixed(0)} ms`); - console.info(`\tAverage: ${(dur / count).toFixed(3)} ms per request`); -}; + output.push( + `Evaluated ${count} retrieval in ${dur.toFixed(0)} ms`, + `\tAverage: ${(dur / count).toFixed(3)} ms per document` + ); + const s = output.join('\n'); + console.info(s); + return s; +} /******************************************************************************/ -µb.benchmarkOnBeforeRequest = async function() { +export async function benchmarkOnBeforeRequest() { const requests = await loadBenchmarkDataset(); if ( Array.isArray(requests) === false || requests.length === 0 ) { console.info('No requests found to benchmark'); @@ -417,6 +432,6 @@ const loadBenchmarkDataset = (( ) => { console.info(`\tBlocked ${blockCount} requests`); console.info(`\tAverage: ${(dur / requests.length).toFixed(3)} ms per request`); }); -}; +} /******************************************************************************/ diff --git a/src/js/cosmetic-filtering.js b/src/js/cosmetic-filtering.js index 04fc93a8f..64e654962 100644 --- a/src/js/cosmetic-filtering.js +++ b/src/js/cosmetic-filtering.js @@ -930,7 +930,7 @@ FilterContainer.prototype.retrieveSpecificSelectors = function( if ( injectedCSS.length !== 0 ) { out.injectedCSS = injectedCSS.join('\n\n'); details.code = out.injectedCSS; - if ( request.tabId !== undefined ) { + if ( request.tabId !== undefined && options.dontInject !== true ) { vAPI.tabs.insertCSS(request.tabId, details); } } @@ -940,7 +940,7 @@ FilterContainer.prototype.retrieveSpecificSelectors = function( const networkFilters = []; if ( cacheEntry.retrieveNet(networkFilters) ) { details.code = `${networkFilters.join('\n')}\n{display:none!important;}`; - if ( request.tabId !== undefined ) { + if ( request.tabId !== undefined && options.dontInject !== true ) { vAPI.tabs.insertCSS(request.tabId, details); } } diff --git a/src/js/devtools.js b/src/js/devtools.js index 93b26978e..7d7938965 100644 --- a/src/js/devtools.js +++ b/src/js/devtools.js @@ -187,6 +187,26 @@ vAPI.messaging.send('dashboard', { dom.attr(button, 'disabled', null); }); }); + dom.on('#cfe-benchmark', 'click', ev => { + const button = ev.target; + dom.attr(button, 'disabled', ''); + vAPI.messaging.send('devTools', { + what: 'cfeBenchmark', + }).then(result => { + log(result); + dom.attr(button, 'disabled', null); + }); + }); + dom.on('#sfe-benchmark', 'click', ev => { + const button = ev.target; + dom.attr(button, 'disabled', ''); + vAPI.messaging.send('devTools', { + what: 'sfeBenchmark', + }).then(result => { + log(result); + dom.attr(button, 'disabled', null); + }); + }); }); /******************************************************************************/ diff --git a/src/js/messaging.js b/src/js/messaging.js index f34443cf7..00b13cdae 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -64,8 +64,6 @@ import { isNetworkURI, } from './uri-utils.js'; -import './benchmarks.js'; - /******************************************************************************/ // https://github.com/uBlockOrigin/uBlock-issues/issues/710 @@ -1847,8 +1845,26 @@ const onMessage = function(request, sender, callback) { return; case 'snfeBenchmark': - µb.benchmarkStaticNetFiltering({ redirectEngine }).then(result => { - callback(result); + import('/js/benchmarks.js').then(module => { + module.benchmarkStaticNetFiltering({ redirectEngine }).then(result => { + callback(result); + }); + }); + return; + + case 'cfeBenchmark': + import('/js/benchmarks.js').then(module => { + module.benchmarkCosmeticFiltering().then(result => { + callback(result); + }); + }); + return; + + case 'sfeBenchmark': + import('/js/benchmarks.js').then(module => { + module.benchmarkScriptletFiltering().then(result => { + callback(result); + }); }); return;