2016-04-06 14 views
8

Ich versuche zu verstehen, wie die Geschwindigkeit einer D3.js-Anwendung (eine interaktive Visualisierung von Daten) durch die Analyse der Timeline-Daten in Chrome Developer Tool verbessert werden konnte.Was bedeutet die Kategorie "Sonstige" im Chrome Timeline-Profiling-Tool?

Ich ziehe die Datenbalken herum, wobei sie bei Mausbewegungen verschoben werden (SVG-Transformationen).

Timeline sagt mir, dass 50% der CPU-Zeit von "anderen" Prozessen verwendet wird (der Rest ist "Scripting", "Rendering", "Painting" und "Idle").

Was genau ist "Andere", und was könnte das Problem sein, wenn es 50% der Zeit braucht?

Übrigens, wenn ich ziehe durch Halten der rechten Maustaste nicht links, ist die Antwort viel besser, und "Andere" verwendet nur etwa 20% der Zeit.

+0

Ich möchte auch wissen: D –

Antwort

4

Ich fragte mich die gleiche Frage vor zwei Jahren. Ich wusste nicht, was die grauen Balken bzw. andere Kategorie für stehen.

Es war schwer, eine offizielle Antwort zu finden, da die Chrome DevTools Docs nur "Aktivität, die nicht von DevTools instrumentiert wurde". Aber diese Aussage wurde entfernt, da es eine new documentation gibt.

Also habe ich das Chromium-Projekt ausgecheckt und den Devtools-Code nach einer Antwort durchsucht. Ich fand heraus, dass die Andere Kategorie alle Aktivitäten enthält, die nicht Loading, zu den Kategorien gehören Scripting, Rendering, und GPU Malerei. Dies ist ein list of all record types:

