查询Firefox中所有扩展的体积与内存占用情况的方法
原文出处:http://playpcesor.blogspot.com/2010/11/firefox.html,略有改动,转载请注明原始出处。
我之前在博客中提到Firefox内存占用变少、Firefox 4启动速度变快,甚至拍下了我实际使用的影片来确认Firefox速度时,还是会有朋友反映,他们使用Firefox时遇到了完全相反的情况,例如他们的Firefox动不动内存就飙高到冲破500MB以上,或者他们必须花上超过30秒才能启动Firefox。是什么原因造成这样的使用经验落差呢?
首先我们应该试试看安装一个全新的Firefox,看看启动速度、内存占用是否有问题?如果有,那可能是操作系统本身和Firefox产生了冲突。而如果这时候全新Firefox是正常的,那多半就是扩展造成了性能影响。但是,会是哪一款Firefox扩展拖慢了你的浏览器速度呢?
Firefox似乎没有内置可以方便的查看每个扩展的内存占用的工具,而我搜寻相关工具也暂时无所斩获。但今天看到了一篇文章:Display The Size Of All Firefox Add-Ons, In Firefox,提供一个还算简单的方法,可以让我们快速查看每个扩展安装使用后在硬盘上的大小,从而我们可以发现哪些扩展特别大,并据此追踪这款扩展是否可能造成内存占用变多、开启浏览器速度变慢。
这里必须要说明清楚的是,这只是可能造成影响的一种判断依据,但不是必然的判准。
或许某一款扩展虽然在硬盘上文件体积比较大,是个肥大的怪兽扩展,但是或许它设计得很好,执行起来很快,也不会占用CPU或内存;也或者这个怪兽扩展稍微要多占用一点内存,但因为它真的很有用,所以牺牲一点速度也情有可原的。
因此下面所要介绍的方法,以及所查到的扩展体积数据,只是做为判断的第一步而已,例如我们发现A扩展体积特别肥大,那我们就可以优先试着停用A扩展,比较停用前后Firefox是否有性能的改进,如果确实性能变好,那才能确定这款扩展真的会影响性能。
在理解上述的前提下,让我们回来说明检查扩展安装后体积大小的方法。其实,你也可以直接到Firefox Profile资料夹中查看每个套件资料夹所占用的体积,但因为这里每个扩展都是使用代码表示,要找出哪个代码是哪个套件,还要花上不少时间。
注意:安装Firefox扩展时,你会看到下载文件的体积,但这和扩展安装后的体积不同。
首先启动Firefox浏览器,在菜单栏中依次选择“工具->错误控制台”打开错误控制台,点击“清空”按钮,将控制台中的内容清除后,将下面的代码复制到文本框中,并点击“执行”按钮,即可在打开的新页面中查看每个扩展详细的内存占用情况。
适用于Firefox 3.6.x的源代码:
const CI = Components.interfaces;const CC = Components.classes;function computeSizeRecursive(file){file.QueryInterface(CI.nsIFile);if(file.isSymlink()){return 0;}var size = file.fileSize;if(file.isDirectory()){var files = file.directoryEntries;while(files.hasMoreElements()){size += computeSizeRecursive(files.getNext());}}return size;}var Application = CC["@mozilla.org/fuel/application;1"].getService(CI.fuelIApplication);var addons = Application.extensions.all;var extDir = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);extDir.append("extensions");var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);var addonData = "data:text/html,"+ "<!DOCTYPE html>"+ "<html lang="en">"+ " <head>"+ " <title>"+ " Additional Addon Information"+ " </title>"+ " </head>"+ " <body>"+ " <table>"+ " <tr>"+ " <td>"+ " ID"+ " </td>"+ " <td>"+ " Name"+ " </td>"+ " <td>"+ " Size"+ " </td>"+ " </tr>";addons.forEach(function(addon){var ext = extDir.clone();ext.append(addon.id);addonData += ""+ "<tr>"+ " <td>"+ " " + addon.id+ " </td>"+ " <td>"+ " " + addon.name+ " </td>"+ " <td>"+ " " + ((ext.exists())? computeSizeRecursive(ext): "Unknown")+ " </td>"+ "</tr>";});addonData += ""+ " </table>"+ " </body>"+ "</html>";var windowManager = CC['@mozilla.org/appshell/window-mediator;1'].getService(CI.nsIWindowMediator);var win = windowManager.getMostRecentWindow("navigator:browser");win.open(addonData, "", "");const CI = Components.interfaces;const CC = Components.classes;function computeSizeRecursive(file){file.QueryInterface(CI.nsIFile);if(file.isSymlink()){return 0;}var size = file.fileSize;if(file.isDirectory()){var files = file.directoryEntries;while(files.hasMoreElements()){size += computeSizeRecursive(files.getNext());}}return size;}Components.utils.import("resource://gre/modules/AddonManager.jsm");AddonManager.getAllAddons(function(addons){var addonData = "data:text/html,"+ "<!DOCTYPE html>"+ "<html lang="en">"+ " <head>"+ " <title>"+ " Additional Addon Information"+ " </title>"+ " </head>"+ " <body>"+ " <table>"+ " <tr>"+ " <td>"+ " ID"+ " </td>"+ " <td>"+ " Name"+ " </td>"+ " <td>"+ " Size"+ " </td>"+ " </tr>";addons.forEach(function(addon){addonData += ""+ "<tr>"+ " <td>"+ " " + addon.id+ " </td>"+ " <td>"+ " " + addon.name+ " </td>"+ " <td>"+ " " + ((addon.getResourceURI)? computeSizeRecursive(addon.getResourceURI().QueryInterface(CI.nsIFileURL).file): "Unknown")+ " </td>"+ "</tr>";});addonData += ""+ " </table>"+ " </body>"+ "</html>";var windowManager = CC['@mozilla.org/appshell/window-mediator;1'].getService(CI.nsIWindowMediator);var win = windowManager.getMostRecentWindow("navigator:browser");win.open(addonData, "", "");});