簡體   English   中英

用於處理 javascript 中相當大的數組的函數式或命令式代碼?

[英]Functional or Imperative code for dealing with considerably large array in javascript?

在 javascript 中使用數組時,您會選擇什么,函數式方式還是命令式方式,而命令式比函數式更快。 我感到很困惑。

這是我使用普通 for 循環和一對映射和過濾器運行的 jsPerf 測試

我的兩分錢:總的來說,我更喜歡使用數組的函數式方法,因為我發現函數式方法更靈活,更易於閱讀和維護。

特別是在性能不重要或沒有明顯差異的情況下。

假設函數方式需要 50 倍於常規循環的時間。 如果常規循環需要 1 毫秒,則意味着函數需要 50 毫秒,並且在大多數情況下仍然可以。

因此,在這種情況下,我不會犧牲我的代碼進行優化,尤其是在應用程序和/或共享存儲庫中。

但是,當我編寫視頻游戲時,我通常會嘗試進行常規循環。 既是出於性能原因,也是因為在這種情況下,您通常必須處理字節數組,而我發現函數式編程不太靈活。

說:在JS中,數組方法的問題在於它們不懶惰。 這意味着,在您的情況下,您要對數組進行兩次迭代,因為您調用了兩個方法( filtermap )。 在其他語言(例如 Rust)中,這種方法是“懶惰的”,並且在您實際使用迭代器執行某些操作之前不會調用它們:與常規循環相比,這減少了您可能遇到的性能問題。

JS 中有一些庫支持惰性方法(例如 observable 上的 RxJS),因此如果您正在尋找中間的東西(在仍然使用函數式方法的同時節省一點性能),您可能需要檢查這些庫。

Array.map和 for 循環之間的區別在於 for 循環只不過是迭代數組的值。 在循環體中,您可以對這些值執行任何操作。 Array.map作用不止Array.map 它遍歷數組,創建一個新數組,其中包含對每個值調用的回調值。

在我看來,您應該在Array.map盡可能多地使用 for 循環,雖然它要快得多。 當您想在原始數組中創建一個具有變異值的新數組時,請使用Array.map

基本上這些是相同的:

循環:

const array = [1, 2, 3];
const mutatedArray = [];

for(let i = 0; i < array.length; i++) {
    let mutatedValue = array[i] * 2;

    mutatedArray.push(mutatedValue);
}

數組.map:

const array = [1, 2, 3];
const mutatedArray = array.map(x => x * 2);

寫起來更干凈、更快捷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM