」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > JavaScript 和 WebAssembly:速度對決

JavaScript 和 WebAssembly:速度對決

發佈於2024-08-17
瀏覽:485

JavaScript and WebAssembly: A Speed Showdown

WebAssembly (Wasm) 已成為提升 Web 應用程式效能的強大工具。讓我們透過將其與計算階乘的 JavaScript 進行比較並分析其執行速度來探索其潛力。

先決條件:

React 和 WebAssembly

任務:計算階乘

我們將在 JavaScript 和 WebAssembly 中實作階乘函數來比較它們的效率。數字 (n) 的階乘是所有小於或等於 n 的正整數的乘積。

JavaScript 階乘

function factorialJS(n) {
  if (n === 0 || n === 1) {
    return 1;
  }
  return n * factorialJS(n - 1);
}

WebAssembly 階乘 (factorial.c)

#include 

int factorial(int n) {
  if (n == 0 || n == 1) {
    return 1;
  }
  return n * factorial(n - 1);
}

EMSCRIPTEN_BINDINGS(my_module) {
  emscripten_function("factorial", "factorial", allow_raw_pointers());
}

編譯為 WebAssembly
重擊

emcc factorial.c -o factorial.js

JavaScript 包裝器

const Module = {
  // ... other necessary fields
};

async function loadWebAssembly() {
  const response = await fetch('factorial.wasm');
  const buffer = await response.arrayBuffer();
  Module.wasmBinary = new Uint8Array(buffer);
  await Module();
}

function factorialWasm(n) {
  return Module._factorial(n);
}

效能比較
為了測量執行時間,我們將使用 JavaScript 的 Performance.now() 函數。

JavaScript

function measureTime(func, ...args) {
  const start = performance.now();
  const result = func(...args);
  const end = performance.now();
  return { result, time: end - start };
}

// Usage:
console.log("Execution times:\n");

const jsResult = measureTime(factorialJS, 20);
console.log('JavaScript factorial:', jsResult.time, "ms");

// Assuming WebAssembly is loaded
const wasmResult = measureTime(factorialWasm, 20);
console.log('WebAssembly factorial:', wasmResult.time, "ms");

結果

Execution times:

JavaScript factorial: 10 ms
WebAssembly factorial: 2 ms

注意:為了準確比較,必須執行多次測試並計算平均值。另外,請考慮使用更大的輸入值來放大效能差異。

結果與分析
通常,在階乘運算等運算密集型任務中,WebAssembly 的效能優於 JavaScript。

效能提升取決於多個因素

  • 低階操作:WebAssembly 的作業更接近機器碼,從而實現更有效率的執行。
  • 編譯:JavaScript程式碼在執行時被解釋,而WebAssembly則編譯為二進位格式,導致執行速度更快。
  • 記憶體管理:WebAssembly 通常對記憶體管理有更多的控制權,這可以提高效能。 但是,載入和初始化 WebAssembly 模組的開銷可能會影響較小運算的效能。

重要注意事項

  • 開銷:WebAssembly 有一些與載入和初始化模組相關的開銷,這可能會抵消它對於非常簡單的計算的優勢。
  • 複雜度:使用 WebAssembly 會增加開發過程的複雜性。
  • 程式碼大小:WebAssembly 模組可能比等效的 JavaScript 程式碼更大,從而影響初始載入時間。

結論
雖然 WebAssembly 為計算繁重的工作負載提供了顯著的效能優勢,但權衡利弊至關重要。對於簡單的運算,使用 WebAssembly 的開銷可能無法證明效能提升的合理性。然而,對於複雜的演算法或即時應用程序,WebAssembly 可以改變遊戲規則。

版本聲明 本文轉載於:https://dev.to/dinesh_somaraju/javascript-and-webassembly-a-speed-showdown-ac3?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 將 AdoptiumJDK 原始碼載入到 Eclipse IDE 中
    將 AdoptiumJDK 原始碼載入到 Eclipse IDE 中
    AdoptiumJDK 的安裝程式中沒有內建原始程式碼文件,如果您需要透過 Eclipse IDE 檢查如何使用任何本機 JDK 方法,這是不可能的。 依照以下步驟在Eclipse IDE中載入原始碼: 造訪 AdoptiumJDK 官方網站並按所需的 JDK 版本進行過濾,在我的例子中是 11....
    程式設計 發佈於2024-11-06
  • 絕對定位與相對定位:為什麼它們的行為如此不同?
    絕對定位與相對定位:為什麼它們的行為如此不同?
    了解絕對位置與相對位置:寬度、高度等處理網頁上的元素定位時,了解這些概念絕對位置與相對位置的區別至關重要。讓我們深入探討經常引起疑問的四個關鍵點:1。相對寬度與絕對寬度為何相對定位的div會自動佔據100%寬度,而絕對定位的div只佔據內容寬度? 原因是設定位置:absolute 從文件結構的正常流...
    程式設計 發佈於2024-11-06
  • Python、Node js 和 PHP 中用於驗證碼識別的頂層模組
    Python、Node js 和 PHP 中用於驗證碼識別的頂層模組
    在我们的自动化时代,大多数解决方案都可以免费找到,我现在不是在谈论解决数学问题,而是稍微复杂的任务,例如数据解析,和我们的例子一样,还有 recapcha 识别。但如何找到一个好的模块呢?毕竟,随着技术的发展,每个人都得到了它,无论是认真的开发人员还是彻头彻尾的骗子。 我分析了验证码识别模块的市场,...
    程式設計 發佈於2024-11-06
  • 以下是一些標題選項,重點關注問題格式和核心內容:

**選項 1(直接且簡潔):**

* **如何在 PHP 中有效率地循環多維數組?

