@paulirish/trace_engine 0.0.32 → 0.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -10
- package/analyze-trace.mjs +9 -10
- package/core/platform/ArrayUtilities.js +1 -0
- package/core/platform/ArrayUtilities.js.map +1 -1
- package/core/platform/DevToolsPath.d.ts +1 -1
- package/core/platform/DevToolsPath.js.map +1 -1
- package/core/platform/MimeType.js +4 -2
- package/core/platform/MimeType.js.map +1 -1
- package/core/platform/NumberUtilities.js +8 -0
- package/core/platform/NumberUtilities.js.map +1 -1
- package/core/platform/ServerTiming.d.ts +31 -0
- package/core/platform/ServerTiming.js +212 -0
- package/core/platform/ServerTiming.js.map +1 -0
- package/core/platform/Timing.d.ts +1 -1
- package/core/platform/Timing.js.map +1 -1
- package/core/platform/TypescriptUtilities.d.ts +3 -0
- package/core/platform/TypescriptUtilities.js.map +1 -1
- package/core/platform/UIString.d.ts +1 -1
- package/core/platform/UIString.js.map +1 -1
- package/core/platform/UserVisibleError.d.ts +1 -1
- package/core/platform/UserVisibleError.js.map +1 -1
- package/core/platform/platform-tsconfig.json +1 -1
- package/core/platform/platform.d.ts +2 -2
- package/core/platform/platform.js +2 -2
- package/core/platform/platform.js.map +1 -1
- package/generated/protocol.d.ts +258 -14
- package/models/trace/LanternComputationData.d.ts +4 -4
- package/models/trace/LanternComputationData.js +22 -23
- package/models/trace/LanternComputationData.js.map +1 -1
- package/models/trace/ModelImpl.d.ts +11 -12
- package/models/trace/ModelImpl.js +22 -33
- package/models/trace/ModelImpl.js.map +1 -1
- package/models/trace/Processor.d.ts +21 -12
- package/models/trace/Processor.js +148 -67
- package/models/trace/Processor.js.map +1 -1
- package/models/trace/TracingManager.js.map +1 -1
- package/models/trace/extras/FetchNodes.d.ts +8 -8
- package/models/trace/extras/FetchNodes.js +16 -11
- package/models/trace/extras/FetchNodes.js.map +1 -1
- package/models/trace/extras/FilmStrip.d.ts +2 -2
- package/models/trace/extras/FilmStrip.js +8 -8
- package/models/trace/extras/FilmStrip.js.map +1 -1
- package/models/trace/extras/MainThreadActivity.d.ts +1 -1
- package/models/trace/extras/MainThreadActivity.js +1 -1
- package/models/trace/extras/MainThreadActivity.js.map +1 -1
- package/models/trace/extras/Metadata.js +2 -2
- package/models/trace/extras/Metadata.js.map +1 -1
- package/models/trace/extras/URLForEntry.d.ts +9 -1
- package/models/trace/extras/URLForEntry.js +18 -10
- package/models/trace/extras/URLForEntry.js.map +1 -1
- package/models/trace/extras/extras.js +1 -1
- package/models/trace/handlers/AnimationHandler.d.ts +2 -2
- package/models/trace/handlers/AnimationHandler.js +1 -1
- package/models/trace/handlers/AnimationHandler.js.map +1 -1
- package/models/trace/handlers/AuctionWorkletsHandler.d.ts +2 -2
- package/models/trace/handlers/AuctionWorkletsHandler.js +11 -11
- package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -1
- package/models/trace/handlers/ExtensionTraceDataHandler.d.ts +6 -6
- package/models/trace/handlers/ExtensionTraceDataHandler.js +12 -8
- package/models/trace/handlers/ExtensionTraceDataHandler.js.map +1 -1
- package/models/trace/handlers/FramesHandler.d.ts +24 -19
- package/models/trace/handlers/FramesHandler.js +46 -25
- package/models/trace/handlers/FramesHandler.js.map +1 -1
- package/models/trace/handlers/GPUHandler.d.ts +4 -4
- package/models/trace/handlers/GPUHandler.js +3 -3
- package/models/trace/handlers/GPUHandler.js.map +1 -1
- package/models/trace/handlers/ImagePaintingHandler.d.ts +3 -3
- package/models/trace/handlers/ImagePaintingHandler.js +6 -8
- package/models/trace/handlers/ImagePaintingHandler.js.map +1 -1
- package/models/trace/handlers/InitiatorsHandler.d.ts +3 -3
- package/models/trace/handlers/InitiatorsHandler.js +14 -14
- package/models/trace/handlers/InitiatorsHandler.js.map +1 -1
- package/models/trace/handlers/InvalidationsHandler.d.ts +4 -2
- package/models/trace/handlers/InvalidationsHandler.js +29 -11
- package/models/trace/handlers/InvalidationsHandler.js.map +1 -1
- package/models/trace/handlers/LargestImagePaintHandler.d.ts +2 -2
- package/models/trace/handlers/LargestImagePaintHandler.js +1 -1
- package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -1
- package/models/trace/handlers/LargestTextPaintHandler.d.ts +2 -2
- package/models/trace/handlers/LargestTextPaintHandler.js +1 -1
- package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -1
- package/models/trace/handlers/LayerTreeHandler.d.ts +6 -6
- package/models/trace/handlers/LayerTreeHandler.js +6 -6
- package/models/trace/handlers/LayerTreeHandler.js.map +1 -1
- package/models/trace/handlers/LayoutShiftsHandler.d.ts +12 -20
- package/models/trace/handlers/LayoutShiftsHandler.js +73 -12
- package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -1
- package/models/trace/handlers/MemoryHandler.d.ts +2 -2
- package/models/trace/handlers/MemoryHandler.js +1 -1
- package/models/trace/handlers/MemoryHandler.js.map +1 -1
- package/models/trace/handlers/MetaHandler.d.ts +15 -14
- package/models/trace/handlers/MetaHandler.js +32 -30
- package/models/trace/handlers/MetaHandler.js.map +1 -1
- package/models/trace/handlers/ModelHandlers.d.ts +1 -1
- package/models/trace/handlers/ModelHandlers.js +1 -1
- package/models/trace/handlers/ModelHandlers.js.map +1 -1
- package/models/trace/handlers/NetworkRequestsHandler.d.ts +13 -12
- package/models/trace/handlers/NetworkRequestsHandler.js +68 -66
- package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
- package/models/trace/handlers/PageFramesHandler.d.ts +2 -2
- package/models/trace/handlers/PageFramesHandler.js +2 -2
- package/models/trace/handlers/PageFramesHandler.js.map +1 -1
- package/models/trace/handlers/PageLoadMetricsHandler.d.ts +7 -7
- package/models/trace/handlers/PageLoadMetricsHandler.js +21 -24
- package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -1
- package/models/trace/handlers/RendererHandler.d.ts +19 -19
- package/models/trace/handlers/RendererHandler.js +5 -5
- package/models/trace/handlers/RendererHandler.js.map +1 -1
- package/models/trace/handlers/SamplesHandler.d.ts +6 -6
- package/models/trace/handlers/SamplesHandler.js +3 -3
- package/models/trace/handlers/SamplesHandler.js.map +1 -1
- package/models/trace/handlers/ScreenshotsHandler.d.ts +6 -4
- package/models/trace/handlers/ScreenshotsHandler.js +11 -9
- package/models/trace/handlers/ScreenshotsHandler.js.map +1 -1
- package/models/trace/handlers/SelectorStatsHandler.d.ts +3 -3
- package/models/trace/handlers/SelectorStatsHandler.js +2 -2
- package/models/trace/handlers/SelectorStatsHandler.js.map +1 -1
- package/models/trace/handlers/ServerTimingsHandler.d.ts +10 -0
- package/models/trace/handlers/ServerTimingsHandler.js +118 -0
- package/models/trace/handlers/ServerTimingsHandler.js.map +1 -0
- package/models/trace/handlers/Threads.d.ts +7 -7
- package/models/trace/handlers/Threads.js +5 -5
- package/models/trace/handlers/Threads.js.map +1 -1
- package/models/trace/handlers/UserInteractionsHandler.d.ts +13 -11
- package/models/trace/handlers/UserInteractionsHandler.js +13 -7
- package/models/trace/handlers/UserInteractionsHandler.js.map +1 -1
- package/models/trace/handlers/UserTimingsHandler.d.ts +5 -5
- package/models/trace/handlers/UserTimingsHandler.js +52 -9
- package/models/trace/handlers/UserTimingsHandler.js.map +1 -1
- package/models/trace/handlers/WarningsHandler.d.ts +5 -5
- package/models/trace/handlers/WarningsHandler.js +4 -5
- package/models/trace/handlers/WarningsHandler.js.map +1 -1
- package/models/trace/handlers/WorkersHandler.d.ts +4 -4
- package/models/trace/handlers/WorkersHandler.js +1 -1
- package/models/trace/handlers/WorkersHandler.js.map +1 -1
- package/models/trace/handlers/handlers-tsconfig.json +1 -1
- package/models/trace/handlers/types.d.ts +7 -7
- package/models/trace/handlers/types.js.map +1 -1
- package/models/trace/helpers/Extensions.d.ts +2 -2
- package/models/trace/helpers/Extensions.js.map +1 -1
- package/models/trace/helpers/Network.d.ts +2 -2
- package/models/trace/helpers/Network.js +19 -2
- package/models/trace/helpers/Network.js.map +1 -1
- package/models/trace/helpers/SamplesIntegrator.d.ts +5 -5
- package/models/trace/helpers/SamplesIntegrator.js +10 -11
- package/models/trace/helpers/SamplesIntegrator.js.map +1 -1
- package/models/trace/helpers/SyntheticEvents.d.ts +8 -14
- package/models/trace/helpers/SyntheticEvents.js +20 -31
- package/models/trace/helpers/SyntheticEvents.js.map +1 -1
- package/models/trace/helpers/Timing.d.ts +16 -4
- package/models/trace/helpers/Timing.js +33 -1
- package/models/trace/helpers/Timing.js.map +1 -1
- package/models/trace/helpers/Trace.d.ts +46 -32
- package/models/trace/helpers/Trace.js +53 -24
- package/models/trace/helpers/Trace.js.map +1 -1
- package/models/trace/helpers/TreeHelpers.d.ts +29 -8
- package/models/trace/helpers/TreeHelpers.js +87 -19
- package/models/trace/helpers/TreeHelpers.js.map +1 -1
- package/models/trace/insights/Common.d.ts +4 -3
- package/models/trace/insights/Common.js +22 -7
- package/models/trace/insights/Common.js.map +1 -1
- package/models/trace/insights/CumulativeLayoutShift.d.ts +34 -13
- package/models/trace/insights/CumulativeLayoutShift.js +151 -59
- package/models/trace/insights/CumulativeLayoutShift.js.map +1 -1
- package/models/trace/insights/DocumentLatency.d.ts +9 -4
- package/models/trace/insights/DocumentLatency.js +82 -7
- package/models/trace/insights/DocumentLatency.js.map +1 -1
- package/models/trace/insights/FontDisplay.d.ts +11 -0
- package/models/trace/insights/FontDisplay.js +44 -0
- package/models/trace/insights/FontDisplay.js.map +1 -0
- package/models/trace/insights/InsightRunners.d.ts +3 -0
- package/models/trace/insights/InsightRunners.js +3 -0
- package/models/trace/insights/InsightRunners.js.map +1 -1
- package/models/trace/insights/InteractionToNextPaint.d.ts +4 -5
- package/models/trace/insights/InteractionToNextPaint.js +5 -3
- package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
- package/models/trace/insights/LargestContentfulPaint.d.ts +20 -7
- package/models/trace/insights/LargestContentfulPaint.js +57 -37
- package/models/trace/insights/LargestContentfulPaint.js.map +1 -1
- package/models/trace/insights/RenderBlocking.d.ts +3 -3
- package/models/trace/insights/RenderBlocking.js +29 -24
- package/models/trace/insights/RenderBlocking.js.map +1 -1
- package/models/trace/insights/SlowCSSSelector.d.ts +11 -0
- package/models/trace/insights/SlowCSSSelector.js +67 -0
- package/models/trace/insights/SlowCSSSelector.js.map +1 -0
- package/models/trace/insights/ThirdPartyWeb.d.ts +18 -0
- package/models/trace/insights/ThirdPartyWeb.js +174 -0
- package/models/trace/insights/ThirdPartyWeb.js.map +1 -0
- package/models/trace/insights/Viewport.d.ts +5 -2
- package/models/trace/insights/Viewport.js +14 -9
- package/models/trace/insights/Viewport.js.map +1 -1
- package/models/trace/insights/insights-tsconfig.json +9 -0
- package/models/trace/insights/insights.d.ts +1 -0
- package/models/trace/insights/insights.js +1 -0
- package/models/trace/insights/insights.js.map +1 -1
- package/models/trace/insights/types.d.ts +43 -25
- package/models/trace/insights/types.js.map +1 -1
- package/models/trace/lantern/core/NetworkAnalyzer.d.ts +6 -6
- package/models/trace/lantern/core/NetworkAnalyzer.js +12 -12
- package/models/trace/lantern/core/NetworkAnalyzer.js.map +1 -1
- package/models/trace/lantern/graph/BaseNode.d.ts +4 -4
- package/models/trace/lantern/graph/BaseNode.js +21 -21
- package/models/trace/lantern/graph/BaseNode.js.map +1 -1
- package/models/trace/lantern/graph/CPUNode.d.ts +1 -1
- package/models/trace/lantern/graph/CPUNode.js +5 -5
- package/models/trace/lantern/graph/CPUNode.js.map +1 -1
- package/models/trace/lantern/graph/PageDependencyGraph.d.ts +4 -4
- package/models/trace/lantern/graph/PageDependencyGraph.js +5 -5
- package/models/trace/lantern/graph/PageDependencyGraph.js.map +1 -1
- package/models/trace/lantern/simulation/ConnectionPool.d.ts +7 -7
- package/models/trace/lantern/simulation/ConnectionPool.js +26 -26
- package/models/trace/lantern/simulation/ConnectionPool.js.map +1 -1
- package/models/trace/lantern/simulation/DNSCache.d.ts +3 -3
- package/models/trace/lantern/simulation/DNSCache.js +11 -11
- package/models/trace/lantern/simulation/DNSCache.js.map +1 -1
- package/models/trace/lantern/simulation/SimulationTimingMap.d.ts +1 -1
- package/models/trace/lantern/simulation/SimulationTimingMap.js +15 -15
- package/models/trace/lantern/simulation/SimulationTimingMap.js.map +1 -1
- package/models/trace/lantern/simulation/Simulator.d.ts +28 -28
- package/models/trace/lantern/simulation/Simulator.js +113 -113
- package/models/trace/lantern/simulation/Simulator.js.map +1 -1
- package/models/trace/lantern/simulation/TCPConnection.d.ts +9 -9
- package/models/trace/lantern/simulation/TCPConnection.js +36 -36
- package/models/trace/lantern/simulation/TCPConnection.js.map +1 -1
- package/models/trace/root-causes/LayoutShift.d.ts +13 -13
- package/models/trace/root-causes/LayoutShift.js +7 -25
- package/models/trace/root-causes/LayoutShift.js.map +1 -1
- package/models/trace/types/Configuration.d.ts +16 -0
- package/models/trace/types/Configuration.js +1 -0
- package/models/trace/types/Configuration.js.map +1 -1
- package/models/trace/types/Extensions.d.ts +9 -12
- package/models/trace/types/Extensions.js +2 -1
- package/models/trace/types/Extensions.js.map +1 -1
- package/models/trace/types/File.d.ts +55 -23
- package/models/trace/types/File.js +15 -3
- package/models/trace/types/File.js.map +1 -1
- package/models/trace/types/TraceEvents.d.ts +818 -713
- package/models/trace/types/TraceEvents.js +270 -277
- package/models/trace/types/TraceEvents.js.map +1 -1
- package/models/trace/types/types.d.ts +1 -1
- package/models/trace/types/types.js +1 -1
- package/models/trace/types/types.js.map +1 -1
- package/package.json +4 -2
- package/test/test-trace-engine.mjs +47 -2
- package/third_party/third-party-web/third-party-web.js +1 -0
- package/core/platform/PromiseUtilities.d.ts +0 -10
- package/core/platform/PromiseUtilities.js +0 -18
- package/core/platform/PromiseUtilities.js.map +0 -1
- package/core/platform/SetUtilities.d.ts +0 -2
- package/core/platform/SetUtilities.js +0 -23
- package/core/platform/SetUtilities.js.map +0 -1
- package/models/trace/EntriesFilter.d.ts +0 -72
- package/models/trace/EntriesFilter.js +0 -296
- package/models/trace/EntriesFilter.js.map +0 -1
- package/models/trace/LegacyTracingModel.js.map +0 -1
- package/models/trace/handlers/EnhancedTracesHandler.d.ts +0 -48
- package/models/trace/handlers/EnhancedTracesHandler.js +0 -165
- package/models/trace/handlers/EnhancedTracesHandler.js.map +0 -1
- package/models/trace/lantern/BaseNode.d.ts +0 -91
- package/models/trace/lantern/BaseNode.js +0 -268
- package/models/trace/lantern/BaseNode.js.map +0 -1
- package/models/trace/lantern/CPUNode.d.ts +0 -24
- package/models/trace/lantern/CPUNode.js +0 -64
- package/models/trace/lantern/CPUNode.js.map +0 -1
- package/models/trace/lantern/LanternError.d.ts +0 -3
- package/models/trace/lantern/LanternError.js +0 -7
- package/models/trace/lantern/LanternError.js.map +0 -1
- package/models/trace/lantern/MetricsModule.d.ts +0 -11
- package/models/trace/lantern/MetricsModule.js +0 -14
- package/models/trace/lantern/MetricsModule.js.map +0 -1
- package/models/trace/lantern/NetworkNode.d.ts +0 -22
- package/models/trace/lantern/NetworkNode.js +0 -83
- package/models/trace/lantern/NetworkNode.js.map +0 -1
- package/models/trace/lantern/PageDependencyGraph.d.ts +0 -43
- package/models/trace/lantern/PageDependencyGraph.js +0 -509
- package/models/trace/lantern/PageDependencyGraph.js.map +0 -1
- package/models/trace/lantern/SimulationModule.d.ts +0 -17
- package/models/trace/lantern/SimulationModule.js +0 -13
- package/models/trace/lantern/SimulationModule.js.map +0 -1
- package/models/trace/lantern/simulation/NetworkAnalyzer.d.ts +0 -112
- package/models/trace/lantern/simulation/NetworkAnalyzer.js +0 -486
- package/models/trace/lantern/simulation/NetworkAnalyzer.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimulationTimingMap.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/SimulationTimingMap.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/**\n * @fileoverview\n *\n * This class encapsulates the type-related validation logic for moving timing information for nodes\n * through the different simulation phases. Methods here ensure that the invariants of simulation hold\n * as nodes are queued, partially simulated, and completed.\n */\n\nimport * as Core from '../core/core.js';\nimport * as Graph from '../graph/graph.js';\n\ninterface NodeTimingComplete {\n startTime: number;\n endTime: number;\n queuedTime: number;\n estimatedTimeElapsed: number;\n timeElapsed: number;\n timeElapsedOvershoot: number;\n bytesDownloaded: number;\n}\n\ntype NodeTimingQueued = Pick<NodeTimingComplete, 'queuedTime'>;\n\ntype CpuNodeTimingStarted = NodeTimingQueued&Pick<NodeTimingComplete, 'startTime'|'timeElapsed'>;\ntype NetworkNodeTimingStarted = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'timeElapsedOvershoot'|'bytesDownloaded'>;\n\ntype CpuNodeTimingInProgress = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\ntype NetworkNodeTimingInProgress = NetworkNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\n\nexport type CpuNodeTimingComplete = CpuNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>;\nexport type NetworkNodeTimingComplete =\n NetworkNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>&{connectionTiming: ConnectionTiming};\nexport type CompleteNodeTiming = CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\ntype NodeTimingData = NodeTimingQueued|CpuNodeTimingStarted|NetworkNodeTimingStarted|CpuNodeTimingInProgress|\n NetworkNodeTimingInProgress|CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\nexport interface ConnectionTiming {\n dnsResolutionTime?: number;\n connectionTime?: number;\n sslTime?: number;\n timeToFirstByte: number;\n}\n\nclass SimulatorTimingMap {\n _nodeTimings: Map<Graph.Node, NodeTimingData>;\n\n constructor() {\n this._nodeTimings = new Map<Graph.Node, NodeTimingData>();\n }\n\n getNodes(): Graph.Node[] {\n return Array.from(this._nodeTimings.keys());\n }\n\n setReadyToStart(node: Graph.Node, values: {queuedTime: number}): void {\n this._nodeTimings.set(node, values);\n }\n\n setInProgress(node: Graph.Node, values: {startTime: number}): void {\n const nodeTiming = {\n ...this.getQueued(node),\n startTime: values.startTime,\n timeElapsed: 0,\n };\n\n this._nodeTimings.set(\n node,\n node.type === Graph.BaseNode.types.NETWORK ? {...nodeTiming, timeElapsedOvershoot: 0, bytesDownloaded: 0} :\n nodeTiming,\n );\n }\n\n setCompleted(node: Graph.Node, values: {endTime: number, connectionTiming?: ConnectionTiming}): void {\n const nodeTiming = {\n ...this.getInProgress(node),\n endTime: values.endTime,\n connectionTiming: values.connectionTiming,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setCpu(node: Graph.CPUNode, values: {timeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n timeElapsed: values.timeElapsed,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setCpuEstimated(node: Graph.CPUNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setNetwork(\n node: Graph.NetworkNode,\n values: {timeElapsed: number, timeElapsedOvershoot: number, bytesDownloaded: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n timeElapsed: values.timeElapsed,\n timeElapsedOvershoot: values.timeElapsedOvershoot,\n bytesDownloaded: values.bytesDownloaded,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n setNetworkEstimated(node: Graph.NetworkNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this._nodeTimings.set(node, nodeTiming);\n }\n\n getQueued(node: Graph.Node): NodeTimingData {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n return timing;\n }\n\n getCpuStarted(node: Graph.CPUNode): CpuNodeTimingStarted {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if ('bytesDownloaded' in timing) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getNetworkStarted(node: Graph.NetworkNode): NetworkNodeTimingStarted {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('bytesDownloaded' in timing)) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getInProgress(node: Graph.Node): CpuNodeTimingInProgress|NetworkNodeTimingInProgress {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n return timing;\n }\n\n getCompleted(node: Graph.Node): CpuNodeTimingComplete|NetworkNodeTimingComplete {\n const timing = this._nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n if (!('endTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet completed`);\n }\n return timing;\n }\n}\n\nexport {SimulatorTimingMap};\n"]}
|
|
1
|
+
{"version":3,"file":"SimulationTimingMap.js","sourceRoot":"","sources":["../../../../../../../../front_end/models/trace/lantern/simulation/SimulationTimingMap.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/**\n * @fileoverview\n *\n * This class encapsulates the type-related validation logic for moving timing information for nodes\n * through the different simulation phases. Methods here ensure that the invariants of simulation hold\n * as nodes are queued, partially simulated, and completed.\n */\n\nimport * as Core from '../core/core.js';\nimport * as Graph from '../graph/graph.js';\n\ninterface NodeTimingComplete {\n startTime: number;\n endTime: number;\n queuedTime: number;\n estimatedTimeElapsed: number;\n timeElapsed: number;\n timeElapsedOvershoot: number;\n bytesDownloaded: number;\n}\n\ntype NodeTimingQueued = Pick<NodeTimingComplete, 'queuedTime'>;\n\ntype CpuNodeTimingStarted = NodeTimingQueued&Pick<NodeTimingComplete, 'startTime'|'timeElapsed'>;\ntype NetworkNodeTimingStarted = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'timeElapsedOvershoot'|'bytesDownloaded'>;\n\ntype CpuNodeTimingInProgress = CpuNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\ntype NetworkNodeTimingInProgress = NetworkNodeTimingStarted&Pick<NodeTimingComplete, 'estimatedTimeElapsed'>;\n\nexport type CpuNodeTimingComplete = CpuNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>;\nexport type NetworkNodeTimingComplete =\n NetworkNodeTimingInProgress&Pick<NodeTimingComplete, 'endTime'>&{connectionTiming: ConnectionTiming};\nexport type CompleteNodeTiming = CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\ntype NodeTimingData = NodeTimingQueued|CpuNodeTimingStarted|NetworkNodeTimingStarted|CpuNodeTimingInProgress|\n NetworkNodeTimingInProgress|CpuNodeTimingComplete|NetworkNodeTimingComplete;\n\nexport interface ConnectionTiming {\n dnsResolutionTime?: number;\n connectionTime?: number;\n sslTime?: number;\n timeToFirstByte: number;\n}\n\nclass SimulatorTimingMap {\n nodeTimings: Map<Graph.Node, NodeTimingData>;\n\n constructor() {\n this.nodeTimings = new Map<Graph.Node, NodeTimingData>();\n }\n\n getNodes(): Graph.Node[] {\n return Array.from(this.nodeTimings.keys());\n }\n\n setReadyToStart(node: Graph.Node, values: {queuedTime: number}): void {\n this.nodeTimings.set(node, values);\n }\n\n setInProgress(node: Graph.Node, values: {startTime: number}): void {\n const nodeTiming = {\n ...this.getQueued(node),\n startTime: values.startTime,\n timeElapsed: 0,\n };\n\n this.nodeTimings.set(\n node,\n node.type === Graph.BaseNode.types.NETWORK ? {...nodeTiming, timeElapsedOvershoot: 0, bytesDownloaded: 0} :\n nodeTiming,\n );\n }\n\n setCompleted(node: Graph.Node, values: {endTime: number, connectionTiming?: ConnectionTiming}): void {\n const nodeTiming = {\n ...this.getInProgress(node),\n endTime: values.endTime,\n connectionTiming: values.connectionTiming,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setCpu(node: Graph.CPUNode, values: {timeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n timeElapsed: values.timeElapsed,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setCpuEstimated(node: Graph.CPUNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getCpuStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setNetwork(\n node: Graph.NetworkNode,\n values: {timeElapsed: number, timeElapsedOvershoot: number, bytesDownloaded: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n timeElapsed: values.timeElapsed,\n timeElapsedOvershoot: values.timeElapsedOvershoot,\n bytesDownloaded: values.bytesDownloaded,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n setNetworkEstimated(node: Graph.NetworkNode, values: {estimatedTimeElapsed: number}): void {\n const nodeTiming = {\n ...this.getNetworkStarted(node),\n estimatedTimeElapsed: values.estimatedTimeElapsed,\n };\n\n this.nodeTimings.set(node, nodeTiming);\n }\n\n getQueued(node: Graph.Node): NodeTimingData {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n return timing;\n }\n\n getCpuStarted(node: Graph.CPUNode): CpuNodeTimingStarted {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if ('bytesDownloaded' in timing) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getNetworkStarted(node: Graph.NetworkNode): NetworkNodeTimingStarted {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('bytesDownloaded' in timing)) {\n throw new Core.LanternError(`Node ${node.id} timing not valid`);\n }\n return timing;\n }\n\n getInProgress(node: Graph.Node): CpuNodeTimingInProgress|NetworkNodeTimingInProgress {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n return timing;\n }\n\n getCompleted(node: Graph.Node): CpuNodeTimingComplete|NetworkNodeTimingComplete {\n const timing = this.nodeTimings.get(node);\n if (!timing) {\n throw new Core.LanternError(`Node ${node.id} not yet queued`);\n }\n if (!('startTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet started`);\n }\n if (!('estimatedTimeElapsed' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet in progress`);\n }\n if (!('endTime' in timing)) {\n throw new Core.LanternError(`Node ${node.id} not yet completed`);\n }\n return timing;\n }\n}\n\nexport {SimulatorTimingMap};\n"]}
|
|
@@ -10,52 +10,52 @@ export interface Result<T = Lantern.AnyNetworkObject> {
|
|
|
10
10
|
}
|
|
11
11
|
declare class Simulator<T = Lantern.AnyNetworkObject> {
|
|
12
12
|
static createSimulator(settings: Lantern.Simulation.Settings): Simulator;
|
|
13
|
-
|
|
13
|
+
options: Required<Lantern.Simulation.Options>;
|
|
14
14
|
_rtt: number;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
throughput: number;
|
|
16
|
+
maximumConcurrentRequests: number;
|
|
17
|
+
cpuSlowdownMultiplier: number;
|
|
18
|
+
layoutTaskMultiplier: number;
|
|
19
|
+
cachedNodeListByStartPosition: Graph.Node[];
|
|
20
|
+
nodeTimings: SimulatorTimingMap;
|
|
21
|
+
numberInProgressByType: Map<string, number>;
|
|
22
|
+
nodes: Record<number, Set<Graph.Node>>;
|
|
23
|
+
dns: DNSCache;
|
|
24
|
+
connectionPool: ConnectionPool;
|
|
25
25
|
constructor(options?: Lantern.Simulation.Options);
|
|
26
26
|
get rtt(): number;
|
|
27
|
-
|
|
27
|
+
initializeConnectionPool(graph: Graph.Node): void;
|
|
28
28
|
/**
|
|
29
29
|
* Initializes the various state data structures such _nodeTimings and the _node Sets by state.
|
|
30
30
|
*/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
initializeAuxiliaryData(): void;
|
|
32
|
+
numberInProgress(type: string): number;
|
|
33
|
+
markNodeAsReadyToStart(node: Graph.Node, queuedTime: number): void;
|
|
34
|
+
markNodeAsInProgress(node: Graph.Node, startTime: number): void;
|
|
35
|
+
markNodeAsComplete(node: Graph.Node, endTime: number, connectionTiming?: ConnectionTiming): void;
|
|
36
|
+
acquireConnection(request: Lantern.NetworkRequest): TCPConnection | null;
|
|
37
|
+
getNodesSortedByStartPosition(): Graph.Node[];
|
|
38
|
+
startNodeIfPossible(node: Graph.Node, totalElapsedTime: number): void;
|
|
39
39
|
/**
|
|
40
40
|
* Updates each connection in use with the available throughput based on the number of network requests
|
|
41
41
|
* currently in flight.
|
|
42
42
|
*/
|
|
43
|
-
|
|
43
|
+
updateNetworkCapacity(): void;
|
|
44
44
|
/**
|
|
45
45
|
* Estimates the number of milliseconds remaining given current condidtions before the node is complete.
|
|
46
46
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
estimateTimeRemaining(node: Graph.Node): number;
|
|
48
|
+
estimateCPUTimeRemaining(cpuNode: Graph.CPUNode): number;
|
|
49
|
+
estimateNetworkTimeRemaining(networkNode: Graph.NetworkNode): number;
|
|
50
50
|
/**
|
|
51
51
|
* Computes and returns the minimum estimated completion time of the nodes currently in progress.
|
|
52
52
|
*/
|
|
53
|
-
|
|
53
|
+
findNextNodeCompletionTime(): number;
|
|
54
54
|
/**
|
|
55
55
|
* Given a time period, computes the progress toward completion that the node made durin that time.
|
|
56
56
|
*/
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
updateProgressMadeInTimePeriod(node: Graph.Node, timePeriodLength: number, totalElapsedTime: number): void;
|
|
58
|
+
computeFinalNodeTimings(): {
|
|
59
59
|
nodeTimings: Map<Graph.Node, Lantern.Simulation.NodeTiming>;
|
|
60
60
|
completeNodeTimings: Map<Graph.Node, CompleteNodeTiming>;
|
|
61
61
|
};
|
|
@@ -79,6 +79,6 @@ declare class Simulator<T = Lantern.AnyNetworkObject> {
|
|
|
79
79
|
* When simulating, just because a low priority image started 5ms before a high priority image doesn't mean
|
|
80
80
|
* it would have happened like that when the network was slower.
|
|
81
81
|
*/
|
|
82
|
-
static
|
|
82
|
+
static computeNodeStartPosition(node: Graph.Node): number;
|
|
83
83
|
}
|
|
84
84
|
export { Simulator };
|
|
@@ -72,20 +72,20 @@ class Simulator {
|
|
|
72
72
|
}
|
|
73
73
|
return new Simulator(options);
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
options;
|
|
76
76
|
_rtt;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
77
|
+
throughput;
|
|
78
|
+
maximumConcurrentRequests;
|
|
79
|
+
cpuSlowdownMultiplier;
|
|
80
|
+
layoutTaskMultiplier;
|
|
81
|
+
cachedNodeListByStartPosition;
|
|
82
|
+
nodeTimings;
|
|
83
|
+
numberInProgressByType;
|
|
84
|
+
nodes;
|
|
85
|
+
dns;
|
|
86
|
+
connectionPool;
|
|
87
87
|
constructor(options) {
|
|
88
|
-
this.
|
|
88
|
+
this.options = Object.assign({
|
|
89
89
|
rtt: defaultThrottling.rttMs,
|
|
90
90
|
throughput: defaultThrottling.throughputKbps * 1024,
|
|
91
91
|
maximumConcurrentRequests: DEFAULT_MAXIMUM_CONCURRENT_REQUESTS,
|
|
@@ -94,101 +94,101 @@ class Simulator {
|
|
|
94
94
|
additionalRttByOrigin: new Map(),
|
|
95
95
|
serverResponseTimeByOrigin: new Map(),
|
|
96
96
|
}, options);
|
|
97
|
-
this._rtt = this.
|
|
98
|
-
this.
|
|
99
|
-
this.
|
|
100
|
-
this.
|
|
101
|
-
this.
|
|
102
|
-
this.
|
|
97
|
+
this._rtt = this.options.rtt;
|
|
98
|
+
this.throughput = this.options.throughput;
|
|
99
|
+
this.maximumConcurrentRequests = Math.max(Math.min(TCPConnection.maximumSaturatedConnections(this._rtt, this.throughput), this.options.maximumConcurrentRequests), 1);
|
|
100
|
+
this.cpuSlowdownMultiplier = this.options.cpuSlowdownMultiplier;
|
|
101
|
+
this.layoutTaskMultiplier = this.cpuSlowdownMultiplier * this.options.layoutTaskMultiplier;
|
|
102
|
+
this.cachedNodeListByStartPosition = [];
|
|
103
103
|
// Properties reset on every `.simulate` call but duplicated here for type checking
|
|
104
|
-
this.
|
|
105
|
-
this.
|
|
106
|
-
this.
|
|
107
|
-
this.
|
|
104
|
+
this.nodeTimings = new SimulatorTimingMap();
|
|
105
|
+
this.numberInProgressByType = new Map();
|
|
106
|
+
this.nodes = {};
|
|
107
|
+
this.dns = new DNSCache({ rtt: this._rtt });
|
|
108
108
|
// @ts-expect-error
|
|
109
|
-
this.
|
|
109
|
+
this.connectionPool = null;
|
|
110
110
|
if (!Number.isFinite(this._rtt)) {
|
|
111
111
|
throw new Core.LanternError(`Invalid rtt ${this._rtt}`);
|
|
112
112
|
}
|
|
113
|
-
if (!Number.isFinite(this.
|
|
114
|
-
throw new Core.LanternError(`Invalid rtt ${this.
|
|
113
|
+
if (!Number.isFinite(this.throughput)) {
|
|
114
|
+
throw new Core.LanternError(`Invalid rtt ${this.throughput}`);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
get rtt() {
|
|
118
118
|
return this._rtt;
|
|
119
119
|
}
|
|
120
|
-
|
|
120
|
+
initializeConnectionPool(graph) {
|
|
121
121
|
const records = [];
|
|
122
122
|
graph.getRootNode().traverse(node => {
|
|
123
123
|
if (node.type === Graph.BaseNode.types.NETWORK) {
|
|
124
124
|
records.push(node.request);
|
|
125
125
|
}
|
|
126
126
|
});
|
|
127
|
-
this.
|
|
127
|
+
this.connectionPool = new ConnectionPool(records, this.options);
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
130
|
* Initializes the various state data structures such _nodeTimings and the _node Sets by state.
|
|
131
131
|
*/
|
|
132
|
-
|
|
133
|
-
this.
|
|
134
|
-
this.
|
|
135
|
-
this.
|
|
136
|
-
this.
|
|
132
|
+
initializeAuxiliaryData() {
|
|
133
|
+
this.nodeTimings = new SimulatorTimingMap();
|
|
134
|
+
this.numberInProgressByType = new Map();
|
|
135
|
+
this.nodes = {};
|
|
136
|
+
this.cachedNodeListByStartPosition = [];
|
|
137
137
|
// NOTE: We don't actually need *all* of these sets, but the clarity that each node progresses
|
|
138
138
|
// through the system is quite nice.
|
|
139
139
|
for (const state of Object.values(NodeState)) {
|
|
140
|
-
this.
|
|
140
|
+
this.nodes[state] = new Set();
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
-
|
|
144
|
-
return this.
|
|
143
|
+
numberInProgress(type) {
|
|
144
|
+
return this.numberInProgressByType.get(type) || 0;
|
|
145
145
|
}
|
|
146
|
-
|
|
147
|
-
const nodeStartPosition = Simulator.
|
|
148
|
-
const firstNodeIndexWithGreaterStartPosition = this.
|
|
149
|
-
const insertionIndex = firstNodeIndexWithGreaterStartPosition === -1 ? this.
|
|
146
|
+
markNodeAsReadyToStart(node, queuedTime) {
|
|
147
|
+
const nodeStartPosition = Simulator.computeNodeStartPosition(node);
|
|
148
|
+
const firstNodeIndexWithGreaterStartPosition = this.cachedNodeListByStartPosition.findIndex(candidate => Simulator.computeNodeStartPosition(candidate) > nodeStartPosition);
|
|
149
|
+
const insertionIndex = firstNodeIndexWithGreaterStartPosition === -1 ? this.cachedNodeListByStartPosition.length :
|
|
150
150
|
firstNodeIndexWithGreaterStartPosition;
|
|
151
|
-
this.
|
|
152
|
-
this.
|
|
153
|
-
this.
|
|
154
|
-
this.
|
|
151
|
+
this.cachedNodeListByStartPosition.splice(insertionIndex, 0, node);
|
|
152
|
+
this.nodes[NodeState.ReadyToStart].add(node);
|
|
153
|
+
this.nodes[NodeState.NotReadyToStart].delete(node);
|
|
154
|
+
this.nodeTimings.setReadyToStart(node, { queuedTime });
|
|
155
155
|
}
|
|
156
|
-
|
|
157
|
-
const indexOfNodeToStart = this.
|
|
158
|
-
this.
|
|
159
|
-
this.
|
|
160
|
-
this.
|
|
161
|
-
this.
|
|
162
|
-
this.
|
|
156
|
+
markNodeAsInProgress(node, startTime) {
|
|
157
|
+
const indexOfNodeToStart = this.cachedNodeListByStartPosition.indexOf(node);
|
|
158
|
+
this.cachedNodeListByStartPosition.splice(indexOfNodeToStart, 1);
|
|
159
|
+
this.nodes[NodeState.InProgress].add(node);
|
|
160
|
+
this.nodes[NodeState.ReadyToStart].delete(node);
|
|
161
|
+
this.numberInProgressByType.set(node.type, this.numberInProgress(node.type) + 1);
|
|
162
|
+
this.nodeTimings.setInProgress(node, { startTime });
|
|
163
163
|
}
|
|
164
|
-
|
|
165
|
-
this.
|
|
166
|
-
this.
|
|
167
|
-
this.
|
|
168
|
-
this.
|
|
164
|
+
markNodeAsComplete(node, endTime, connectionTiming) {
|
|
165
|
+
this.nodes[NodeState.Complete].add(node);
|
|
166
|
+
this.nodes[NodeState.InProgress].delete(node);
|
|
167
|
+
this.numberInProgressByType.set(node.type, this.numberInProgress(node.type) - 1);
|
|
168
|
+
this.nodeTimings.setCompleted(node, { endTime, connectionTiming });
|
|
169
169
|
// Try to add all its dependents to the queue
|
|
170
170
|
for (const dependent of node.getDependents()) {
|
|
171
171
|
// Skip dependent node if one of its dependencies hasn't finished yet
|
|
172
172
|
const dependencies = dependent.getDependencies();
|
|
173
|
-
if (dependencies.some(dep => !this.
|
|
173
|
+
if (dependencies.some(dep => !this.nodes[NodeState.Complete].has(dep))) {
|
|
174
174
|
continue;
|
|
175
175
|
}
|
|
176
176
|
// Otherwise add it to the queue
|
|
177
|
-
this.
|
|
177
|
+
this.markNodeAsReadyToStart(dependent, endTime);
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
|
-
|
|
181
|
-
return this.
|
|
180
|
+
acquireConnection(request) {
|
|
181
|
+
return this.connectionPool.acquire(request);
|
|
182
182
|
}
|
|
183
|
-
|
|
183
|
+
getNodesSortedByStartPosition() {
|
|
184
184
|
// Make a copy so we don't skip nodes due to concurrent modification
|
|
185
|
-
return Array.from(this.
|
|
185
|
+
return Array.from(this.cachedNodeListByStartPosition);
|
|
186
186
|
}
|
|
187
|
-
|
|
187
|
+
startNodeIfPossible(node, totalElapsedTime) {
|
|
188
188
|
if (node.type === Graph.BaseNode.types.CPU) {
|
|
189
189
|
// Start a CPU task if there's no other CPU task in process
|
|
190
|
-
if (this.
|
|
191
|
-
this.
|
|
190
|
+
if (this.numberInProgress(node.type) === 0) {
|
|
191
|
+
this.markNodeAsInProgress(node, totalElapsedTime);
|
|
192
192
|
}
|
|
193
193
|
return;
|
|
194
194
|
}
|
|
@@ -198,53 +198,53 @@ class Simulator {
|
|
|
198
198
|
// If a network request is connectionless, we can always start it, so skip the connection checks
|
|
199
199
|
if (!node.isConnectionless) {
|
|
200
200
|
// Start a network request if we're not at max requests and a connection is available
|
|
201
|
-
const numberOfActiveRequests = this.
|
|
202
|
-
if (numberOfActiveRequests >= this.
|
|
201
|
+
const numberOfActiveRequests = this.numberInProgress(node.type);
|
|
202
|
+
if (numberOfActiveRequests >= this.maximumConcurrentRequests) {
|
|
203
203
|
return;
|
|
204
204
|
}
|
|
205
|
-
const connection = this.
|
|
205
|
+
const connection = this.acquireConnection(node.request);
|
|
206
206
|
if (!connection) {
|
|
207
207
|
return;
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
|
-
this.
|
|
210
|
+
this.markNodeAsInProgress(node, totalElapsedTime);
|
|
211
211
|
}
|
|
212
212
|
/**
|
|
213
213
|
* Updates each connection in use with the available throughput based on the number of network requests
|
|
214
214
|
* currently in flight.
|
|
215
215
|
*/
|
|
216
|
-
|
|
217
|
-
const inFlight = this.
|
|
216
|
+
updateNetworkCapacity() {
|
|
217
|
+
const inFlight = this.numberInProgress(Graph.BaseNode.types.NETWORK);
|
|
218
218
|
if (inFlight === 0) {
|
|
219
219
|
return;
|
|
220
220
|
}
|
|
221
|
-
for (const connection of this.
|
|
222
|
-
connection.setThroughput(this.
|
|
221
|
+
for (const connection of this.connectionPool.connectionsInUse()) {
|
|
222
|
+
connection.setThroughput(this.throughput / inFlight);
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
/**
|
|
226
226
|
* Estimates the number of milliseconds remaining given current condidtions before the node is complete.
|
|
227
227
|
*/
|
|
228
|
-
|
|
228
|
+
estimateTimeRemaining(node) {
|
|
229
229
|
if (node.type === Graph.BaseNode.types.CPU) {
|
|
230
|
-
return this.
|
|
230
|
+
return this.estimateCPUTimeRemaining(node);
|
|
231
231
|
}
|
|
232
232
|
if (node.type === Graph.BaseNode.types.NETWORK) {
|
|
233
|
-
return this.
|
|
233
|
+
return this.estimateNetworkTimeRemaining(node);
|
|
234
234
|
}
|
|
235
235
|
throw new Core.LanternError('Unsupported');
|
|
236
236
|
}
|
|
237
|
-
|
|
238
|
-
const timingData = this.
|
|
239
|
-
const multiplier = cpuNode.didPerformLayout() ? this.
|
|
237
|
+
estimateCPUTimeRemaining(cpuNode) {
|
|
238
|
+
const timingData = this.nodeTimings.getCpuStarted(cpuNode);
|
|
239
|
+
const multiplier = cpuNode.didPerformLayout() ? this.layoutTaskMultiplier : this.cpuSlowdownMultiplier;
|
|
240
240
|
const totalDuration = Math.min(Math.round(cpuNode.duration / 1000 * multiplier), DEFAULT_MAXIMUM_CPU_TASK_DURATION);
|
|
241
241
|
const estimatedTimeElapsed = totalDuration - timingData.timeElapsed;
|
|
242
|
-
this.
|
|
242
|
+
this.nodeTimings.setCpuEstimated(cpuNode, { estimatedTimeElapsed });
|
|
243
243
|
return estimatedTimeElapsed;
|
|
244
244
|
}
|
|
245
|
-
|
|
245
|
+
estimateNetworkTimeRemaining(networkNode) {
|
|
246
246
|
const request = networkNode.request;
|
|
247
|
-
const timingData = this.
|
|
247
|
+
const timingData = this.nodeTimings.getNetworkStarted(networkNode);
|
|
248
248
|
let timeElapsed = 0;
|
|
249
249
|
if (networkNode.fromDiskCache) {
|
|
250
250
|
// Rough access time for seeking to location on disk and reading sequentially.
|
|
@@ -261,8 +261,8 @@ class Simulator {
|
|
|
261
261
|
timeElapsed = 2 + 10 * sizeInMb - timingData.timeElapsed;
|
|
262
262
|
}
|
|
263
263
|
else {
|
|
264
|
-
const connection = this.
|
|
265
|
-
const dnsResolutionTime = this.
|
|
264
|
+
const connection = this.connectionPool.acquireActiveConnectionFromRequest(request);
|
|
265
|
+
const dnsResolutionTime = this.dns.getTimeUntilResolution(request, {
|
|
266
266
|
requestedAt: timingData.startTime,
|
|
267
267
|
shouldUpdateCache: true,
|
|
268
268
|
});
|
|
@@ -271,28 +271,28 @@ class Simulator {
|
|
|
271
271
|
timeElapsed = calculation.timeElapsed;
|
|
272
272
|
}
|
|
273
273
|
const estimatedTimeElapsed = timeElapsed + timingData.timeElapsedOvershoot;
|
|
274
|
-
this.
|
|
274
|
+
this.nodeTimings.setNetworkEstimated(networkNode, { estimatedTimeElapsed });
|
|
275
275
|
return estimatedTimeElapsed;
|
|
276
276
|
}
|
|
277
277
|
/**
|
|
278
278
|
* Computes and returns the minimum estimated completion time of the nodes currently in progress.
|
|
279
279
|
*/
|
|
280
|
-
|
|
280
|
+
findNextNodeCompletionTime() {
|
|
281
281
|
let minimumTime = Infinity;
|
|
282
|
-
for (const node of this.
|
|
283
|
-
minimumTime = Math.min(minimumTime, this.
|
|
282
|
+
for (const node of this.nodes[NodeState.InProgress]) {
|
|
283
|
+
minimumTime = Math.min(minimumTime, this.estimateTimeRemaining(node));
|
|
284
284
|
}
|
|
285
285
|
return minimumTime;
|
|
286
286
|
}
|
|
287
287
|
/**
|
|
288
288
|
* Given a time period, computes the progress toward completion that the node made durin that time.
|
|
289
289
|
*/
|
|
290
|
-
|
|
291
|
-
const timingData = this.
|
|
290
|
+
updateProgressMadeInTimePeriod(node, timePeriodLength, totalElapsedTime) {
|
|
291
|
+
const timingData = this.nodeTimings.getInProgress(node);
|
|
292
292
|
const isFinished = timingData.estimatedTimeElapsed === timePeriodLength;
|
|
293
293
|
if (node.type === Graph.BaseNode.types.CPU || node.isConnectionless) {
|
|
294
294
|
if (isFinished) {
|
|
295
|
-
this.
|
|
295
|
+
this.markNodeAsComplete(node, totalElapsedTime);
|
|
296
296
|
}
|
|
297
297
|
else {
|
|
298
298
|
timingData.timeElapsed += timePeriodLength;
|
|
@@ -306,8 +306,8 @@ class Simulator {
|
|
|
306
306
|
throw new Core.LanternError('Invalid timing data');
|
|
307
307
|
}
|
|
308
308
|
const request = node.request;
|
|
309
|
-
const connection = this.
|
|
310
|
-
const dnsResolutionTime = this.
|
|
309
|
+
const connection = this.connectionPool.acquireActiveConnectionFromRequest(request);
|
|
310
|
+
const dnsResolutionTime = this.dns.getTimeUntilResolution(request, {
|
|
311
311
|
requestedAt: timingData.startTime,
|
|
312
312
|
shouldUpdateCache: true,
|
|
313
313
|
});
|
|
@@ -320,8 +320,8 @@ class Simulator {
|
|
|
320
320
|
connection.setH2OverflowBytesDownloaded(calculation.extraBytesDownloaded);
|
|
321
321
|
if (isFinished) {
|
|
322
322
|
connection.setWarmed(true);
|
|
323
|
-
this.
|
|
324
|
-
this.
|
|
323
|
+
this.connectionPool.release(request);
|
|
324
|
+
this.markNodeAsComplete(node, totalElapsedTime, calculation.connectionTiming);
|
|
325
325
|
}
|
|
326
326
|
else {
|
|
327
327
|
timingData.timeElapsed += calculation.timeElapsed;
|
|
@@ -329,9 +329,9 @@ class Simulator {
|
|
|
329
329
|
timingData.bytesDownloaded += calculation.bytesDownloaded;
|
|
330
330
|
}
|
|
331
331
|
}
|
|
332
|
-
|
|
333
|
-
const completeNodeTimingEntries = this.
|
|
334
|
-
return [node, this.
|
|
332
|
+
computeFinalNodeTimings() {
|
|
333
|
+
const completeNodeTimingEntries = this.nodeTimings.getNodes().map(node => {
|
|
334
|
+
return [node, this.nodeTimings.getCompleted(node)];
|
|
335
335
|
});
|
|
336
336
|
// Most consumers will want the entries sorted by startTime, so insert them in that order
|
|
337
337
|
completeNodeTimingEntries.sort((a, b) => a[1].startTime - b[1].startTime);
|
|
@@ -352,7 +352,7 @@ class Simulator {
|
|
|
352
352
|
};
|
|
353
353
|
}
|
|
354
354
|
getOptions() {
|
|
355
|
-
return this.
|
|
355
|
+
return this.options;
|
|
356
356
|
}
|
|
357
357
|
/**
|
|
358
358
|
* Estimates the time taken to process all of the graph's nodes, returns the overall time along with
|
|
@@ -371,23 +371,23 @@ class Simulator {
|
|
|
371
371
|
label: undefined,
|
|
372
372
|
}, options);
|
|
373
373
|
// initialize the necessary data containers
|
|
374
|
-
this.
|
|
375
|
-
this.
|
|
376
|
-
this.
|
|
377
|
-
const nodesNotReadyToStart = this.
|
|
378
|
-
const nodesReadyToStart = this.
|
|
379
|
-
const nodesInProgress = this.
|
|
374
|
+
this.dns = new DNSCache({ rtt: this._rtt });
|
|
375
|
+
this.initializeConnectionPool(graph);
|
|
376
|
+
this.initializeAuxiliaryData();
|
|
377
|
+
const nodesNotReadyToStart = this.nodes[NodeState.NotReadyToStart];
|
|
378
|
+
const nodesReadyToStart = this.nodes[NodeState.ReadyToStart];
|
|
379
|
+
const nodesInProgress = this.nodes[NodeState.InProgress];
|
|
380
380
|
const rootNode = graph.getRootNode();
|
|
381
381
|
rootNode.traverse(node => nodesNotReadyToStart.add(node));
|
|
382
382
|
let totalElapsedTime = 0;
|
|
383
383
|
let iteration = 0;
|
|
384
384
|
// root node is always ready to start
|
|
385
|
-
this.
|
|
385
|
+
this.markNodeAsReadyToStart(rootNode, totalElapsedTime);
|
|
386
386
|
// loop as long as we have nodes in the queue or currently in progress
|
|
387
387
|
while (nodesReadyToStart.size || nodesInProgress.size) {
|
|
388
388
|
// move all possible queued nodes to in progress
|
|
389
|
-
for (const node of this.
|
|
390
|
-
this.
|
|
389
|
+
for (const node of this.getNodesSortedByStartPosition()) {
|
|
390
|
+
this.startNodeIfPossible(node, totalElapsedTime);
|
|
391
391
|
}
|
|
392
392
|
if (!nodesInProgress.size) {
|
|
393
393
|
// Interplay between fromDiskCache and connectionReused can be incorrect,
|
|
@@ -395,9 +395,9 @@ class Simulator {
|
|
|
395
395
|
throw new Core.LanternError('Failed to start a node');
|
|
396
396
|
}
|
|
397
397
|
// set the available throughput for all connections based on # inflight
|
|
398
|
-
this.
|
|
398
|
+
this.updateNetworkCapacity();
|
|
399
399
|
// find the time that the next node will finish
|
|
400
|
-
const minimumTime = this.
|
|
400
|
+
const minimumTime = this.findNextNodeCompletionTime();
|
|
401
401
|
totalElapsedTime += minimumTime;
|
|
402
402
|
// While this is no longer strictly necessary, it's always better than hanging
|
|
403
403
|
if (!Number.isFinite(minimumTime) || iteration > 100000) {
|
|
@@ -406,11 +406,11 @@ class Simulator {
|
|
|
406
406
|
iteration++;
|
|
407
407
|
// update how far each node will progress until that point
|
|
408
408
|
for (const node of nodesInProgress) {
|
|
409
|
-
this.
|
|
409
|
+
this.updateProgressMadeInTimePeriod(node, minimumTime, totalElapsedTime);
|
|
410
410
|
}
|
|
411
411
|
}
|
|
412
412
|
// `nodeTimings` are used for simulator consumers, `completeNodeTimings` kept for debugging.
|
|
413
|
-
const { nodeTimings, completeNodeTimings } = this.
|
|
413
|
+
const { nodeTimings, completeNodeTimings } = this.computeFinalNodeTimings();
|
|
414
414
|
ALL_SIMULATION_NODE_TIMINGS.set(options.label || 'unlabeled', completeNodeTimings);
|
|
415
415
|
return {
|
|
416
416
|
timeInMs: totalElapsedTime,
|
|
@@ -418,7 +418,7 @@ class Simulator {
|
|
|
418
418
|
};
|
|
419
419
|
}
|
|
420
420
|
computeWastedMsFromWastedBytes(wastedBytes) {
|
|
421
|
-
const { throughput, observedThroughput } = this.
|
|
421
|
+
const { throughput, observedThroughput } = this.options;
|
|
422
422
|
// https://github.com/GoogleChrome/lighthouse/pull/13323#issuecomment-962031709
|
|
423
423
|
// 0 throughput means the no (additional) throttling is expected.
|
|
424
424
|
// This is common for desktop + devtools throttling where throttling is additive and we don't want any additional.
|
|
@@ -439,7 +439,7 @@ class Simulator {
|
|
|
439
439
|
* When simulating, just because a low priority image started 5ms before a high priority image doesn't mean
|
|
440
440
|
* it would have happened like that when the network was slower.
|
|
441
441
|
*/
|
|
442
|
-
static
|
|
442
|
+
static computeNodeStartPosition(node) {
|
|
443
443
|
if (node.type === 'cpu') {
|
|
444
444
|
return node.startTime;
|
|
445
445
|
}
|