WebInspector.TimelineModel.RecordType = { 
    Task: "Task", 
    Program: "Program", 
    EventDispatch: "EventDispatch", 

    GPUTask: "GPUTask", 

    Animation: "Animation", 
    RequestMainThreadFrame: "RequestMainThreadFrame", 
    BeginFrame: "BeginFrame", 
    NeedsBeginFrameChanged: "NeedsBeginFrameChanged", 
    BeginMainThreadFrame: "BeginMainThreadFrame", 
    ActivateLayerTree: "ActivateLayerTree", 
    DrawFrame: "DrawFrame", 
    HitTest: "HitTest", 
    ScheduleStyleRecalculation: "ScheduleStyleRecalculation", 
    RecalculateStyles: "RecalculateStyles", // For backwards compatibility only, now replaced by UpdateLayoutTree. 
    UpdateLayoutTree: "UpdateLayoutTree", 
    InvalidateLayout: "InvalidateLayout", 
    Layout: "Layout", 
    UpdateLayer: "UpdateLayer", 
    UpdateLayerTree: "UpdateLayerTree", 
    PaintSetup: "PaintSetup", 
    Paint: "Paint", 
    PaintImage: "PaintImage", 
    Rasterize: "Rasterize", 
    RasterTask: "RasterTask", 
    ScrollLayer: "ScrollLayer", 
    CompositeLayers: "CompositeLayers", 

    ScheduleStyleInvalidationTracking: "ScheduleStyleInvalidationTracking", 
    StyleRecalcInvalidationTracking: "StyleRecalcInvalidationTracking", 
    StyleInvalidatorInvalidationTracking: "StyleInvalidatorInvalidationTracking", 
    LayoutInvalidationTracking: "LayoutInvalidationTracking", 
    LayerInvalidationTracking: "LayerInvalidationTracking", 
    PaintInvalidationTracking: "PaintInvalidationTracking", 
    ScrollInvalidationTracking: "ScrollInvalidationTracking", 

    ParseHTML: "ParseHTML", 
    ParseAuthorStyleSheet: "ParseAuthorStyleSheet", 

    TimerInstall: "TimerInstall", 
    TimerRemove: "TimerRemove", 
    TimerFire: "TimerFire", 

    XHRReadyStateChange: "XHRReadyStateChange", 
    XHRLoad: "XHRLoad", 
    CompileScript: "v8.compile", 
    EvaluateScript: "EvaluateScript", 

    CommitLoad: "CommitLoad", 
    MarkLoad: "MarkLoad", 
    MarkDOMContent: "MarkDOMContent", 
    MarkFirstPaint: "MarkFirstPaint", 

    TimeStamp: "TimeStamp", 
    ConsoleTime: "ConsoleTime", 
    UserTiming: "UserTiming", 

    ResourceSendRequest: "ResourceSendRequest", 
    ResourceReceiveResponse: "ResourceReceiveResponse", 
    ResourceReceivedData: "ResourceReceivedData", 
    ResourceFinish: "ResourceFinish", 

    RunMicrotasks: "RunMicrotasks", 
    FunctionCall: "FunctionCall", 
    GCEvent: "GCEvent", // For backwards compatibility only, now replaced by MinorGC/MajorGC. 
    MajorGC: "MajorGC", 
    MinorGC: "MinorGC", 
    JSFrame: "JSFrame", 
    JSSample: "JSSample", 
    // V8Sample events are coming from tracing and contain raw stacks with function addresses. 
    // After being processed with help of JitCodeAdded and JitCodeMoved events they 
    // get translated into function infos and stored as stacks in JSSample events. 
    V8Sample: "V8Sample", 
    JitCodeAdded: "JitCodeAdded", 
    JitCodeMoved: "JitCodeMoved", 
    ParseScriptOnBackground: "v8.parseOnBackground", 

    UpdateCounters: "UpdateCounters", 

    RequestAnimationFrame: "RequestAnimationFrame", 
    CancelAnimationFrame: "CancelAnimationFrame", 
    FireAnimationFrame: "FireAnimationFrame", 

    RequestIdleCallback: "RequestIdleCallback", 
    CancelIdleCallback: "CancelIdleCallback", 
    FireIdleCallback: "FireIdleCallback", 

    WebSocketCreate : "WebSocketCreate", 
    WebSocketSendHandshakeRequest : "WebSocketSendHandshakeRequest", 
    WebSocketReceiveHandshakeResponse : "WebSocketReceiveHandshakeResponse", 
    WebSocketDestroy : "WebSocketDestroy", 

    EmbedderCallback : "EmbedderCallback", 

    SetLayerTreeId: "SetLayerTreeId", 
    TracingStartedInPage: "TracingStartedInPage", 
    TracingSessionIdForWorker: "TracingSessionIdForWorker", 

    DecodeImage: "Decode Image", 
    ResizeImage: "Resize Image", 
    DrawLazyPixelRef: "Draw LazyPixelRef", 
    DecodeLazyPixelRef: "Decode LazyPixelRef", 

    LazyPixelRef: "LazyPixelRef", 
    LayerTreeHostImplSnapshot: "cc::LayerTreeHostImpl", 
    PictureSnapshot: "cc::Picture", 
    DisplayItemListSnapshot: "cc::DisplayItemList", 
    LatencyInfo: "LatencyInfo", 
    LatencyInfoFlow: "LatencyInfo.Flow", 
    InputLatencyMouseMove: "InputLatency::MouseMove", 
    InputLatencyMouseWheel: "InputLatency::MouseWheel", 
    ImplSideFling: "InputHandlerProxy::HandleGestureFling::started", 
    GCIdleLazySweep: "ThreadState::performIdleLazySweep", 
    GCCompleteSweep: "ThreadState::completeSweep", 
    GCCollectGarbage: "BlinkGCMarking", 

    // CpuProfile is a virtual event created on frontend to support 
    // serialization of CPU Profiles within tracing timeline data. 
    CpuProfile: "CpuProfile", 
    Profile: "Profile" 
} 

Und vielleicht diese Stackoverflow Frage ist hilfreich: Chrome Dev Tools: Timeline - White Bars


Edit: Und here können Sie die Zuordnung der Satzarten einer Kategorie finden:

