※ 引述《t7yang (t7: 我認為這是一種背叛)》之銘言:
: karst10607:我不可能不用adblock plus,只能期待它們做得更好了
除了啟動時adblock plus的js佔用的100MB記憶體消耗,
每個網頁adblock plus會再插入額外的css樣式,
每個iframe會再增加大約4MB的使用量。
mozilla舉了例子,例如 http://techcrunch.com/ 這個網頁,
不開adblock plus的話,Fx使用194MB的記憶體,
開啟adblock plus的話,記憶體消耗會快速增加到417MB。
只是為了隱藏幾個網頁的元素(廣告),竟然必須付出多一倍的代價。
原來擋廣告有一部份原因是為了節省顯示廣告的資源,
結果可能沒省到資源,反而必須付出更多的代價。
mozilla舉的另一個例子,下面這個網頁有上百個iframe,
http://ppt.cc/2P8g
我開啟adblock plus的話,Fx會吃掉超過2GB的記憶體,
而且網頁載入速度變得會非常非常慢,Fx最後完全失去回應。
擋廣告除了adblock plus,還有Bluhell Firewall套件,
http://ppt.cc/rrVC,據說比較輕量,不會消耗太多資源,
不過我沒有用過。
其他還有非瀏覽器套件類,而是對整個系統所有瀏覽器
和程式都有過濾效果的本地代理去廣告軟體,
例如Ad Muncher、Adguard等等。
Ad Muncher有持續維護和更新的中文規則,但是主程式已經很久沒有更新了,
不能過濾IE11,還有不能過濾https。
Adguard可以過濾IE11也可以過濾https,
可是程式佔用的記憶體太誇張,
主程式要100MB,服務也要用掉100MB,加起來200MB,
沒有比adblock plus省到哪裡去。
比較輕量的方案是用Privoxy或Proxomitron,
原理是一個本地的代理伺服器,瀏覽器的網路連線先進入
Privoxy程式,由Privoxy過濾後才傳出傳入,
大部分可以在廣告下載前就先擋掉,而不是瀏覽器載入後再用css隱藏,
可以真正節省網路流量和瀏覽器使用的記憶體,
而且運作效率非常好,網頁載入完全不會有遲鈍感。
Privoxy和Proxomitron的規則寫法比較複雜,
不過有把adblock plus的規則轉成Privoxy規則的script,
雖然有一部份的規則不能很好的轉成Privoxy用的規則,
不過大致上還可以用,也就是幾乎等於使用adblock plus的擋廣告效果,
可是記憶體使用量遠遠比adblock plus低。
如果覺得改寫規則很麻煩,對岸有一個改寫自Privoxy的擋廣告程式
adbyby
http://www.adbyby.com/
目標是高效率和輕量化,可以在多種系統或路由器上配置。
adbyby可以直接使用adblock plus的規則,
到adblock plus的list網頁上
https://adblockplus.org/zh_TW/subscriptions
把規則的txt抓下來複製貼上取代adbyby資料夾下原本的lazy.txt,
並且把lazy.txt設成唯讀避免程式自動更新規則,
或者是把adhook.ini裡面的
[update]
rule=lazy,video
這一行的lazy去掉,讓程式不要自動更新lazy規則。
部分adblock plus規則直接套用會造成誤殺,
不過大部分都能正常過濾,
可以自己定義過濾規則,使用adblock plus的格式寫在user.txt。
adbyby沒有開放程式碼,請小心斟酌使用,此類軟體具有極高度的風險。
Ad Muncher的主程式使用記憶體大概30MB,
adbyby則是14~20MB,使用adblock plus的規則的話,
過濾效果和adblock plus一樣,但是開啟上面那個ifrmae超多的測試網頁,
Fx使用的記憶體從2GB失去回應,降到正常的400~500MB,
而且載入速度變快很多。
不過這些過濾軟體還有一個缺點,那就是不能過濾https,
可是像youtube有登入帳號的話會強制使用https連線,
不能過濾https就會看到影片廣告。
像這種https過濾,可以使用自動代理設定pac來擋掉,
像下面這樣寫一個pac
function FindProxyForURL(url, host) {
if (shExpMatch(host, "ads.youtube.com") ||
shExpMatch(host, "s0.2mdn.net") ||
shExpMatch(host, "s1.2mdn.net") ||
shExpMatch(host, "googleads.g.doubleclick.net") ||
shExpMatch(host, "ad.doubleclick.net") ||
shExpMatch(url, "http*://www.facebook.com/plugins/like_box.php?*") ||
shExpMatch(url, "http*://www.facebook.com/plugins/recommendations_bar.php?*"))
return "PROXY 8.8.8.8:53";
else
return "DIRECT";
}
存成例如adblock.pac,然後在Fx的網路設定選「Proxy自動設定網址」,
file:///C:/firefox/profiles/adblock.pac
就可以擋掉youtube的影片廣告。
這個pac的作用是當連到上面這幾個google的廣告伺服器時,
會經過我們設定的代理伺服器,而這個代理伺服器是無效的,
所以不會成功傳回這些廣告,廣告就被我們擋掉啦。
這種故意設定的無效的代理伺服器稱為blackhole proxy,
可以設定為127.0.0.1:3421等等,各種不存在的代理。
上面是仿照webblock設為8.8.8.8:53,
大家知道這是google的DNS伺服器,從各地連都很快,
而且這個伺服器不支持http連線,所以我們的請求會立刻斷線,
很快就傳回斷線訊息,正好符合我們blackhole proxy的需求!
除了利用google的DNS以外,也可以用blackholeproxy.exe
或類似的程式,在本地建立一個blackhole proxy,
傳回一個1x1的透明gif,取代原本的斷線訊息。
用pac比直接改host的好處是寫法彈性比較大,
添加新規則後重起瀏覽器就可以更新作用。
不過像上面這種一個一個匹配規則的寫法,幾個幾百個是沒關係,
如果規則多到幾千個,整個運作效率就會變得很差。
例如把adblock的list直接轉成pac,多達幾千行的匹配規則,
整個載入速度反而會變慢,這時需要比較好的匹配判斷寫法,
可以參考goagent或shadowsocks的pac寫法,運作效能會比較好。
如果使用Privoxy+adblock plus list的話,就不需要幾千行的pac,
因為大部分廣告都會被adblock plus的規則擋掉,
只有少數https的廣告需要另外寫進pac裡,所以不用擔心這個問題。
使用這類軟體還有其他缺點,例如可能ipv6無法正常連線等等,
如果系統記憶體不缺乏的話,其實讓adblock多吃一點記憶體是無妨,
只是運作效率還是有很大的進步空間,只能期待adblock plus的開發團隊
和Mozilla攜手合作,一起改善adblock plus的執行效率和消耗的資源。