asdf123456
千年狐狸
千年狐狸
  • UID32588
  • 注册日期2010-04-16
  • 最后登录2020-02-17
  • 发帖数1088
  • 经验299枚
  • 威望0点
  • 贡献值50点
  • 好评度10点
  • 社区居民
  • 忠实会员
阅读:8071回复:34

20行代码令Windows版Firefox启动速度快一倍

楼主#
更多 发布于:2011-01-24 10:04
浏览器大战中最重要的就是速度,各路厂商绞尽脑汁提升产品速度,而比较搞笑的是Windows版Firefox,有一名叫Taras Glek的程序员在Bugzilla提供了开发方并没有发现的一个非常简单的方法,这种只有20行代码,几K大的小补丁可以成倍提升Firefox冷启动速度。这种补丁的原理是在程序预读阶段将XUL的chunks从数M变成32k或者更小,在不影响浏览器功能的前提下即可加速。这种加速方法很可能被正式版本的Firefox使用到,不过由于目前还缺乏测试,请您在应用该补丁时小心为上。

查看:Bug 627591 - preload dlls on windows
GOLF-AT
千年狐狸
千年狐狸
  • UID11611
  • 注册日期2006-02-20
  • 最后登录2019-12-30
  • 发帖数3239
  • 经验265枚
  • 威望1点
  • 贡献值260点
  • 好评度59点
  • 社区居民
  • 忠实会员
1楼#
发布于:2011-01-24 10:04
https://bugzilla.mozilla.org/show_bug.cgi?id=627591
这个改进在Windows版已经完成了,之前已经加入到每夜版中了。目前正在对Mac和Linux版做同样的改进,在Mac和Linux版完成前,这个改进暂时也从Windows版中移除了。这个改进,会在 Firefox 6 中加入。

目前 Firefox 4+ 的启动速度,已经比 Firefox 3.* 快很多了。加入这个改进后,期望 Firefox 6.0 的启动速度(包含第一次的冷启动)能赶上 IE9 的启动速度。
bluec
火狐狸
火狐狸
  • UID31820
  • 注册日期2010-01-27
  • 最后登录2017-03-16
  • 发帖数188
  • 经验55枚
  • 威望0点
  • 贡献值28点
  • 好评度2点
  • 社区居民
2楼#
发布于:2011-01-24 10:04
asdf123456:浏览器大战中最重要的就是速度,各路厂商绞尽脑汁提升产品速度,而比较搞笑的是Windows版Firefox,有一名叫Taras Glek的程序员在Bugzilla提供了开发方并没有发现的一个非常简单的方法,这种只有20行代码,几K大的小补丁可以成倍提升Firefox冷启动速度。这种补丁的原理是在程序预读阶段将XUL的chunks从数M变成32k或者更小,在不影响浏览器功能的前提下即可加速。这种加速方法很可能被正式版本的Firefox使用到,不过由于目前还缺乏测试,请您在应用该补丁时小心为上。

查看:Bug 627591 - preload dlls on windows
回到原帖



作者更新了代码并提供了测试build,各路人士测试以后纷纷表示毫无作用

ps:他们那个about:startup为什么在我这里打不开?
idragonet
千年狐狸
千年狐狸
  • UID15658
  • 注册日期2006-11-12
  • 最后登录2017-11-15
  • 发帖数2642
  • 经验162枚
  • 威望1点
  • 贡献值74点
  • 好评度118点
  • 社区居民
3楼#
发布于:2011-01-24 10:04
lord:快点合并到3.6.14啊回到原帖

3.6没戏。
xunleiman
小狐狸
小狐狸
  • UID26827
  • 注册日期2008-10-27
  • 最后登录2012-03-16
  • 发帖数79
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
4楼#
发布于:2011-01-24 10:04
我想纠正的是这个TG就是Mozilla里面专门负责启动加速的小组主力,专门研究I/O好几年了
laintime
火狐狸
火狐狸
  • UID33151
  • 注册日期2010-06-24
  • 最后登录2016-05-04
  • 发帖数157
  • 经验20枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
  • 忠实会员
5楼#
发布于:2011-01-24 10:04
目前还没合并啊
arch7819
火狐狸
火狐狸
  • UID30890
  • 注册日期2009-10-29
  • 最后登录2011-02-19
  • 发帖数153
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
6楼#
发布于:2011-01-24 10:04
传入 FILE_FLAG_SEQUENTIAL_SCAN 参数给 CreateFile
会使 顺序读 获得更好的性能,
也就 为后续的那个 while 打铺垫.
读一遍以后 数据 将被 window 操作系统缓存.
然后以后DLL函数调用隐含的文件读就可以命中缓存,
否则每一个新的函数调用都产生硬IO直到文件被全部覆盖完.

