使用console進行性能測試
對于前端開發(fā)人員,在開發(fā)過程中經(jīng)常需要監(jiān)控某些表達式或變量的值,如果使用用 debugger 會顯得過于笨重,最常用的方法是會將值輸出到控制臺上方便調(diào)試。
最常用的語句就是console.log(expression)了。
從早前一道阿里實習生招聘筆試題目入手:
function f1() {
console.time('time span');
}
function f2() {
console.timeEnd('time span');
}
setTimeout(f1, 100);
setTimeout(f2, 200);
function waitForMs(n) {
var now = Date.now();
while (Date.now() - now < n) {
}
}
waitForMs(500);//time span: 0ms
我們先說說關于console的高級操作,最后在一起分析這道題目。
trace
console.trace()用來追蹤函數(shù)的調(diào)用過程。
在大型項目尤其是框架開發(fā)中,函數(shù)的調(diào)用軌跡可以十分復雜,console.trace()方法可以將函數(shù)的被調(diào)用過程清楚地輸出到控制臺上。
function tracer(a) {
console.trace();
return a;
}
function foo(a) {
return bar(a);
}
function bar(a) {
return tracer(a);
}
var a = foo('tracer');

table
使用console將對象以表格呈現(xiàn)
可將傳入的對象,或數(shù)組以表格形式輸出,相比傳統(tǒng)樹形輸出,這種輸出方案更適合內(nèi)部元素排列整齊的對象或數(shù)組,不然可能會出現(xiàn)很多的 undefined。
var people = {
flora: {
name: 'floraLam',
age: '12'
},
john: {
name: 'johnMa',
age: '45'
},
ray:{
name:'rayGuo',
age:'22'
}
};
console.table(people);
火狐的控制臺:

time timeEnd
計算程序的執(zhí)行時間
可以將成對的console.time()和console.timeEnd()之間代碼的運行時間輸出到控制臺上
console.time('計時器');
for (var i = 0; i < 1000; i++) {
for (var j = 0; j < 1000; j++) {}
}
console.timeEnd('計時器');
以上代碼計算console.time('計時器');和console.timeEnd('計時器');之間的代碼塊所需要的事件。

profile
使用console測試程序性能
開發(fā)中,我們常常要評估段代碼或是某個函數(shù)的性能。在函數(shù)中手動打印時間固然可以,但顯得不夠靈活而且有誤差。借助控制臺以及console.profile()方法我們可以很方便地監(jiān)控運行性能。
function parent() {
for (var i = 0; i < 10000; i++) {
childA()
}
}
function childA(j) {
for (var i = 0; i < j; i++) {}
}
console.profile('性能分析');
parent();
console.profileEnd();
上述代碼計算console.profile('性能分析');和console.profileEnd();之間,代碼塊中涉及的函數(shù)的運行效率。

現(xiàn)在說回筆試題目
題目考察應聘者對console.time的了解和js單線程的理解。

console.time()語句和console.timeEnd()語句是用來對程序的執(zhí)行進行計時的。
setTimeout()接受兩個參數(shù),第一個是回調(diào)函數(shù),第二個是推遲執(zhí)行的毫秒數(shù)。setTimeout()只是將事件插入了"任務隊列",必須等到當前代碼(執(zhí)行棧)執(zhí)行完,主線程才會去執(zhí)行它指定的回調(diào)函數(shù)。
因為f1和f2被都setTimeout事先設置的定時器裝到一個事件隊列里面。本來 f1應該在100ms后就要執(zhí)行了,但是因為waitForMs占用了線程,而執(zhí)行JavaScript是單線程的,所以就沒辦法在100ms后執(zhí)行那個 f1,所以需要等500ms等waitForMs執(zhí)行完,然后在執(zhí)行f1和f2,這時候f1和f2就幾乎同時執(zhí)行了。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
- javascript 在firebug調(diào)試時用console.log的方法
- javascript的console.log()用法小結(jié)
- C# Console類的具體用法
- 瀏覽器兼容console對象的簡要解決方案分享
- JavaScript調(diào)試技巧之console.log()詳解
- ie9 提示''console'' 未定義問題的解決方法
- js調(diào)試工具console.log()方法查看js代碼的執(zhí)行情況
- 用console.table()調(diào)試javascript
- js調(diào)試工具Console命令詳解
- JavaScript中的console.trace()函數(shù)介紹
- JavaScript中的console.dir()函數(shù)介紹
- JavaScript中的console.assert()函數(shù)介紹
相關文章
JavaScript通如何過RGraph實現(xiàn)動態(tài)儀表盤
這篇文章主要介紹了JavaScript通如何過RGraph實現(xiàn)動態(tài)儀表盤,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
JavaScript如何實現(xiàn)對數(shù)字保留兩位小數(shù)一位自動補零
本文給大家介紹基于JavaScript如何實現(xiàn)對數(shù)字保留兩位小數(shù)一位自動補零的實例代碼,代碼簡單易懂,感興趣的朋友一起學習吧2015-12-12
underscore之function_動力節(jié)點Java學院整理
因為underscore本來就是為了充分發(fā)揮JavaScript的函數(shù)式編程特性,所以也提供了大量JavaScript本身沒有的高階函數(shù)。本文重點給大家介紹underscore之function知識,感興趣的的朋友一起學習吧2017-07-07

