gecko-dev/servo/components/profile
Imanol Fernandez 952fe5d9e8 servo: Merge #14618 - WebVR API Implementation (from MortimerGoro:webvr_api); r=larsbergstrom,emilio,jdm,nox,asajeffrey,cvan
<!-- Please describe your changes on the following line: -->

WebVR API Implementation with HTC Vive support on Windows. The current implementations only enables the WebVR support on Windows. In other platforms the API is available on JavaScript but navigator.vr.getDisplays() returns an empty array. This will change when we add support for more VR providers and platforms ;)

Info about the architecture:
https://blog.mozvr.com/webvr-servo-architecture-and-latency-optimizations/
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [ ] These changes fix #__ (github issue number if applicable).

<!-- Either: -->
- [X] There are tests for these changes OR
- [ ] These changes do not require tests because _____

Proprietary openvr.dll must be copied next to servo.exe in order to test on HTC Vive (https://github.com/ValveSoftware/openvr/tree/master/bin/win64) I have added some of the official WebVR samples for testing. Switch on your headset and run:

mach run tests/html/webvr/room-scale.html

Source-Repo: https://github.com/servo/servo
Source-Revision: 518ef39cfd429082dd8dc0d5b13e2db637d08a53
2017-01-09 06:39:45 -08:00
..
Cargo.toml servo: Merge #14592 - Remove the util crate (from asajeffrey:util-goodbye); r=mbrubeck 2016-12-14 16:48:42 -08:00
README.md servo: Merge #7593 - Add documentation to profile crate on Heartbeats and energy-profiling (from connorimes:energy-profiling-doc); r=larsbergstrom 2015-09-10 11:29:29 -06:00
heartbeats.rs servo: Merge #14592 - Remove the util crate (from asajeffrey:util-goodbye); r=mbrubeck 2016-12-14 16:48:42 -08:00
lib.rs servo: Merge #14889 - Upgrade to rustc 1.16.0-nightly (6f1ae663e 2017-01-06) (from servo:rustup); r=jdm 2017-01-07 08:18:28 -08:00
mem.rs servo: Merge #14592 - Remove the util crate (from asajeffrey:util-goodbye); r=mbrubeck 2016-12-14 16:48:42 -08:00
time.rs servo: Merge #14618 - WebVR API Implementation (from MortimerGoro:webvr_api); r=larsbergstrom,emilio,jdm,nox,asajeffrey,cvan 2017-01-09 06:39:45 -08:00
trace-dump-epilogue-1.html servo: Merge #10694 - Add a method for dumping profiles as self-contained HTML w/ timeline visualization (from fitzgen:profile-traces-to-file); r=SimonSapin 2016-04-28 02:47:35 -07:00
trace-dump-epilogue-2.html servo: Merge #10694 - Add a method for dumping profiles as self-contained HTML w/ timeline visualization (from fitzgen:profile-traces-to-file); r=SimonSapin 2016-04-28 02:47:35 -07:00
trace-dump-prologue-1.html servo: Merge #10694 - Add a method for dumping profiles as self-contained HTML w/ timeline visualization (from fitzgen:profile-traces-to-file); r=SimonSapin 2016-04-28 02:47:35 -07:00
trace-dump-prologue-2.html servo: Merge #10694 - Add a method for dumping profiles as self-contained HTML w/ timeline visualization (from fitzgen:profile-traces-to-file); r=SimonSapin 2016-04-28 02:47:35 -07:00
trace-dump.css servo: Merge #11098 - Update `trace-dump.{js,css}` from upstream (from fitzgen:update-trace-dump); r=jdm 2016-05-10 06:34:32 -07:00
trace-dump.js servo: Merge #11098 - Update `trace-dump.{js,css}` from upstream (from fitzgen:update-trace-dump); r=jdm 2016-05-10 06:34:32 -07:00
trace_dump.rs servo: Merge #11329 - Report use statements that use {} with only one entry (from c-rhodes:11320); r=jdm 2016-05-27 07:11:17 -05:00

README.md

This crate hosts the Servo profiler. Its APIs can be found in the profile_traits crate.

Heartbeats

Heartbeats allow fine-grained timing and energy profiling of Servo tasks specified in the ProfilerCategory enum (see the profile_traits::time module). When enabled, a heartbeat is issued for each profiler category event. They also compute the average performance and power for three levels of granularity:

  • Global: the entire runtime.
  • Window: the category's last N events, where N is the size of a sliding window.
  • Instant: the category's most recent event.

Enabling

Heartbeats are enabled for categories by setting proper environment variables prior to launching Servo.

For each desired category, set the SERVO_HEARTBEAT_ENABLE_MyCategory environment variable to any value (an empty string will do) where MyCategory is the ProfilerCategory name exactly as it appears in the enum. For example:

SERVO_HEARTBEAT_ENABLE_LayoutPerform=""

Then set the SERVO_HEARTBEAT_LOG_MyCategory environment variable so Servo knows where to write the results. For example:

SERVO_HEARTBEAT_LOG_LayoutPerform="/tmp/heartbeat-LayoutPerform.log"

The target directory must already exist and be writeable. Results are written to the log file every N heartbeats and when the profiler shuts down.

You can optionally specify the size of the sliding window by setting SERVO_HEARTBEAT_WINDOW_MyCategory to a positive integer value. The default value is 20. For example:

SERVO_HEARTBEAT_WINDOW_LayoutPerform=20

The window size is also how many heartbeats will be stored in memory.

Log Files

Log files are whitespace-delimited.

HB is the heartbeat number, ordered by when they are registered (not necessarily start or end time!). The count starts at 0.

Tag is a client-specified identifier for each heartbeat. Servo does not use this, so the value is always 0.

Work is the amount of work completed for a particular heartbeat and is used in computing performance. At this time, Servo simply specifies 1 unit of work for each heartbeat.

Time and Energy have Start and End values as captured during runtime. Time is measured in nanoseconds and energy is measured in microjoules.

Work, Time, and Energy also have Global and Window values which are the summed over the entire runtime and sliding window period, respectively.

Perf (performance) and Pwr (power) have Global, Window, and Instant values as described above.

Energy Profiling

Energy monitoring is hardware and platform-specific, so it is only enabled with the energy-profiling feature.

To use energy profiling, you must have a compatible energymon-default implementation installed to your system as energymon-default-static when building Servo. Otherwise a default dummy implementation is used. The library is linked through a chain of dependencies:

  • servo::profile_traits
    • energymon - Rust abstractions
      • energymon-default-sys - Rust bindings to energymon-default.h
        • energymon-default-static: A statically linked C library installed to the system that implements energymon.h and energymon-default.h

For instructions on building existing native libraries, visit the energymon project source. You may also write your own implementation of energymon.h and energymon-default.h and install it as energymon-default-static where pkg-config can find it.

Once you install the proper library, you will need to rebuild the energymon-default-sys crate. The most straightforward way to do this is to do a clean build of Servo.

To build Servo with the energy-profiling feature enabled, pass --features "energy-profiling" to the mach command, e.g.:

./mach build -r --features "energy-profiling"

When running Servo, you will want to enable the desired Heartbeats to record the results.