现在写程序比较幸福, 很多东西别人都帮你考虑好了,
需要的只是找找API的参数说明.

当年我自学编程, 那时是DOS时代,
读写文件操作系统提供的INT25H和INT26H功能太弱,
我直接去调用BIOS INT13H中断向量.
结果由于程序BUG把硬盘主引导扇区文件分配表那些给重写了....
lord
非常火狐
非常火狐
  • UID6208
  • 注册日期2005-05-21
  • 最后登录2024-03-27
  • 发帖数634
  • 经验81枚
  • 威望0点
  • 贡献值12点
  • 好评度3点
  • 社区居民
  • 忠实会员
7楼#
发布于:2011-01-24 10:04
快点合并到3.6.14啊
心想事成,人生如梦
dindog
千年狐狸
千年狐狸
  • UID30818
  • 注册日期2009-10-24
  • 最后登录2023-02-03
  • 发帖数1195
  • 经验59枚
  • 威望0点
  • 贡献值26点
  • 好评度10点
8楼#
发布于:2011-01-24 10:04
GOLF-AT:目前依然是Assigned。另外,bugzilla.mozilla.org 网页最上面,刚刚添加了红色文字,说是要做重要的安全更新,可能firefox发现什么严重的安全问题了。回到原帖

可能是之前21号的nightly不能自己升级的问题。

另外想想这代码和4.0还是3.x没关系,应该都会用上的。3.6gj
以前firefox跳个票的时间现在可以发布几个正式版了-_-
GOLF-AT
千年狐狸
千年狐狸
  • UID11611
  • 注册日期2006-02-20
  • 最后登录2019-12-30
  • 发帖数3239
  • 经验265枚
  • 威望1点
  • 贡献值260点
  • 好评度59点
  • 社区居民
  • 忠实会员
9楼#
发布于:2011-01-24 10:04
目前依然是Assigned。另外,bugzilla.mozilla.org 网页最上面,刚刚添加了红色文字,说是要做重要的安全更新,可能firefox发现什么严重的安全问题了。
ndd200
火狐狸
火狐狸
  • UID31135
  • 注册日期2009-11-20
  • 最后登录2015-05-26
  • 发帖数195
  • 经验12枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
10楼#
发布于:2011-01-24 10:04
啊哈,不知道今天的版本合进去没。
dindog
千年狐狸
千年狐狸
  • UID30818
  • 注册日期2009-10-24
  • 最后登录2023-02-03
  • 发帖数1195
  • 经验59枚
  • 威望0点
  • 贡献值26点
  • 好评度10点
11楼#
发布于:2011-01-24 10:04
等landed后大家的测试结果。继续3.6路过
以前firefox跳个票的时间现在可以发布几个正式版了-_-
GOLF-AT
千年狐狸
千年狐狸
  • UID11611
  • 注册日期2006-02-20
  • 最后登录2019-12-30
  • 发帖数3239
  • 经验265枚
  • 威望1点
  • 贡献值260点
  • 好评度59点
  • 社区居民
  • 忠实会员
12楼#
发布于:2011-01-24 10:04



你显然漏看了&& dwBytesRead == sizeof(buf)这段。具体作用上面那个回帖已经解释过了。

没漏看。 sizeof(buf) 就是 64KB,dwBytesRead 是读取的长度,dwBytesRead == sizeof(buf) 就是读取的长度等于 64KB 时。写了16年的C++程序,这么简单的代码,是不会看错的。
bluec
火狐狸
火狐狸
  • UID31820
  • 注册日期2010-01-27
  • 最后登录2017-03-16
  • 发帖数188
  • 经验55枚
  • 威望0点
  • 贡献值28点
  • 好评度2点
  • 社区居民
13楼#
发布于:2011-01-24 10:04

while(ReadFile(fd, buf, sizeof(buf), &dwBytesRead, NULL) && dwBytesRead == sizeof(buf));
这句话的意思是:每次读取64KB,当读取成功且读取的长度为64KB时就继续循环。当到达文件结尾时,读取的长度为不等于64KB,就不做循环了。
所以说,这段代码,就是打开文件,然后每次读取64KB的数据,当读取成功且读取的长度为64KB时,就继续读取,否则跳出循环,关闭文件。



你显然漏看了&& dwBytesRead == sizeof(buf)这段。具体作用上面那个回帖已经解释过了。
fiey
非常火狐
非常火狐
  • UID28955
  • 注册日期2009-05-24
  • 最后登录2013-10-05
  • 发帖数735
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
14楼#
发布于:2011-01-24 10:04
还没有
美国还在凌晨
上一页
游客

返回顶部