Skip to content

Performance improvements to CPU profile code #7917

@mkustermann

Description

@mkustermann

After having taken a look at the cpu profiling code in DevTools, we found:

  • It unnecessarily encodes json maps and decodes them again: devtools/pull/7916
  • It gets Stream</* String | List<int> */> from the websocket and then json decodes strings
    => It would be more efficient to avoid going from utf-8 to string and then to json and instead directly from utf8->json
    => This would probably require some refactoring in various packages, so maybe not easily doable?
  • Way too many conversions
    • Bytes->String in websocket layer
    • String->JSON in package:vm_service layer
    • JSON -> service objects in package:vm_service layer (e.g. vm_service.CpuSamples, vm_service.CpuSample)
    • service objects -> _CpuProfileTimelineTree tree structure
      => Uses expandos (!!) to map service objects back to tree nodes
    • _CpuProfileTimelineTree -> JSON "traceObject" (very expensive operation!)
    • Going from JSON "traceObject" back to normal objects in CpuProfileData.fromJson which builds json maps with strings and CpuStackFrame as values

It seems there's too many conversions from one data structure to another and the representations used for encoding this profiling information doesn't seem very efficient either.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2important to work on, but not at the top of the work list.dart2wasmdevtools app performanceRelated to the performance of the DevTools app (not the Performance page)product-qualityIssues related to product quality.screen: cpu profilerIssues related to the CPU Profiler screen

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions