Rust編寫廣告攔截器的新引擎,為什么性能提高了69倍?
最近,看到Brave瀏覽器也已經(jīng)趕上了用Rust編程語言編寫或重寫其組件的潮流。其團(tuán)隊(duì)宣布他們已在Rust中重新實(shí)現(xiàn)了其廣告攔截器,該廣告攔截器以前是用C ++編寫的。結(jié)果,廣告攔截器現(xiàn)在的速度是當(dāng)前引擎的69倍。
為什么呢?
新的廣告攔截器實(shí)現(xiàn)可以編譯為本機(jī)代碼,并在本機(jī)瀏覽器內(nèi)核中運(yùn)行。也可以將其打包在獨(dú)立的Node.js模塊中。此重新實(shí)現(xiàn)的版本經(jīng)過本人確認(rèn),可在Brave的 Dev頻道和Nightly頻道上找到。
這種新的廣告攔截算法如何工作?
先前的廣告屏蔽算法是基于以下觀察結(jié)果:大多數(shù)請求都經(jīng)過了傳遞而沒有阻塞。它使用Bloom過濾器數(shù)據(jù)結(jié)構(gòu)來跟蹤可能匹配的請求片段,并排除不匹配的請求。
新的實(shí)現(xiàn)基于uBlock Origin和Ghostery的ad-blocking方法,該方法是令牌化特定于針對URL的添加塊規(guī)則匹配和針對各種規(guī)則進(jìn)行了優(yōu)化的規(guī)則評估。
使該新算法更快的原因在于,它可以快速消除所有可能不匹配搜索請求的規(guī)則。該團(tuán)隊(duì)解釋說:“ 為了以加快過濾器匹配速度的方式組織過濾器,我們觀察到過濾器中包含的任何字母數(shù)字(字母和數(shù)字)子字符串也必須包含在任何匹配的URL中。”
所有這些子字符串都散列為一個數(shù)字,從而產(chǎn)生許多令牌。當(dāng)以相同的方式標(biāo)記URL時,標(biāo)記使匹配變得更加容易和快捷。該團(tuán)隊(duì)進(jìn)一步寫道:“ 即使是散列算法的本質(zhì),多個不同的字符串也可以散列為相同的數(shù)字(散列沖突),但我們?nèi)允褂盟鼈儗⒁?guī)則評估限制為盡可能匹配的規(guī)則。”如果規(guī)則具有特定的主機(jī)名,它也會被標(biāo)記化。如果規(guī)則包含單個域選項(xiàng),則整個域?qū)⒆鳛榱硪粋€令牌散列。
重新實(shí)施可提高性能
為了進(jìn)行性能評估,團(tuán)隊(duì)使用了Ghostery廣告攔截器性能研究發(fā)布的數(shù)據(jù)集,其中包括500個熱門網(wǎng)站上的242,945個請求。針對此數(shù)據(jù)集,使用不同的廣告阻止規(guī)則列表對新廣告阻止程序進(jìn)行了測試,其中包括最大的列表:EasyList和EasyPrivacy組合。
該團(tuán)隊(duì)在adblock-rust 0.1.21庫中執(zhí)行了所有基準(zhǔn)測試。他們使用了具有2.6 GHz Intel Core i7 CPU和32GB RAM的2018年MacBook Pro筆記本電腦。
以下是此新廣告攔截器顯示的性能提升:
- 與現(xiàn)有引擎相比,具有優(yōu)化規(guī)則集的新算法平均快69倍。
- 當(dāng)使用EasyList和EasyPrivacy的流行過濾器列表組合進(jìn)行測試時,它給出了“一流的性能,每個請求平均僅花費(fèi)5.7μs”。
- 它已經(jīng)支持大多數(shù)過濾規(guī)則語法,這些語法已超出原始規(guī)范。這將使團(tuán)隊(duì)能夠更好,更快地處理Web兼容性問題。
- 瀏覽器完成了一些對廣告攔截者有用的工作。這樣可以進(jìn)一步減少開銷,從而使廣告攔截器具有最佳的性能。
- 選擇一門合適的語言節(jié)約又環(huán)保,而重要的是在開始項(xiàng)目之前就要把途中重要部分先做規(guī)劃,才能更高效的完成任務(wù)。