JS幾種變數交換方式以及性能分析對比

来源:http://www.cnblogs.com/dailc/archive/2016/11/24/6099662.html
-Advertisement-
Play Games

原文 原文是自己博客上發佈的 "JS幾種變數交換方式以及性能分析對比" 前言 “兩個變數之間的值得交換”,這是一個經典的話題,現在也有了很多的成熟解決方案,本文主要是列舉幾種常用的方案,進行大量計算並分析對比。 起由 最近做某個項目時,其中有一個需求是交換數組中的兩個元素。當時使用的方法是: arr ...


原文

原文是自己博客上發佈的
JS幾種變數交換方式以及性能分析對比

前言

“兩個變數之間的值得交換”,這是一個經典的話題,現在也有了很多的成熟解決方案,本文主要是列舉幾種常用的方案,進行大量計算並分析對比。

起由

最近做某個項目時,其中有一個需求是交換數組中的兩個元素。當時使用的方法是:

arr = [item0,item1,...,itemN];
//最初使用這段代碼來交換第0個和第K(k<N)個元素
arr[0] = arr.splice(k, 1, arr[0])[0];

當時覺得這種方法很優雅,高逼格。。。

後來,業餘時間又拿這個研究下了,順帶自己寫了個分析工具,和普通方式進行對比。

結果,大大的出乎我的意料,這種方式的效率比我想象的要低的多。以下是其中一個測試結果的圖

於是,基於這點,又研究了下其它的幾種數值交換的方式,一起整合進入了分析工具中,才有了本文的這次總結。

JS變數交換的幾種方式

其實關於JS的變數交換,使用最廣泛的幾種方式基本已經是前端人員必備的技能了,本文正好藉此分析研究的契機,列舉了本次分析中用到的幾種交換方式:

第一種:普通臨時變數交換方式

適用性: 適用於所有類型
代碼如下:

tmp = a;
a = b;
b = tmp; 

簡要說明:
這是用到的最廣泛的一種方式,經實戰測試分析,性能也很高

(在JS中,這種方式效率確實很高,而且就算是其它語言中,只要tmp變數提前創建,性能也不會很低,反而是一些雜技派和少數派性能方面很低)

基本上可以說: 經典的才是最優雅的

第二種:利用一個新的對象來進行數據交換

適用性: 適用於所有類型
代碼如下:

a = {a : b, b : a};
b = a.b
;a = a.a;

簡要說明:
這種方式在實戰中應用的很少

第三種:利用一個新的數組來進行數據交換

適用性: 適用於所有類型
代碼如下:

a = [b, b=a][0];

簡要說明:
這種方式在各大論壇中都有看到有人使用,但經測試實際性能並不高

第四種:利用數組交換變數(需EJS支持)

適用性: 適用於所有類型
代碼如下:

