chromium中的性能优化工具syzyProf

函数性能分析工具SyzyProf

我先开始介绍SyzyProf。这个工具可以捕获每个线程调用每个函数执行的时间,然后把结果生成一个KCacheGrind能够识别的数据格式文件,然后通过KCacheGrind的展示结果。你就可以知道函数哪个函数执行了次数最多,消耗的时间最多,哪个线程在读写文件,哪个线程在创建窗口界面,而且KCacheGrind以图形的方式显示出函数调用链等信息,非常直观。如图这是我生成CEF自带demo程序的函数调用信息。

其实能够函数性能分析工具已经够多了,比如xperf,AQTime,还有visual studio自带的性能分析功能。但是这些工具都是重量级的,有的需要调试的模式运行目标程序,导致对目标程序运行效率有很大的影响。

相比而言SyzyProf是轻量级的函数性能分析工具,配置简单,对目标程序单运行效率影响小。说起来这么先进,其实SyzyProf的工作原理很简单,就是给编译器加上/profile的开关,然后编译出的pe文件有一些额外的空间,SyzyProf在这些额外的空间里插入指令,修改编译后的pe文件,hook住每个函数的调用,然后记录下函数的执行信息。/profile是vs编译器为性能优化预留的操作空间,vs本身性能优化也用到了这个接口。

不可思议的山寨机(syzygy)

如果chromium的性能优化仅限于SyzyProf那就太普通了,它还有一个杀手锏——syzygy。syzygy利用SyzyProf生成的函数性能分析数据,重新优化函数在pe二进制文件中的分布位置,比如调用的早的函数放到pe文件的前头,函数之间调用频繁紧密的函数放到一起,减少程序运行时的缺页中断错误,从而减少程序的冷启动时间和内存占用。因为syzygy这个词的发音太拗口,我一般称它为山寨机。

听起来有些不可思议,但确实是这样的,这也是为什么chromium浏览器启动的这么快的原因。chromium自己宣称syzygy能够减少了80%的冷启动时间,还有40%的内存占用。

事实上我们用visual studio的编译器生成的pe文件函数的分布相对它在执行时的顺序而言几乎是随机的,这就导致了程序在执行的时候有一些非必要的缺页中断,导致冷启动时间增加。还有不同分页中代码和数据性能很差的访问,导致内存工作集变大。这些正是syzygy优化的地方。

微软自己早就对windows系统某些模块才用了同样的技术对pe文件的函数重分布,比如 ntoskrnl.exe,根本不是编译器默认生成的样子。微软很早就开始了这方面的研究,Binary Technologies ProjectsBinary Transformation Infrastructure。这种性能优化的思路并非chromium首创,但发挥的淋漓尽致的确是chromium。

syzygy做优化的需要改变pe文件,这将导致pe文件跟原来的pdb文件对应不上,不能再使用pdb文件来调试了,为此syzygy改变pe文件的同时也会修改对应的pdb文件。

总结syzygy所用到的技术:

  • 使用编译器提供的/profile接口,在生成的pe文件中插入指令hook住函数。
  • 通过ETW(Event Tracing for Windows)机制获得目标程序的函数性能数据。
  • 根据函数性能数据生成了重排布策略,调用编译器接口去重排布pe文件,调用的DIA(Debug Interface Access)接口去修改pdb文件。

看起来也并不复杂,但是背后分解pe文件,还有编译器生成某些符号不能重排布,底下有很多有脏话累活,这都要试错躺雷才能明白。

原文地址:https://www.cnblogs.com/h2zZhou/p/9855483.html

时间: 2024-10-12 00:49:15

chromium中的性能优化工具syzyProf的相关文章

[Oracle] - 性能优化工具(5) - AWRSQL

在AWR中定位到问题SQL语句后想要了解该SQL statement的详细运行计划,于是就用AWR报告中得到的SQL ID去V$SQL等几个动态性能视图中查询,但发现V$SQL或V$SQL_PLAN视图都已经找不到相应SQL ID的记录,一般来说这些语句已经从shared pool共享池中被替换出去了. 这个时候我们能够尝试使用DBMS_XPLAN.DISPLAY_AWR存储过程来将Oracle Automatic Workload Repository自己主动负载仓库中记录的SQL语句相关信息

[Oracle] - 性能优化工具(3) - ADDM

ADDM 通过检查和分析AWR获取的数据来判断Oracle数据库中可能的问题,并给出优化建议. 获取ADDM的方法如下: @?/rdbms/admin/addmrpt.sql 下面可以看一个例子: --第一步:创建测试用的表 drop table t cascade constraints purge; create table t AS SELECT * FROM dba_objects ; --第二步:快照 exec dbms_workload_repository.create_snaps

Android性能优化——工具篇

Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看一下Android性能优化有哪些得力的工具. TraceView traceview是Android SDK中自带的一个工具,可以对应用中方法调用耗时进行统计分析,是Android性能优化和分析时一个很重要的工具.traceview位于SDK下的tools目录中,使用时可以在cmd窗口运行trace

PHP性能优化工具–xhprof安装

PHP性能优化工具–xhprof安装,这里我先贴出大致的步骤: 1.获取xhprof 2.编译前预处理 3.编译安装 4.配置php.ini 5.查看运行结果 那么下面我们开始安装xhprof工具吧: 1.获取xhprof 可以输入网址直接下载,或者wget 1 2 3 4 #wget http://pecl.php.net/get/xhprof-0.9.4.tgz #tar zxf xhprof-0.9.4.tgz 2.编译前预处理 在编译xhprof之前,先做一下预处理,生成configur

[Oracle] - 性能优化工具(1) - AWR

AWR快照 默认情况下,Oracle每隔一小时会自己主动产生一个快照,保存近期8天的快照. 我们能够通过例如以下语句获得产生快照的时间间隔和保存的天数: [email protected](lx15)> select SNAP_INTERVAL,RETENTION from dba_hist_wr_control; SNAP_INTERVAL RETENTION -------------------------------------------------------------------

使用ThinkPHP开发中MySQL性能优化的最佳21条经验

使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询大多数的MySQ

Linux/Android 性能优化工具 perf

/***************************************************************************** * Linux/Android 性能优化工具 perf * 说明: * 之前一直在找Android上的性能优化工具,但是一直不知道应该找哪方面的关键字, * 今天在看Android源代码目录的时候看到linux-tools-perf,查了点相关资料,最后 * 发现这好像就是我一直在找的查看系统性能的工具,目前没有验证任何东西,先记录 * 下

Windows性能优化工具Process Lasso

你的电脑系统慢吗?卡吗?是不是经常打开一个软件要等半天,或者你电脑比较旧了,一打开多个程序电脑就变得慢,那么试试这款软件吧,绝对不会让你失望 . Process Lasso是一款非常独特神奇的性能优化工具,其核心功能进程平衡器(ProBalance),通过对进程CPU及 I/O 负载监控,超标自动抑制,达到动态平衡系统负载,让你再也没有卡.卡-卡的感觉,适用于WinXP.Vista.Win7.Win8.Win8.1.Win10,Process Lasso 最独特的地方在于可以调整 IO 和 Th

那些Android中的性能优化

性能优化是一个大的范畴,如果有人问你在Android中如何做性能优化的,也许都不知道从哪开始说起. 首先要明白的是,为什么我们的App需要优化,最显而易见的时刻:用户say,什么狗屎,刷这么久都没反应,取关卸载算了. 这跟什么有关,我们先苍白的反驳下,尼玛用户设备老旧网又烂,关我屁事,根本不用优化.可是,老板拍板了,施压给CTO,然后CTO又来找你:Y的今天必须给我想办法优化了,不然不准回家. 好吧,为什么从UI的表象上看,App又卡又慢而且还错乱.我们试着来剖析下吧. 题外话:把minSDK改