**選項2
    以下是一些標題選項,重點關注問題格式和核心內容: **選項 1(直接且簡潔):** * **如何在 PHP 中有效率地循環多維數組? **選項2
    在 PHP 中循環多維數組多維數組可能是解析的一個挑戰,特別是在處理不同深度級別和非順序索引時。考慮一個保存事件資訊的數組,其中可以包含多個藝術家及其相應的鏈接,如下所示:array(2) { [1]=> array(3) { ["eventID"]...
    程式設計 發佈於2024-11-06
  • 透過 Linting 提高程式碼品質
    透過 Linting 提高程式碼品質
    Whenever I start a new project, one of the first things I do is put in place a code linter. For the uninitiated, linters analyze your project and call...
    程式設計 發佈於2024-11-06
  • 如何有效執行JavaScript中的回呼函數?
    如何有效執行JavaScript中的回呼函數?
    理解JavaScript 中回呼函數的本質在JavaScript 中,回呼函數提供了一種方便的機制,可以在另一個函數完成後執行一個函數它的執行。雖然概念很簡單,但回調的最佳實作有時可能不清楚。讓我們探討一個簡化的範例:var myCallBackExample = { myFirstFunc...
    程式設計 發佈於2024-11-06
  • Vue 框架簡介
    Vue 框架簡介
    What is Vue? from the Vue website Vue is a "progressive" JavaScript framework for building user interfaces. It works by build...
    程式設計 發佈於2024-11-06
  • 逃離戲劇:為什麼 HydePHP 是您的 WordPress 替代品
    逃離戲劇:為什麼 HydePHP 是您的 WordPress 替代品
    WordPress 戲劇 隨著 WordPress 生態系統面臨前所未有的混亂,許多開發人員和網站所有者正在重新考慮他們的平台選擇。最近 WordPress 共同創辦人 Matt Mullenweg 和 WP Engine 之間的衝突凸顯了 WordPress 社群內的控制、貢獻和...
    程式設計 發佈於2024-11-06
  • Go 中的並發模式;工作池和扇出/扇入
    Go 中的並發模式;工作池和扇出/扇入
    Go 以其卓越的並發模型而聞名,但許多開發人員只專注於 goroutine 和通道。然而,工作池和扇出/扇入等並發模式提供了真正的效率。 本文將介紹這些進階概念,幫助您最大限度地提高 Go 應用程式的吞吐量。 為什麼並發很重要 並發允許程式有效率地執行任務,特別是在處理 I/O ...
    程式設計 發佈於2024-11-06
  • 如何在 C++ 中將單一字元轉換為 std::string?
    如何在 C++ 中將單一字元轉換為 std::string?
    從單字建立字串從單一字元建立字串人們可能會遇到需要將表示為char 資料類型的單字轉換為std:: string。從字串中取得字元很簡單,只需在所需位置索引字串即可。然而,相反的過程需要不同的方法。 要從單字建立std::string,可以使用多種方法:char c = 34; std::strin...
    程式設計 發佈於2024-11-06
  • JavaScript 變數名稱中美元符號的含義是什麼?
    JavaScript 變數名稱中美元符號的含義是什麼?
    JavaScript 變數名稱中美元符號的意義在程式設計領域,命名約定的使用對於增強程式碼至關重要可讀性並遵循最佳實務。在 JavaScript 中,美元符號 ($) 通常會作為變數名稱的前綴出現,特別是引用 jQuery 物件的變數名稱。 美元符號的用途是什麼? 與流行的看法相反,JavaScri...
    程式設計 發佈於2024-11-06
  • 如何重新排列 CSS 網格佈局中的列以實現移動響應?
    如何重新排列 CSS 網格佈局中的列以實現移動響應?
    在CSS 網格佈局中重新排序列在CSS 網格佈局中,有多種技術可以修改列的順序以實現具體佈局。本問題探討了重新排列行動佈局列的可能性,例如將列移到底部,同時在桌面佈局上保持所需的列順序。 解決方案選項:grid-template-areas: 此屬性可讓您在網格內定義命名區域,然後將網格項目指派給這...
    程式設計 發佈於2024-11-06
  • Hacktoberfest 週線上拍賣系統
    Hacktoberfest 週線上拍賣系統
    概述 在 Hacktoberfest 的第三週,我決定為一個較小但有前途的專案做出貢獻:線上拍賣系統。儘管該專案仍處於早期階段,但它已經顯示出成長潛力,而且我看到了幫助改進其程式碼庫的機會。我的任務是透過減少冗餘程式碼和改進整體結構來重構項目,使其更具可維護性和可擴展性。 ...
    程式設計 發佈於2024-11-06
  • 如何使用“exception_ptr”在 C++ 執行緒之間傳播異常?
    如何使用“exception_ptr”在 C++ 執行緒之間傳播異常?
    在C 中的線程之間傳播異常當從主線程調用的函數生成多個線程時,就會出現在C 中的執行緒之間傳播異常的任務用於CPU 密集型工作的工作執行緒。挑戰在於處理工作執行緒上可能發生的異常並將其傳播回主執行緒以進行正確處理。 傳統方法一種常見方法是手動捕獲工作線程上的各種異常,記錄它們的詳細信息,然後在主線程...
    程式設計 發佈於2024-11-06
  • 如何使用 3D CSS 轉換來修復 Firefox 中的鋸齒狀邊緣?
    如何使用 3D CSS 轉換來修復 Firefox 中的鋸齒狀邊緣?
    使用3D CSS 變換時Firefox 中的鋸齒狀邊緣與Chrome 中使用CSS 變換時的鋸齒狀邊緣問題類似,Firefox 在3D 變換中也出現了這個問題。背面可見性作為 Chrome 中的潛在解決方案,在 Firefox 中被證明無效。 解決方案:要在Firefox 中緩解此問題,您可以實施以...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3