贊助我以寫出更好的文章javascript
若是您以爲文章對您有幫助,能夠逐個點擊如下連接,相似於Google ads,不須要您付出任何費用,天天均可以來點一次噢,費用將由廣告商承擔,give me a cup of coffee?前端
https://app.codesponsor.io/li...vue
https://app.codesponsor.io/li...java
https://app.codesponsor.io/li...node
https://app.codesponsor.io/li...git
https://app.codesponsor.io/li...github
前端開發中,掌握好瀏覽器的特性進行有針對性的性能調優是一項基本工做,同時,比較不一樣代碼的執行速度也是一項關鍵的工做。算法
好比,當咱們想比較RegExp
的test
方法和String
對象的indexOf
方法查找字符串誰的速度更快的話,js
代碼在不一樣的瀏覽器,不一樣的操做系統環境運行的效率多是不同的,這就是爲何咱們須要對其進行基準測試,在作基準測試方面,咱們可使用Benchmark.js
和使用jsPerf
(一個基於JSLitmus
的基準測試庫)。咱們可使用jsPerf
來分享你的基準測試。npm
github 地址:https://github.com/bestiejs/b...瀏覽器
咱們在不少github
開源項目中,每每都能看到benchmark
文件夾,好比下面這個:
因而Google
之,發現這是用來作基準測試的。因而乎:
首先咱們在系統根目錄下,經過npm intsall benchmark
來安裝benchmark
。該模塊會被寫入node_modules
文件夾中,咱們在test.js
文件中經過require
方法引入該模塊。
將以下代碼寫入test.js
文件,該文件置於系統根目錄下:
var Benchmark = require('benchmark'); var suite = new Benchmark.Suite; // 添加測試 suite.add('RegExp#test', function() { /o/.test('Hello World!'); }) .add('String#indexOf', function() { 'Hello World!'.indexOf('o') > -1; }) // add listeners .on('cycle', function(event) { console.log(String(event.target)); }) .on('complete', function() { console.log('Fastest is ' + this.filter('fastest').pluck('name')); }) // run async .run({ 'async': true });
而後在終端執行node test.js
可見輸出結果以下:
➜ ~ git:(master) ✗ node test.js RegExp#test x 9,847,928 ops/sec ±1.47% (83 runs sampled) String#indexOf x 23,366,017 ops/sec ±0.91% (96 runs sampled) Fastest is String#indexOf
結果最快的就是String
對象的indexOf
方法,其中,Ops/sec
測試結果以每秒鐘執行測試代碼的次數(Ops/sec
)顯示,這個數值越大越好。除了這個結果外,同時會顯示測試過程當中的統計偏差,以及相對最好的慢了多少(%)
var Benchmark = require('benchmark'); var suite = new Benchmark.Suite; var arr1 = function (str) { return [].slice.apply(str); }; var str2 = function (str) { return [].slice.call(str); }; // 添加測試 suite.add('arr1', function() { arr1('test'); }) .add('str2', function() { str2('test'); }) // add listeners .on('cycle', function(event) { console.log(String(event.target)); }) .on('complete', function() { console.log('Fastest is ' + this.filter('fastest').pluck('name')); }) // run async .run({ 'async': true });
輸出以下內容:
arr1 x 596,505 ops/sec ±1.14% (95 runs sampled) str2 x 627,822 ops/sec ±1.27% (92 runs sampled) Fastest is str2
本地使用Benchmark
須要引入以下三個文件:
<script src="lodash.js"></script> <script src="platform.js"></script> <script src="benchmark.js"></script>
jsPerf
提供了一個簡便的方式來建立和共享測試用例,並能夠比較不一樣JavaScript
代碼段的性能。jsPerf
也是基於Benchmark
來運行的。
打開jsPerf
站點:http://jsperf.com/,先將必填的項目填了。其中,slug
是短名稱,會生成一個網址,所以不可與別人的重複。而後在Code snippets to compare
區域填入title
和用於測試的code。最後點擊save test case
完成驗證便可。瀏覽器會自動跳轉到測試頁面
Async
選項框是用來測試一些異步調用的性能的,咱們的代碼沒有使用異步方法,因此沒必要勾選。
點擊「Run tests
」按鈕開始測試兩種算法的性能。建議在運行性能測試以前,關閉無關的瀏覽器頁面,關閉其餘程序,退出沒必要要的後臺進程,以保證結果不受其餘環境的影響。你也能夠經過點擊個別測試用例的名字單獨運行這個例子
點擊該連接查看性能比較:http://jsperf.com/huang
jsPerf
還會統計全部運行過這個測試用例的瀏覽器的比較結果,顯示在下方的Browserscope
區域,能夠經過它直觀地看出各個版本瀏覽器的性能橫向和縱向比較狀況。
能夠看到Firefox
下的執行速度明顯高於Chrome
咱們能夠經過 http://jsperf.com/browse 瀏覽最新提交的250項最新測試用例。咱們也可使用底部的Revisions
來查看不一樣的版本,也就是不一樣瀏覽器的測試用例狀況。
John Resig
在其博文 JavaScript 基準測試的質量 中提到,應該儘可能考慮到每一個測試結果的偏差並去減少它。擴大測試的樣本值,健全的測試執行,都可以起到減小偏差的做用。