- Added
loggingcategory - Fixed missing unescaping for function name and location in the V8 log, which could lead to incorrect parsing — such as including the script path in the function name
- Fixed functions name and location processing when no source or scripts provided in V8 log
- Fixed attribution to
idleVM state in V8 log, previously idle samples was attributed to(program)or(atomics await) - Fixed
esm.shregistry patterns
- Added raw V8 log format support
- Added gzip and deflate compressed profile support
- Added code state histogram on the entry page
- Added heap size histogram on the entry page
- Added code tier intervals indicator on the timeline in call frame and module pages
- Added source code display on module and call frame pages, annotated with self and nested time badges, inline and deopt badges
- Added code states table with tier, inline, and deopt details
- Enhanced All Call Frames table with additional columns (source, code states, deopt count), expandable for inline code and code states
- Added hotness indicator in most UI call frame listings
- Added expanded state persistence for expandable blocks during the session
- Fixed edge cases in call stack processing for precise sample locations
- Many other improvements and fixes
- Viewer
- Changed terminology in accordance with that adopted in V8; the main term is now call frame (JS/Wasm function, RegExp, VM state, native handler, etc.) instead of "function"
- Added "All call frames," "All modules," and "All packages" pages, which display entries even if they have no samples (when a profile provides data about compiled functions, such as a V8 log)
- Added an option to consolidate call frames (a "Consolidate call frames" checkbox, checked by default) to the "Nested call sites" tree on the call frame page
- Added call frame consolidation in a call frame's nested calls flame chart on the call frame page
- Added call tree updates on filter changes on the call frame page
- Added a
kindproperty for call frames, which can bescript,function,regexp,vm-state, orroot - Reworked tables on the
category,package, andmodulepages to include records with no samples and show the number of nested subjects (e.g., modules or call frames for a package) assampled / all - Reworked the data model in preparation for multi-profile analysis and comparison
- Reworked profile data preprocessing and initial profile computations
- Introduced a shared dictionary for call frames, scripts, modules, packages, etc., to be used across a set of profiles
- Introduced an optional call frame positions tree and related structures for source code position precision timings
- Improved parsing of function names and URLs during the conversion of preprocessed V8 logs into cpuprofile
- Changed line and column numbers to be zero-based during the conversion of preprocessed V8 logs into cpuprofile
- Limited the display of very long regular expressions in the function page header to the first 256 characters
- Replaced the
enginecategory withcompilation(covering parsers and compilers) andblocking(atomic waits) categories - Added a
devtoolscategory for scripts injected by a runtime for debugging purposes, such as those added by VS Code for scripts run from the "Run and Debug" panel - Fixed processing of
v8/gccall frames that appear when Node.js is run with--expose-gcandglobal.gc()is invoked (added tointernals) - Various fixes and improvements
- Viewer
- Added transformation from
parenttochildrenfor call tree nodes for.cpuprofilefiles if needed (fixes #5) - Implemented exclusion of ending no-sample time. For certain profiles, the time from the last sample until
endTimecan be significant, indicating the conclusion of the profiling session or adjustments from excluding idle samples at the end. This time is now excluded from theProfiling timewhich used for computing time percentages - Fixed double rendering of the page after the profile data is loaded
- Added transformation from
- Viewer
- Changed the terminology: replaced "area" with "category"
- Formats
- Added support for Edge Enhanced Performance Traces
- Added support for V8 log preprocessed with
--preprocess - Fixed the extraction of a CPU profile from Chrome tracing when it contains several profiles
- Computations
- Reworked the computations on profile loading from scratch with performance and memory usage in mind, achieving a 2-10 times speed increase and reduced memory consumption
- Implemented GC nodes reparenting to the script node
- Fixed the placement of bundle modules to be placed in the "script" category instead of the "bundle" category
- Changed the handling of negative time deltas, they are now corrected by rearranging instead of being ignored
- Resolved the issue with shortening paths to scripts when
webpack/runtimeis present in the CPU profile - Adjusted call frame reference computation by omitting line and column when they are not specified or less than zero
- Runtimes & registries
- Added Deno detection
- Added Electron detection
- Added detection for CDNs and registries: JSR, deno.land, jsdelivr, unpkg, esm.sh, esm.run, jspm, and skypack
- Redesigned welcome page, added "Try an example" buttons
- Reworked the layout and UX of the main page
- Implemented permanent colors and a fixed timeline order for areas and module types
- Improved the display of regular expressions, particularly long ones
- Reworked subject pages, each page now includes:
- A timeline that not only displays self time but also nested time, with the distribution of nested time by categories
- A section "Nested time distribution"
- A basic flamechart displaying all frames related to the current subject as root frames
- Timeline
- Added the capability to select a range
- Added a tooltip that provides expanded details on a range
- Flamechart
- Added vertical scrolling locking when not activated
- Added a detailed information block for the selected or zoomed frame
- Added the capability to select frames
- Improved performance and reliability
- Changed colors to match category colors and module types
- Viewer
- Extracted regular expression into a separate area
regexp - Fixed edge cases when
scriptIdis not a number - Added ancestor call sites on a function page
- Added function grouping on a function page (enabled by default)
- Added timeline split by areas on default page
- Improved function subtree displaying
- Fixed processing of evaled functions (call frames with
evalmachineprefixes)
- Extracted regular expression into a separate area
- CLI:
- Added support to load jsonxl files
- API:
- Profile (result of
profileEnd()):- Renamed methods:
writeToFile()->writeToFileAsync()writeToFileSync()->writeToFile()writeJsonxlToFileSync()->writeJsonxlToFile()
- Changed
writeToFileAsync(),writeToFile()andwriteJsonxlToFile()methods to return a destination file path - Added
writeReport()method as alias toreport.writeToFile()
- Renamed methods:
profileEnd().report- Renamed
writeToFile()->writeToFileAsync()andwriteToFileSync()->writeToFile()(however, at the moment both are sync) - Changed
open()method to return a destination file path
- Renamed
- Capture (result of
profile())- Added
onEnd(callback)method to add a callback to call once capturing is finished, a callback can take a profiling result argument - Added
writeToFile(),writeJsonxlToFile(),writeReport()andopenReport()methods to call corresponding methods one capturing is finished
- Added
- Changed
profile()to return an active capturing for a name if any instead of creating a new one - Changed
profile()to subscribe on process exit to end profiling (process.on('exit', () => profileEnd())) - Added
writeToFile(),writeJsonxlToFile(),writeReport()andopenReport()methods that startsprofile()and call a corresponding method, i.e.writeReport()is the same asprofile().writeReport()
- Profile (result of
- Used jsonxl binary and gzip encodings for data on report generating, which allow to produce a report much faster and much smaller (up to 50 times) in size
- Added
writeJsonxlToFileSync()method to profile - Added
build/*.htmlandpackage.jsonto exports - Viewer
- Bumped
discoveryjsto1.0.0-beta.73 - Enabled embed API for integrations
- Rework
flamechartfor performance and reliability, it's a little more compact - Added badges for function references
- Updated segments timeline
- Fixed Windows path processing
- New page badges
- Bumped
- Added count badges and tweaked numeric captions
- Fixed processing of profiles when call frame
scriptIdis a non-numeric string - Reworked
flamechartview to improve performance especially on large datasets (eliminated double "renders" in some cases, a lot of unnecessary computations and other optimisations) - Changed behaviour in
flamechartwhen click on already selected frame to select previously selected frame with a lower depth - Fixed
flamechart's view height updating when stack depth is growing on zoom - Bumped
discoveryjsto 1.0.0-beta.65
- Added support for Chromium Developer Tools profile format (Trace Event Format)
- Added flame chart on index page
- Fixed time deltas processing
- Fixed total time computation for areas, packages, modules and functions
- Fixed module path processing
- Reworked aggregations for areas, packages, modules and functions
- Added missed
binfield - Renamed profile recording method
end()intoprofileEnd()for less confussion - Fixed a crash in viewer when an element in
nodesdoesn't contain achildrenfield, e.g. when DevTools protocol is used - Fixed file module path normalization in viewer
- Removed modification of
startTimeandendTimein recorded profile - Exposed
createReport()method
- Initial release