电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

測量JavaScript函數(shù)的性能各種方式對比

瀏覽:7日期:2023-09-30 18:15:20
概述

測量執(zhí)行一個函數(shù)所需的時間總是一個很好的辦法,證明某些實現(xiàn)比另一個實現(xiàn)的性能更好。這也是一個很好的方法,可以確保性能沒有在某些改變后受到影響,也可以追蹤瓶頸。

良好的性能有助于獲得良好的用戶體驗,良好的用戶體驗會讓用戶回頭客。一項研究顯示,88%的在線消費者因為性能問題,在用戶體驗不佳后用戶回來的可能性較小。

這就是為什么能夠識別代碼中的瓶頸并測量改進的原因。尤其是在為瀏覽器開發(fā)JavaScript時,要注意到你寫的每一行JavaScript都有可能阻塞DOM,因為它是一種單線程語言。

在這篇文章中,我將解釋你如何測量你的功能的性能,以及如何處理你從它們中得到的結果。

Perfomance.now

performance API通過其功能performance.now()提供對DOMHighResTimeStamp的訪問,該函數(shù)返回自頁面加載以來經(jīng)過的時間(以毫秒為單位),精度最高為5μs(以分數(shù)為單位)。

所以在實踐中,你需要取兩個時間戳,保存在一個變量中,然后讓第二個時間戳減去第一個時間戳。

const t0 = performance.now();for (let i = 0; i < array.length; i++) { // some code}const t1 = performance.now();console.log(t1 - t0, ’milliseconds’);

Chrome輸出

0.6350000001020817 'milliseconds'

Firefox輸出

1 milliseconds

在這里,我們可以看到Firefox中的結果與Chrome完全不同,這是因為Firefox版本從60開始將 performance API 的精度降低到2ms。

performance API提供的功能遠比只返回時間戳要多得多,它能夠測量導航計時、用戶計時或資源計時。請看這篇文章,里面有更詳細的解釋。

但是,對于我們的用例,我們只想測量單個函數(shù)的性能,因此時間戳就足夠了。

那不是和Date.now一樣嗎?

現(xiàn)在你可能會想:我也可以用Date.now來做這個啊。

是的,可以,但是有缺點。

Date.now以毫秒為單位返回從Unix紀元('1970-01-01-01T00:00:00:00Z')開始的時間,并且取決于系統(tǒng)時鐘。這不僅意味著它沒有那么精確,而且也不一定會遞增。WebKit工程師(Tony Gentilcore)的解釋如下:

也許較少考慮到的是,基于系統(tǒng)時間的Date也不是真正的用戶監(jiān)控的理想選擇。大多數(shù)系統(tǒng)都會運行一個守護進程來定期同步時間。通常情況下,時鐘每隔15-20分鐘就會調整幾毫秒。在這個速度下,大約有1%的10秒的時間間隔是不準確的。

Console.time

該API確實易于使用,只需將console.time放在你要測量的代碼前面,將console.timeEnd放在要測量的代碼后面,即可使用相同的string參數(shù)調用該函數(shù),一頁上最多可以同時使用10,000個計時器。

精度與 performance API 相同,但這又取決于瀏覽器。

console.time(’test’);for (let i = 0; i < array.length; i++) { // some code}console.timeEnd(’test’);

這樣會自動生成易于理解的輸出,如下所示:

Chrome輸出

test: 0.766845703125ms

Firefox輸出

test: 2ms - timer ended

這里的輸出又與Performance API非常相似。

console.time的優(yōu)點是易于使用,因為它不需要手動計算兩個時間戳之間的差。

縮短時間精度

如果你在不同的瀏覽器中使用上面提到的API來測量你的函數(shù),你可能會發(fā)現(xiàn)結果會有差異。

這是由于瀏覽器試圖保護用戶免受定時攻擊和指紋攻擊, 如果時間戳太準確,黑客可以使用它來識別用戶。

例如,F(xiàn)irefox之類的瀏覽器試圖通過將精度降低到2ms(版本60)來防止這種情況。

需要注意的事項

現(xiàn)在,你已經(jīng)擁有測量JavaScript函數(shù)的速度所需的工具。但是,最好避免一些陷阱。

分而治之

你注意到在過濾一些結果時有些東西很慢,但是你不知道瓶頸在哪里。

與其胡亂猜測代碼中哪一部分是慢的,不如用上述這些函數(shù)來測量。

要追蹤它,首先把你的console.time語句放在慢的代碼塊周圍。然后測量它們的不同部分是如何執(zhí)行的,如果其中一個部分比其他部分慢,那么就繼續(xù)下去,每次深入到那里,直到找到瓶頸。

這些語句之間的代碼越少,跟蹤不感興趣的內容的可能性就越小。

注意輸入值

在實際應用中,給定函數(shù)的輸入值可能會發(fā)生很大變化。僅針對任意隨機值測量函數(shù)的速度并不能提供我們可以實際使用的任何有價值的數(shù)據(jù)。

確保使用相同的輸入值運行代碼。

多次運行函數(shù)

假設你有一個函數(shù)對一個數(shù)組進行迭代,對每個數(shù)組的值進行一些計算,并返回一個數(shù)組的結果。你想知道是forEach還是簡單的for循環(huán)更有效。

這是函數(shù):

function testForEach(x) { console.time(’test-forEach’); const res = []; x.forEach((value, index) => { res.push(value / 1.2 * 0.1); }); console.timeEnd(’test-forEach’) return res;}function testFor(x) { console.time(’test-for’); const res = []; for (let i = 0; i < x.length; i ++) { res.push(x[i] / 1.2 * 0.1); } console.timeEnd(’test-for’) return res;}

你可以這樣測試它們:

const x = new Array(100000).fill(Math.random());testForEach(x);testFor(x);

如果你在Firefox中運行上述函數(shù),你將獲得類似以下的輸出:

test-forEach: 27ms - timer ended

test-for: 3ms - timer ended

看起來forEach變慢了,對吧?

讓我們看看是否使用相同的輸入兩次運行相同的函數(shù):

testForEach(x);

testForEach(x);

testFor(x);

testFor(x);

test-forEach: 13ms - timer ended

test-forEach: 2ms - timer ended

test-for: 1ms - timer ended

test-for: 3ms - timer ended

如果我們第二次調用forEach測試,它的性能與for循環(huán)一樣好。鑒于初始值較慢,可能無論如何都不值得使用forEach。

...在多個瀏覽器中

如果我們在Chrome中運行上述代碼,結果會突然看起來不同:

test-forEach: 6.156005859375ms

test-forEach: 8.01416015625ms

test-for: 4.371337890625ms

test-for: 4.31298828125ms

這是因為Chrome和Firefox具有不同的JavaScript引擎,并且具有不同類型的性能優(yōu)化。意識到這些差異是一件好事。

在這種情況下,F(xiàn)irefox在相同輸入的情況下,對forEach的使用進行了較好的優(yōu)化。

for在兩個引擎上的性能都更好,因此最好堅持使用for循環(huán)。

這是為什么要在多個引擎中進行測量的一個很好的例子。如果僅使用Chrome進行測量,您可能會得出結論,與for相比,forEach并不那么糟糕。

節(jié)流你的CPU

這些數(shù)值看起來并不高。要知道,你的開發(fā)機器通常比你的網(wǎng)站所使用的普通手機瀏覽速度要快得多。

為了感受一下這個樣子,瀏覽器有一個功能,可以讓你節(jié)流你的CPU性能。

有了這個,那些10或50ms很快就變成了500ms。

測量相對表現(xiàn)

這些原始結果實際上不僅僅取決于你的硬件,還取決于你的CPU和你的JavaScript線程的當前負載。盡量關注你的測量結果的相對改進,因為下次重啟電腦時,這些數(shù)字可能會看起來很不一樣。

總結

在本文中,我們看到了一些JavaScript API,我們可以使用它們來測量性能,以及如何在“真實世界”中使用它們。對于簡單的測量,我發(fā)現(xiàn)使用console.time更容易。

我覺得很多前端開發(fā)人員每天都沒有對性能進行足夠的考慮,即使這對收入有直接影響。

以上就是測量JavaScript函數(shù)的性能各種方式對比的詳細內容,更多關于JavaScript函數(shù)性能資料請關注好吧啦網(wǎng)其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 成都中天自动化控制技术有限公司 | 农业仪器网 - 中国自动化农业仪器信息交流平台| PC阳光板-PC耐力板-阳光板雨棚-耐力板雨棚,厂家定制[优尼科板材] | 广东青藤环境科技有限公司-水质检测| 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 工业风机_环保空调_冷风机_工厂车间厂房通风降温设备旺成服务平台 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 最新范文网_实用的精品范文美文网| 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | EPDM密封胶条-EPDM密封垫片-EPDM生产厂家 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 手板_手板模型制作_cnc手板加工厂-东莞天泓 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 座椅式升降机_无障碍升降平台_残疾人升降平台-南京明顺机械设备有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 金蝶帐无忧|云代账软件|智能财税软件|会计代账公司专用软件 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 |