{"id":561,"date":"2026-08-26T12:28:35","date_gmt":"2026-08-26T19:28:35","guid":{"rendered":"https:\/\/blog.mozilla.org\/performance\/?p=561"},"modified":"2026-08-31T12:14:29","modified_gmt":"2026-08-31T19:14:29","slug":"the-road-to-better-performance-profiles-part-2","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/performance\/2026\/08\/26\/the-road-to-better-performance-profiles-part-2\/","title":{"rendered":"The Road to Better Performance Profiles &#8211; Part 2"},"content":{"rendered":"<p>Following the symbolication work from <a href=\"https:\/\/blog.mozilla.org\/performance\/2026\/02\/03\/the-road-to-better-performance-profiles\/\">Part 1<\/a>, I undertook two more efforts to improve performance profiles for the Performance team.<\/p>\n<h3><b>Native Profiling (Bugs <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2030161\">2030161<\/a>, <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2030166\">2030166<\/a>, <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2047451\">2047451<\/a>, and <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2030423\">2030423<\/a>)<\/b><\/h3>\n<p>The first effort was to use platform-specific profilers to generate profiles in CI of browsers running the <a href=\"https:\/\/browserbench.org\/Speedometer3.1\/\">Speedometer 3 benchmark<\/a>, the industry-leading benchmark for browser performance. These \u2018native\u2019 profiles provide rich, system-wide insight into how browsers handle Speedometer 3, helping developers analyze and diagnose behaviour. They also provide us with profiles we can use to generate comparison reports for patches. We needed <a href=\"https:\/\/firefox-source-docs.mozilla.org\/testing\/perfdocs\/raptor.html\">Raptor<\/a> to generate native profiles for all of our platforms, namely Windows, macOS, Linux, and Android.<\/p>\n<p>At a high level, the pipeline to generate native profiles is as follows:<\/p>\n<ol>\n<li aria-level=\"1\">Start the system profiler.<\/li>\n<li aria-level=\"1\">Run Speedometer 3 on Firefox or Chromium as Release using Raptor and <a href=\"https:\/\/github.com\/sitespeedio\/browsertime\">Browsertime<\/a>.<\/li>\n<li aria-level=\"1\">Stop the system profiler.<\/li>\n<li aria-level=\"1\">Symbolicate the profiles using <code><a href=\"https:\/\/github.com\/mstange\/samply\">samply<\/a><\/code> and the corresponding build symbols.<\/li>\n<li aria-level=\"1\">Post-process the symbolicated profiles using <a href=\"https:\/\/github.com\/firefox-devtools\/profiler\/blob\/24e597342e8f862bbc0163470ab9fef766514dc1\/src\/node-tools\/profiler-edit.ts#L1-L487\"><code>profiler-edit<\/code><\/a> (formerly <code>symbolicator-cli<\/code>) and create compact and labelled variants of the profiles.<\/li>\n<li aria-level=\"1\">Upload the processed profiles as artifacts.<\/li>\n<\/ol>\n<p>To run tests with native profiling, you can use <code>.\/mach try fuzzy --full<\/code> or <code>.\/mach try perf --full<\/code> and run any test that has the <code>-native-profiling<\/code> suffix.<\/p>\n<p>On Windows, we produced profiles using <code><a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/test\/wpt\/xperf-command-line-reference\">xperf<\/a><\/code>, a tracer that uses the <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/test\/wpt\/event-tracing-for-windows\">Event Tracing for Windows framework<\/a> (ETW) to capture system-level data on applications running on Windows. To use <code>xperf<\/code> with our CI machines, scheduled tasks to run the tracer were configured in Puppet (see our <code><a href=\"https:\/\/github.com\/mozilla-platform-ops\/ronin_puppet\/tree\/b70c4621e47e47100f3ef643620bcd9f5439029a\/modules\/win_hw_profiling\">ronin_puppet<\/a><\/code> repository).<\/p>\n<p>After adding support to Raptor to trigger these <code>xperf<\/code> tasks, we can start a trace and run the Speedometer 3 benchmark on Firefox or Chromium as Release (our custom Chromium build configured with release flags) using Browsertime. The Speedometer 3 benchmark runs 20 times, with each run in a separate browser cycle, to ensure we collect enough samples before stopping the trace.<\/p>\n<p>Once completed, <code>xperf<\/code> provides a user trace and a kernel trace, which are combined into a full trace. We can then use <code>samply<\/code> to convert and symbolicate these traces into Firefox Profiler profiles, complete with markers and JIT information (Figure 1 and Figure 2).<\/p>\n<div id=\"attachment_564\" style=\"width: 3142px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-564\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-564 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile.png\" alt=\"Native profile of Speedometer 3 running on Firefox on Windows\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-native-profile-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-564\" class=\"wp-caption-text\">Figure 1: Native profile of Speedometer 3 running on Firefox on Windows<\/p><\/div>\n<div id=\"attachment_565\" style=\"width: 3142px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-565\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-565 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile.png\" alt=\"Native profile of Speedometer 3 running on Chromium as Release on Windows\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-custom-car-windows-native-profile-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-565\" class=\"wp-caption-text\">Figure 2: Native profile of Speedometer 3 running on Chromium as Release on Windows<\/p><\/div>\n<p>On macOS, we took a similar approach. We used <code>samply<\/code> to collect and symbolicate profiles. After implementing a <a href=\"https:\/\/github.com\/mozilla-firefox\/firefox\/commit\/e782ba253fa2730b7d7a0baec617566f5f5955b2\">workaround<\/a> to allow <code>samply<\/code> to profile across multiple browser cycles and sorting out permission issues in CI, <code>samply<\/code> could profile Speedometer 3 on Firefox with minimal CI configuration and symbolicate the profiles afterwards.<\/p>\n<p>On Linux, we ran <code>perf<\/code> with elevated privileges to collect profiling data system-wide before using <code>samply<\/code> to symbolicate and convert the data into a <a href=\"https:\/\/profiler.firefox.com\/\">Firefox Profiler<\/a> profile. Other than enabling our CI machines to run <code>sudo perf<\/code>, no additional machine configuration or workarounds were needed.<\/p>\n<p>For Android, we took a slightly different approach. We used <code>simpleperf<\/code> to collect profiles on our mobile devices in CI (Samsung A55, Google Pixel 6, and Samsung S24) and <code>samply<\/code> to symbolicate them.<\/p>\n<p>Initially, we wanted to profile 20 Speedometer 3 runs in a single <code>simpleperf<\/code> session, matching our desktop profiling workflow, but this proved unreliable during testing, as the on-device profiling appeared to be resource-intensive and would intermittently fail or crash.<\/p>\n<p>We decided to use our <code>simpleperf<\/code> support introduced in Browsertime in Part 1 to profile the 20 individual test suites that make up a single Speedometer 3 run separately, which proved to be more stable (Figure 3). In the long term, we plan to support profiling complete Speedometer 3 runs with <code>simpleperf<\/code> on Android, bringing the workflow closer to what we currently use for desktop profiling (<a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2032007\">Bug 2032007<\/a>). We will introduce native profiles for Chromium as Release (mobile) on Android in <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2067157\">Bug 2067157<\/a>.<\/p>\n<div id=\"attachment_576\" style=\"width: 3142px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-576\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-576 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile.png\" alt=\"Native profile of the TodoMVC-Vue Speedometer 3 test running on Firefox for Android\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-suite-on-fenix-android-native-profile-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-576\" class=\"wp-caption-text\">Figure 3: Native profile of the <code>TodoMVC-Vue<\/code> Speedometer 3 test running on Fenix (Firefox for Android)<\/p><\/div>\n<p>To make our Speedometer 3 profiles clearer and more helpful, we post-process them with <code>profiler-edit<\/code>, which adds labels (groupings of JS frames) to the profile (Figure 5) and also provides a more compact version (Figure 4) where all runs are placed on the same process track.<\/p>\n<div id=\"attachment_569\" style=\"width: 3142px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-569\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-569 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile.png\" alt=\"Compact Speedometer 3 native profile\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-compact-native-profile-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-569\" class=\"wp-caption-text\">Figure 4: Compact Speedometer 3 native profile<\/p><\/div>\n<div id=\"attachment_570\" style=\"width: 3142px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-570\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-570 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile.png\" alt=\"Labelled Speedometer 3 native profile\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/speedometer-3-on-firefox-windows-labelled-native-profile-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-570\" class=\"wp-caption-text\">Figure 5: Labelled Speedometer 3 native profile<\/p><\/div>\n<p>In CI, we routinely generate Firefox profiles on <a href=\"https:\/\/treeherder.mozilla.org\/jobs?repo=autoland&amp;tier=1%2C2%2C3&amp;searchStr=-native-profiling\">autoland<\/a> (Figure 6) and Chromium as Release profiles on <a href=\"https:\/\/treeherder.mozilla.org\/jobs?repo=mozilla-central&amp;tier=1%2C2%2C3&amp;searchStr=-native-profiling\">mozilla-central<\/a>. These native profiles have already been used to produce Speedometer 3 comparison reports (Figure 7) and investigate incidents in CI. Currently, profiles for Chromium as Release on macOS and Linux are works in progress (see <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2050869\">Bug 2050869<\/a> and <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2065970\">Bug 2065970<\/a>, respectively).<\/p>\n<div id=\"attachment_567\" style=\"width: 3142px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-567\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-567 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1.png\" alt=\"Native profiles running routinely on autoland\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/profiles-on-autoland-1-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-567\" class=\"wp-caption-text\">Figure 6: Native profiles running routinely on autoland<\/p><\/div>\n<div id=\"attachment_568\" style=\"width: 3142px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-568\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-568 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report.png\" alt=\"Comparison reports using native profiles (preview courtesy of Markus Stange)\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/comparsion-report-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-568\" class=\"wp-caption-text\">Figure 7:\u00a0 Comparison reports using native profiles (preview courtesy of <a href=\"https:\/\/github.com\/mstange\">Markus Stange)<\/a><\/p><\/div>\n<h3><b>Modernizing mozgeckoprofiler (Bug <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1992000\">1992000<\/a>)<\/b><\/h3>\n<p>The second effort was to fully modernize symbolication in <code><a href=\"https:\/\/firefox-source-docs.mozilla.org\/mozbase\/mozgeckoprofiler.html\">mozgeckoprofiler<\/a><\/code>, the module responsible for symbolication across four performance testing frameworks: Raptor,\u00a0<a href=\"https:\/\/firefox-source-docs.mozilla.org\/testing\/perfdocs\/talos.html\">Talos<\/a>, <a href=\"https:\/\/firefox-source-docs.mozilla.org\/testing\/xpcshell\/index.html\">XPCShell<\/a>, and <a href=\"https:\/\/firefox-source-docs.mozilla.org\/testing\/mochitest-plain\/index.html\">Mochitest<\/a>. This mainly involved phasing out <a href=\"https:\/\/github.com\/mozilla-services\/eliot\">Eliot<\/a>, an older symbolication API service scheduled to sunset in the near future, and fully transitioning the module\u2019s symbolication workflow to use <code>samply<\/code> and <code>profiler-edit<\/code>.<\/p>\n<p>In Part 1, we added support that allowed Raptor and Talos to symbolicate their profiles using our new approach. This left two main cases that were still handled by Eliot: XPCShell and Mochitest symbolication, and local profile symbolication.<\/p>\n<p>Implementing XPCShell and Mochitest profile symbolication (<a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1998767\">Bug 1998767<\/a>) was relatively straightforward. We followed the same approach used for Talos and Raptor by adding our new symbolication dependencies to XPCShell and Mochitest taskgraph configurations. Since these tests and their profiles (Figure 8) can be generated in parallel, we made sure to perform symbolication only after all profiles had been generated. You can try these jobs by running <code>.\/mach try fuzzy --profiler<\/code> and selecting any XPCShell and\/or Mochitest job (Figure 9).<\/p>\n<div id=\"attachment_572\" style=\"width: 3142px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-572\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-572 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux.png\" alt=\"Symbolicated Mochitest profile\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profile-on-linux-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-572\" class=\"wp-caption-text\">Figure 8:\u00a0 Symbolicated Mochitest profile<\/p><\/div>\n<div id=\"attachment_571\" style=\"width: 3142px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-571\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-571 size-full\" src=\"http:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland.png\" alt=\"Mochitest tests running in CI produce symbolicated profiles\" width=\"3132\" height=\"2122\" srcset=\"https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland.png 3132w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland-580x393.png 580w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland-940x637.png 940w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland-768x520.png 768w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland-1536x1041.png 1536w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland-2048x1388.png 2048w, https:\/\/blog.mozilla.org\/performance\/files\/2026\/08\/mochitest-profiles-on-autoland-1000x678.png 1000w\" sizes=\"(max-width: 3132px) 100vw, 3132px\" \/><p id=\"caption-attachment-571\" class=\"wp-caption-text\">Figure 9:\u00a0 Mochitest tests running in CI produce symbolicated profiles<\/p><\/div>\n<p>Originally, when generating profiles locally from one of our performance frameworks, Eliot was used to symbolicate those profiles. To replace it with our new approach, we needed to bootstrap <code>samply<\/code> and <code>profiler-edit<\/code> onto local developer machines. Now, when you run <code>.\/mach bootstrap<\/code>, the latest builds of <code>samply<\/code> and <code>profiler-edit<\/code> available in CI for your platform are automatically installed under the local <code>.mozbuild\/<\/code> directory. With this change, the use of Eliot in PerfTest has been completely replaced by our new symbolication approach, and Eliot can safely be retired from <code>mozgeckoprofiler<\/code>!<\/p>\n<h3>What&#8217;s Next<\/h3>\n<p>These patches are part of an ongoing effort to make performance profiling easier, more standardized, and more useful for Firefox developers. Here are a few related bugs to keep an eye on:<\/p>\n<ul>\n<li>In <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2050869\">Bug 2050869<\/a>, <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2065970\">Bug 2065970<\/a>, and <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2067157\">Bug 2067157<\/a>, we\u2019ll add Chromium-as-Release profiling support for macOS, Linux, and Android, respectively.<\/li>\n<li>In <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2066906\">Bug 2066906<\/a>, we\u2019ll officially remove Eliot as <code>mozgeckoprofiler<\/code>\u2019s fallback symbolication service.<\/li>\n<li>In <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2032007\">Bug 2032007<\/a>, we\u2019ll add support for profiling full Speedometer 3 runs with <code>simpleperf<\/code>, rather than producing a profile for each test suite.<\/li>\n<li>In <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2036104\">Bug 2036104<\/a>, we&#8217;ll continue developing reports that compare native profiles across patches, making it easier for developers to investigate performance differences and regressions.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Following the symbolication work from Part 1, I undertook two more efforts to improve performance profiles for the Performance team. Native Profiling (Bugs 2030161, 2030166, 2047451, and 2030423) The first &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/performance\/2026\/08\/26\/the-road-to-better-performance-profiles-part-2\/\">Read more<\/a><\/p>\n","protected":false},"author":2032,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[457005,457015,779,457008,265],"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/posts\/561"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/users\/2032"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/comments?post=561"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/posts\/561\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/media?parent=561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/categories?post=561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/performance\/wp-json\/wp\/v2\/tags?post=561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}