使用GPU.js改善JavaScript性能

2021-02-13 IT大咖說

https://gpu.rocks

你是否曾經嘗試過運行複雜的計算,卻發現它需要花費很長時間,並且拖慢了你的進程?

有很多方法可以解決這個問題,例如使用web worker或後臺線程。GPU減輕了CPU的處理負荷,給了CPU更多的空間來處理其他進程。同時,web worker仍然運行在CPU上,但是運行在不同的線程上。

在該初學者指南中,我們將演示如何使用GPU.js執行複雜的數學計算並提高JavaScript應用的性能。

什麼是GPU.js?

GPU.js是一個針對Web和Node.js構建的JavaScript加速庫,用於在圖形處理單元(GPGPU)上進行通用編程,它使你可以將複雜且耗時的計算移交給GPU而不是CPU,以實現更快的計算和操作。還有一個備用選項:在系統上沒有GPU的情況下,這些功能仍將在常規JavaScript引擎上運行。

當你要執行複雜的計算時,實質上是將這種負擔轉移給系統的GPU而不是CPU,從而增加了處理速度和時間。

高性能計算是使用GPU.js的主要優勢之一。如果你想在瀏覽器中進行並行計算,而不了解WebGL,那麼GPU.js是一個適合你的庫。

為什麼要使用GPU.js

為什麼要使用GPU執行複雜的計算的原因不勝枚舉,有太多的原因無法在一篇文章中探討。以下是使用GPU的一些最值得注意的好處。

GPU可用於執行大規模並行GPGPU計算。這是需要異步完成的計算類型

當系統中沒有GPU時,它會優雅地退回到JavaScript

GPU當前在瀏覽器和Node.js上運行,非常適合通過大量計算來加速網站

GPU.js是在考慮JavaScript的情況下構建的,因此這些功能均使用合法的JavaScript語法

如果你認為你的處理器可以勝任,你不需要GPU.js,看看下面這個GPU和CPU運行計算的結果。

如你所見,GPU比CPU快22.97倍。

GPU.js的工作方式

考慮到這種速度水平,JavaScript生態系統仿佛得到了一個可以乘坐的火箭。GPU可以幫助網站更快地加載,特別是必須在首頁上執行複雜計算的網站。你不再需要擔心使用後臺線程和加載器,因為GPU運行計算的速度是普通CPU的22.97倍。

gpu.createKernel 方法創建了一個從JavaScript函數移植過來的GPU加速內核。

與GPU並行運行內核函數會導致更快的計算速度——快1-15倍,這取決於你的硬體。

GPU.js入門

為了展示如何使用GPU.js更快地計算複雜的計算,讓我們快速啟動一個實際的演示。

安裝

sudo apt install mesa-common-dev libxi-dev // using Linux

npm

npm install gpu.js --save
// OR
yarn add gpu.js

在你的Node項目中要導入GPU.js。

import { GPU } from ('gpu.js')

// OR
const { GPU } = require('gpu.js')

const gpu = new GPU();

乘法演示

在下面的示例中,計算是在GPU上並行完成的。

首先,生成大量數據。

const getArrayValues = () => {

// 在此處創建2D arrary
const values = [[], []]

// 將值插入第一個數組
for (let y = 0; y < 600; y++){
values[0].push([])
values[1].push([])

// 將值插入第二個數組
for (let x = 0; x < 600; x++){
values\[0\][y].push(Math.random())
values\[1\][y].push(Math.random())
}
}

// 返回填充數組
return values
}

創建內核(運行在GPU上的函數的另一個詞)。

const gpu = new GPU();

// 使用 `createKernel()` 方法將數組相乘
const multiplyLargeValues = gpu.createKernel(function(a, b) {
let sum = 0;
for (let i = 0; i < 600; i++) {
sum += a\[this.thread.y\][i] * b\[i\][this.thread.x];
}
return sum;
}).setOutput([600, 600])

使用矩陣作為參數調用內核。

const largeArray = getArrayValues()
const out = multiplyLargeValues(largeArray[0], largeArray[1])

輸出

