當我之前在部落格中提到
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資料夾中查看每個套件資料夾所佔用的體積,但因為這裡每個套件都是使用代碼表示,要找出哪個代碼是哪個套件,還要花上不少時間。
P.S.安裝Firefox套件時,你會看到下載檔案的體積,但這和套件安裝後的體積不同。
而今天要介紹的方法相對來說就快速許多,
首先,我們利用〔Ctrl〕+〔Shift〕+〔J〕打開「錯誤主控台」。 接著切換到〔錯誤〕頁面,在「程式碼」欄位,填入下面適用於Firefox 3.6.x或Firefox 4的程式碼,接著按下〔執行〕。然後就會在彈出視窗中看到每個擴充套件的體積大小清單了。
來源:Display The Size Of All Firefox Add-Ons, In 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, "", "");
Firefox 4適用程式碼: 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, "", ""); });
下面這些數據的單位是Byte,首先看到下圖中是我常用Firefox中安裝的一些擴充套件,其中以
Firefox Sync、
WOT這兩款套件相對體積龐大(是其它套件的好幾倍)。
然後下圖是一個全新的Firefox,我依序安裝Firefox套件網站上最熱門的前幾名套件,然後我們可以看到相對體積龐大的有Firebug、NoScript、Adblock Plus、Tab Mix Plus、Download Statusbar。
我慣用的Firefox中雖然安裝比較多套件,但套件總體積只有:7,058,871 Byte。而安裝熱門套件的後面這款全新Firefox,雖然裝的套件比較少,但幾乎都相對肥大,所以總體積有:12,460,976 Byte。
當然,從這裡我們只是發現了一個基本事實:
許多知名的、很多人安裝的擴充套件,其實體積相對較肥大,而且有些肥大很多(但換個角度來說,正是因為它們功能豐富、強大,所以體積也較大)。 那麼接下來我們要做的,就是實際去檢查這些套件在執行後,是不是真的對記憶體佔用、網路瀏覽效能有所影響了。而以我自己的使用經驗來看,Firebug、NoScript、Adblock Plus是真的都會影響效能。
只是,重點還是在於:如此強大功能的套件在其它瀏覽器上是看不到的!(即使有相似的功能也無法如此強大)所以假如我們的硬體足以應付,那麼因為需要而安裝這些套件其實是合理的選擇,就算真的犧牲一點點效能我想也是划得來的,
只是用戶要對擴充套件與Firefox瀏覽器間的影響有正確認知即可。