`[a, b] = [b, a];

簡要說明:
這也是在ES6出來後看到有人用的,實際在現有的瀏覽器中測試,性能很低

第五種:利用try catch交換

適用性: 適用於所有類型
代碼如下:

a=(function(){;
    try{return b}
    finally{b=a}}
)();

簡要說明:
這種方法應該是基本沒人使用的,也沒有什麼實用性,而且性能也是屬於在各種方法中墊底的

第六種:異或操作交換變數第一種方式

適用性: 適用於數字或字元串
代碼如下:

a = (b = (a ^= b) ^ b) ^ a;

簡要說明:
異或方法在數字或字元串時用到的比較普遍,而且性能也不低

第七種:異或操作交換變數第二種方式

適用性: 適用於數字或字元串
代碼如下:

a ^=b;
b ^=a;
a ^=b;

簡要說明:
異或方法在數字或字元串時用到的比較普遍,而且性能也不低

第八種:數字之間的加減運算來實現,第一種加減方式

適用性: 僅適用於數字
代碼如下:

a = a + b;
b = a - b; 
a = a - b; 

簡要說明:
這種用法在只用於數字間的交換時,性能也不弱

第九種:數字之間的加減運算來實現,第一種加減方式

適用性: 僅適用於數字
代碼如下:

a = b -a +(b = a);

簡要說明:
這種用法在只用於數字間的交換時,性能也不弱

第十種:利用eval計算

適用性: 僅適用於數字和字元串
代碼如下:

eval("a="+b+";b="+a);

簡要說明:
這種方式僅用於研究,實戰慎用

這種模式執行一萬次耗時等於其它執行一億次...

第十一種:數組中,利用splice交換兩個元素的位置

適用性: 僅適用於數組元素
代碼如下:

arr[0] = arr.splice(2, 1, arr[0])[0];

簡要說明:
這種方式看起來挺優雅的,但實際上性能遠遠比不上臨時變數那種

各種交換方式的性能對比

上述列舉了幾種方式都有一一做過對比分析,基本上可以得出的結論是:

還是老老實實的用回臨時變數交換吧,經典,優雅,而且保證不會出什麼么蛾子

性能對比截圖

分析結果1

以下截圖中的數據是,在chrome中運行了一億次後得出的結論(每次運行100萬次,一共100個迴圈,得到的分析結果)

可以看出,tmp變數交換最快,try catch最慢

分析結果2

以下截圖數據是,在chrome (支持es6)中運行了100萬次後得出的結論(每次運行1萬次,一共100個迴圈,得到的分析結果)


可以看出,eval最慢,splice性能較低,tmp變數交換很穩定

分析工具示例Demo

如下demo中可以使用分析工具進行 JS變數交換方式分析對比

JS幾種數值交換方式分析比較

參考

Exchange Variables Gracefully


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C語言是我們大多數人的編程入門語言,對其也再熟悉不過了,不過很多初學者在學習的過程中難免會出現迷茫,比如:不知道C語言可以開發哪些項目,可以應用在哪些實際的開發中……,這些迷茫也導致了我們在學習的過程中不知道如何學、學什麼,所以,總結這個列表,希望對C語言初學者可以有所幫助~ C語言可以做什麼? 從 ...
  • 什麼是Hibernate? Hibernate是基於ORM(O:對象,R:關係,M:映射)映射的持久層框架,是一個封裝JDBC的輕量級框架,主要實現了對資料庫的CUPD操作。 註:CRUD是指在做計算處理時的增加(Create)、查詢(Retrieve)(重新得到數據)、更新(Update)和刪除( ...
  • 學習這個東西挺奇怪的,時間一長就容易忘記,或者記不清楚。今天看到一些UML圖的關係,發現有些出入了,索性就寫下來,以後再忘記的時候過來看看。 在UML的類圖中,常見的有以下幾種關係: 繼承(Generalization), 實現(Realization), 關聯(Association), 依賴(D ...
  • 今天講單例設計模式,這種設計模式和工廠模式一樣,用的非常非常多,同時單例模式比較容易的一種設計模式。 一、什麼是單例設計模式 單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。 二、單例模式的技巧 三、單例模式的應用場景 資料庫設計,我們發送一 ...
  • 設計模式;一個程式員對設計模式的理解:“不懂”為什麼要把很簡單的東西搞得那麼複雜。後來隨著軟體開發經驗的增加才開始明白我所看到的“複雜”恰恰就是設計模式的精髓所在,我所理解的“簡單”就是一把鑰匙開一把鎖的模式,目的僅僅是著眼於解決現在的問題,而設計模式的“複雜”就在於它是要構造一個“萬能鑰匙”,目的 ...
  • 原網站:C# Entity Framework併發處理 在軟體開發過程中,併發控制是確保及時糾正由併發操作導致的錯誤的一種機制。從 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都為併發控制提供好良好的支持方案。併發處理方式一般分 ...
  • 回到目錄 很久就想寫一套屬於自己的消息隊列組件,前段時候看了湯雪華同學的EQueue,感覺還是不錯的,他也是看了rabbitMQ之後寫的Equeue,在設計上與前者有類似的地方,而大叔這次準備寫一個LindQueue,當前整體架構都差不多,無非是生產者,管道,消費者三個角色,而核心部分就是管道Bro ...
  • 在經典的Java面向對象語言中,可以用關鍵字interface來定義介面,用implement來實現介面,而JavaScript雖然也是面向對象語言,但是它並沒有內置這些,不過由於JavaScript的靈活性,我們可以通過模擬來實現,方法是使用一個輔助類和輔助函數來協助完成這一過程。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...