console.log(out\[y\][x]) // 將元素記錄在數組的第x行和第y列
console.log(out\[10\][12]) // 記錄輸出數組第10行和第12列的元素

運行GPU基準測試

你可以按照GitHub上指定的步驟運行基準測試。

npm install @gpujs/benchmark

const benchmark = require('@gpujs/benchmark')

const benchmarks = benchmark.benchmark(options);

options 對象包含可以傳遞給基準的各種配置。

前往GPU.js官方網站查看完整的計算基準,這將幫助你了解使用GPU.js進行複雜計算可以獲得多少速度。

結束

在本教程中,我們詳細探討了GPU.js,分析了它的工作原理,並演示了如何進行並行計算。我們還演示了如何在你的Node.js應用中設置GPU.js。

來源:

https://www.toutiao.com/i6906390310486868487/

「IT大咖說」歡迎廣大技術人員投稿,投稿郵箱:aliang@itdks.com


 IT大咖說  |  關於版權 

由「IT大咖說(ID:itdakashuo)」原創的文章,轉載時請註明作者、出處及微信公眾號。投稿、約稿、轉載請加微信:ITDKS10(備註:投稿),茉莉小姐姐會及時與您聯繫!

感謝您對IT大咖說的熱心支持!

相關焦點

  • JavaScript 的性能優化:加載和執行
    /javascript" src="script2.js"></script>    <script type="text/javascript" src="script3.js"></script>    <link rel="stylesheet" type="text/css" href="styles.css"></head>
  • 不容忽視:MongoDB的JavaScript性能
    【IT168 技術】mongodb使用javascript做shell, mongodb的db.eval可以提供給數據驅動與這種javascript shell類似的js接口。
  • 網頁性能之html css javascript
    1 圖上顯示在引入外部的js文件之後domComplete時間又被延後了,結合上面的renderTree,由於javascript代碼可能會更改css屬性或者是dom結構,所以在形成renderTree之前必須等待javascript解析完成才能接著構建renderTree。
  • 與moment.js整合使用的javascript日期選擇期 - Pikaday
    與moment.js整合使用的javascript日期選擇期 - Pikaday 在線演示Pikaday是一款超輕量級的javascript日期選擇器
  • three.js為何如此奇妙
    WebGL是在瀏覽器中實現三維效果的一套規範,而最初使用WebGL原生的API來寫3D程序是一件非常痛苦的事情,在辛苦的付出下WebGL開源框架出現了,其中three.js就是非常優秀的一個,它掩蓋了很多麻煩的細節,那麼,就讓我們一起來看看,什麼是three.js吧!
  • 使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js
    使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js 在線演示今天我們分享來自guage.js的超棒動畫儀錶板實現,這個類庫使用
  • 用戶體驗超棒且功能強大使用簡單的javascript表單驗證 - Parsley.js
    用戶體驗超棒且功能強大使用簡單的javascript表單驗證 - Parsley.js 大家還記得我們曾經介紹過的表單驗證jquery插件jquery.validationEngine
  • 【JS】1153- 3 種 JavaScript 圖片預加載的方法詳解
    本文將分享三個不同的預加載技術,來增強網站的性能與可用性。方法一:用css和JavaScript實現預加載實現預加載圖片有很多方法,包括使用css、JavaScript及兩者的各種組合。這些技術可根據不同設計場景設計出相應的解決方案,十分高效。
  • 【JS】874- 為何在 JavaScript 中使用頂層 await?
    因為這是一個異步操作(在真實的業務場景中,這裡可能會是一個 fetch 調用或者某個異步任務),我們在 async IIFE 中使用 await 以等待其執行結果。一旦 promise 被 resolve,我們會執行從 library.js 中導入的函數,並將計算得到的結果賦值給兩個變量。這意味著,在 promise 被 resolve 之前,兩個變量都會是 undefined。
  • Day.js - 免費開源、極簡的 javascript 時間日期庫,Moment.js 的優秀替代品
    關於 Day.jsDay.js 是一個極簡的JavaScript 庫,主要為現代瀏覽器解析、驗證、操作和顯示日期和時間而生,通過簡單通用的 api,解決開發中對時間、日期處理的需求。dayjs 官網Day.js 的技術特性僅僅 2kb 左右佔用空間,無論是加載還是執行都是極簡的和 Moment.js 有著相同的 API 和模式,上手無成本所有更改 Day.js 對象的API操作都返回新的實例,防止錯誤和避免長時間的調試會話提供國際化支持支持 TypeScript開發上手體驗javascript
  • 七天學會javascript第一天javascript介紹
    javascript介紹javascript數據類型javascript運算符javascript對象javascript前些年流行的flash已經慢慢的被淘汰,js盛行起來。javascript :客戶端編程。javascript是由客戶端去解釋運行的。怎麼引入javascript 呢?
  • JavaScript能應用在哪些方向?未來前景怎麼樣?
    網頁開發css,javascript,html。而天生異步的處理,讓他在IO方面的性能似乎看起來一點不弱。客戶端開發「不能開發客戶端桌面的語言不是好語言。」通過electron技術,Javascript開發在客戶端開發上也大放異彩,許許多多多編輯器都是採用的js開發的,例如我們耳熟能詳的atom,以及好用到哭的vscode,它們都是使用js開發出來的客戶端軟體,或許性能表現方面不如Java那般強勢,但是隨著個人電腦的性能的提升,哪點效率問題幾乎可以被我們忽視掉。
  • JavaScript 和 Node.js 簡史,前端未來走向何方?
    在硬體方面,Johnny-Five.io 於 2012 年面世;有了它,你第一次可以利用 JS 的簡潔性以及 Node.js 和 NPM 的強大能力來快速開發硬體原型。以前 需要 開發人員使用靜態類型的 OOP 語言的所有領域都受到了影響。
  • 合理使用IIFE優化JS引擎的性能
    })但我們今天要說的不是 IIFE 怎麼用,而是關於它針對 JS 引擎的一處性能優化。}); // 方法二,使用IIFE(function(){    //.})()是的,這兩種寫法完全是等價的,無論怎麼看都不會有什麼區別,但是在一些 JavaScript 引擎中,它們其實性能相差甚遠。
  • 初識javascript,JS的歷史_騰訊新聞
    javascript和H5的關關係 什麼是HTML5? javascript的應用範圍 1.PC端web開發(網站) 2.移動端開發(webApp、混合App)服務端開發(NodeJs) 3.遊戲開發(unity3D-TypeScript,網頁遊戲)在線演示:忍者水果
  • 深入淺出Rhino:Java與JS互操作
    Rhino 使用原型而不是類,這使它比很多腳本語言更適合開發 GUI 應用程式,在考慮性能和風格等因素時更是如此。  Rhino語言特點的優缺點  一方面,作為一種動態類型的、基於原型的腳本語言,Rhino借用了很多JavaScript語法。比如,Rhino不再使用語句結束符( ; ),放寬了變量聲明規則,並且極大地簡化了修改和檢索對象屬性的語法。
  • 玩轉異步 JS :async/await 簡明教程(附視頻下載)
    處理 async 函數中的錯誤不同於 Promise 中的 .catch() 錯誤處理機制,在 async 函數中,我們需要使用 try/catch 結構來恰當的處理錯誤。5. 正確處理多個 await 操作的並行串行學會通過移動 await 關鍵詞的位置實現多個 await 操作串行或者並行,並且用數據證明讓多個異步操作並行的性能優勢。6.
  • JavaScript 性能優化殺手
    引言這篇文檔包含了如何避免使代碼性能遠低於預期的建議.
  • JavaScript 模板引擎 Velocity.js
    Velocity.js是Velocity模板語法的Javascript實現。Velocity模板適用於大量模板使用的場景,支持複雜的邏輯運算,包含基本數據類型、變量賦值和函數等功能。Velocity語法具有很高的容錯能力,類似於html結構的解析,同時語法規則複雜。velocity.js兼容ie6+,chrome等其他瀏覽器。
  • 使用jquery.upload.js實現異步上傳示例代碼
    這篇文章主要介紹了使用jquery.upload.js實現異步上傳的示例代碼,需要的朋友可以參考下1:jsp代碼:導入