WebInspector.TimelineUIUtils._initEventStyles = function() 
{ 
    if (WebInspector.TimelineUIUtils._eventStylesMap) 
     return WebInspector.TimelineUIUtils._eventStylesMap; 

    var recordTypes = WebInspector.TimelineModel.RecordType; 
    var categories = WebInspector.TimelineUIUtils.categories(); 

    var eventStyles = {}; 
    eventStyles[recordTypes.Task] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Task"), categories["other"]); 
    eventStyles[recordTypes.Program] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Other"), categories["other"]); 
    eventStyles[recordTypes.Animation] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Animation"), categories["rendering"]); 
    eventStyles[recordTypes.EventDispatch] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Event"), categories["scripting"]); 
    eventStyles[recordTypes.RequestMainThreadFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Request Main Thread Frame"), categories["rendering"], true); 
    eventStyles[recordTypes.BeginFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Frame Start"), categories["rendering"], true); 
    eventStyles[recordTypes.BeginMainThreadFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Frame Start (main thread)"), categories["rendering"], true); 
    eventStyles[recordTypes.DrawFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Draw Frame"), categories["rendering"], true); 
    eventStyles[recordTypes.HitTest] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Hit Test"), categories["rendering"]); 
    eventStyles[recordTypes.ScheduleStyleRecalculation] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Schedule Style Recalculation"), categories["rendering"], true); 
    eventStyles[recordTypes.RecalculateStyles] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Recalculate Style"), categories["rendering"]); 
    eventStyles[recordTypes.UpdateLayoutTree] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Recalculate Style"), categories["rendering"]); 
    eventStyles[recordTypes.InvalidateLayout] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Invalidate Layout"), categories["rendering"], true); 
    eventStyles[recordTypes.Layout] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Layout"), categories["rendering"]); 
    eventStyles[recordTypes.PaintSetup] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Paint Setup"), categories["painting"]); 
    eventStyles[recordTypes.PaintImage] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Paint Image"), categories["painting"], true); 
    eventStyles[recordTypes.UpdateLayer] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Update Layer"), categories["painting"], true); 
    eventStyles[recordTypes.UpdateLayerTree] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Update Layer Tree"), categories["rendering"]); 
    eventStyles[recordTypes.Paint] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Paint"), categories["painting"]); 
    eventStyles[recordTypes.RasterTask] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Rasterize Paint"), categories["painting"]); 
    eventStyles[recordTypes.ScrollLayer] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Scroll"), categories["rendering"]); 
    eventStyles[recordTypes.CompositeLayers] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Composite Layers"), categories["painting"]); 
    eventStyles[recordTypes.ParseHTML] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Parse HTML"), categories["loading"]); 
    eventStyles[recordTypes.ParseAuthorStyleSheet] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Parse Stylesheet"), categories["loading"]); 
    eventStyles[recordTypes.TimerInstall] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Install Timer"), categories["scripting"]); 
    eventStyles[recordTypes.TimerRemove] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Remove Timer"), categories["scripting"]); 
    eventStyles[recordTypes.TimerFire] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Timer Fired"), categories["scripting"]); 
    eventStyles[recordTypes.XHRReadyStateChange] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("XHR Ready State Change"), categories["scripting"]); 
    eventStyles[recordTypes.XHRLoad] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("XHR Load"), categories["scripting"]); 
    eventStyles[recordTypes.CompileScript] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Compile Script"), categories["scripting"]); 
    eventStyles[recordTypes.EvaluateScript] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Evaluate Script"), categories["scripting"]); 
    eventStyles[recordTypes.ParseScriptOnBackground] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Parse Script"), categories["scripting"]); 
    eventStyles[recordTypes.MarkLoad] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Load event"), categories["scripting"], true); 
    eventStyles[recordTypes.MarkDOMContent] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("DOMContentLoaded event"), categories["scripting"], true); 
    eventStyles[recordTypes.MarkFirstPaint] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("First paint"), categories["painting"], true); 
    eventStyles[recordTypes.TimeStamp] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Timestamp"), categories["scripting"]); 
    eventStyles[recordTypes.ConsoleTime] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Console Time"), categories["scripting"]); 
    eventStyles[recordTypes.UserTiming] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("User Timing"), categories["scripting"]); 
    eventStyles[recordTypes.ResourceSendRequest] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Send Request"), categories["loading"]); 
    eventStyles[recordTypes.ResourceReceiveResponse] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Receive Response"), categories["loading"]); 
    eventStyles[recordTypes.ResourceFinish] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Finish Loading"), categories["loading"]); 
    eventStyles[recordTypes.ResourceReceivedData] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Receive Data"), categories["loading"]); 
    eventStyles[recordTypes.RunMicrotasks] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Run Microtasks"), categories["scripting"]); 
    eventStyles[recordTypes.FunctionCall] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Function Call"), categories["scripting"]); 
    eventStyles[recordTypes.GCEvent] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("GC Event"), categories["scripting"]); 
    eventStyles[recordTypes.MajorGC] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Major GC"), categories["scripting"]); 
    eventStyles[recordTypes.MinorGC] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Minor GC"), categories["scripting"]); 
    eventStyles[recordTypes.JSFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("JS Frame"), categories["scripting"]); 
    eventStyles[recordTypes.RequestAnimationFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Request Animation Frame"), categories["scripting"]); 
    eventStyles[recordTypes.CancelAnimationFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Cancel Animation Frame"), categories["scripting"]); 
    eventStyles[recordTypes.FireAnimationFrame] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Animation Frame Fired"), categories["scripting"]); 
    eventStyles[recordTypes.RequestIdleCallback] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Request Idle Callback"), categories["scripting"]); 
    eventStyles[recordTypes.CancelIdleCallback] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Cancel Idle Callback"), categories["scripting"]); 
    eventStyles[recordTypes.FireIdleCallback] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Fire Idle Callback"), categories["scripting"]); 
    eventStyles[recordTypes.WebSocketCreate] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Create WebSocket"), categories["scripting"]); 
    eventStyles[recordTypes.WebSocketSendHandshakeRequest] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Send WebSocket Handshake"), categories["scripting"]); 
    eventStyles[recordTypes.WebSocketReceiveHandshakeResponse] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Receive WebSocket Handshake"), categories["scripting"]); 
    eventStyles[recordTypes.WebSocketDestroy] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Destroy WebSocket"), categories["scripting"]); 
    eventStyles[recordTypes.EmbedderCallback] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Embedder Callback"), categories["scripting"]); 
    eventStyles[recordTypes.DecodeImage] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Image Decode"), categories["painting"]); 
    eventStyles[recordTypes.ResizeImage] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Image Resize"), categories["painting"]); 
    eventStyles[recordTypes.GPUTask] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("GPU"), categories["gpu"]); 
    eventStyles[recordTypes.LatencyInfo] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("Input Latency"), categories["scripting"]); 

    eventStyles[recordTypes.GCIdleLazySweep] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("DOM GC"), categories["scripting"]); 
    eventStyles[recordTypes.GCCompleteSweep] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("DOM GC"), categories["scripting"]); 
    eventStyles[recordTypes.GCCollectGarbage] = new WebInspector.TimelineRecordStyle(WebInspector.UIString("DOM GC"), categories["scripting"]); 

    WebInspector.TimelineUIUtils._eventStylesMap = eventStyles; 
    return eventStyles; 
} 

Die Chrome-Timeline zeigt den gesamten Datensatz t ypes, die nicht zugeordnet sind oder der Andere Kategorie als graue Balken in der Andere Kategorie zugewiesen sind.

+0

Vielen Dank für das Teilen dieses gründliche Wissen! Wenn ich das richtig verstanden habe, wird jedes Event, das nicht in "RecordType" definiert ist, als "Other, correct?" Hast du eine Ahnung, was das sein könnte? Und warum sind Werte, die für einige Aktivitäten wie D3 hoch sind, zu hoch? – altocumulus

+0

Hallo, nein, Entschuldigung. Die Liste zeigt alle verfügbaren Datensatztypen. Aber nicht alle Record-Typen können _Loading_, _Scripting_, _Rendering_, _Painting_ oder _GPU_ zugewiesen werden. Also gibt es eine andere Kategorie _Other_. Ich habe die Zuordnung der Ereignisse zu den Kategorien meiner vorherigen Antwort hinzugefügt. – Johann

Verwandte Themen