日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly

發(fā)布時(shí)間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

WebAssembly 是一種新的W3C規(guī)范,無需插件可以在所有現(xiàn)代瀏覽器中實(shí)現(xiàn)近乎原生代碼的性能。同時(shí)由于 WebAssembly 運(yùn)行在輕量級(jí)的沙箱虛擬機(jī)上,在安全、可移植性上比原生進(jìn)程更加具備優(yōu)勢(shì)。同時(shí)資源消耗小、啟動(dòng)速度快的特點(diǎn)也非常適合Serverless的場(chǎng)景。開發(fā)者們開始探索WebAssembly在Serverless的應(yīng)用場(chǎng)景。

WebAssembly 101

WebAssembly (WASM) 是一種可以在Web瀏覽器上運(yùn)行的編譯語(yǔ)言(如C/C++, Rust, Go)的技術(shù)方案。WebAssembly采用二進(jìn)制字節(jié)碼格式,運(yùn)行在基于堆棧的虛擬機(jī)上。2017年2月28日,四大主流瀏覽器Chrome, Firefox, Safari和IE共同宣布 WebAssembly 的最小可行產(chǎn)品(MVP)已經(jīng)完成。

相比JavaScript, 使用WebAssembly可以更高效地在Web瀏覽器中運(yùn)行代碼邏輯。

  • 下載更快:相比類似功能的JavaScript代碼,WebAssembly文件體積更小
  • 解析更快:由于WebAssembly采用二進(jìn)制的中間表示(Intermediate Representation),可以類比JVM的byte code。無需代碼解析過程,可以實(shí)現(xiàn)毫秒級(jí)解碼加載。
  • 執(zhí)行更快:由于 JavaScript 使用動(dòng)態(tài)類型,編譯器很難對(duì)代碼實(shí)現(xiàn)深度優(yōu)化;而WebAssembly采用靜態(tài)類型,編譯器可以高效優(yōu)化;同時(shí)JavaScript采用垃圾回收機(jī)制,而WebAssembly指令更接近機(jī)器碼,需要程序自己控制垃圾回收策略,相比自動(dòng)垃圾回收效率可以更高。通常而言,WASM與JavaScript相比,可以實(shí)現(xiàn)30%性能提升,在復(fù)雜的計(jì)算邏輯中,會(huì)有更高的性能提升。同時(shí)由于減少了語(yǔ)言的動(dòng)態(tài)性和采用靜態(tài)內(nèi)存處理,WebAssembly也更加適合要求可預(yù)測(cè)性能的計(jì)算場(chǎng)景。
  • WebAssembly作為社區(qū)標(biāo)準(zhǔn),具有良好的可移植性。WebAssembly代碼邏輯可以一致地運(yùn)行在不同瀏覽器實(shí)現(xiàn)中,并與JavaScript或?yàn)g覽器對(duì)象進(jìn)行交互調(diào)用。WebAssembly也可以運(yùn)行在非瀏覽器環(huán)境下。此外WebAssembly運(yùn)行在一個(gè)沙箱化的執(zhí)行環(huán)境中,嚴(yán)格遵守瀏覽器安全策略,具有良好的安全性。

    函數(shù)計(jì)算 + WebAssembly 模塊

    Function as a Service(FaaS)是Serverless Computing的重要計(jì)算形態(tài),它提供了事件驅(qū)動(dòng)的編程模型,開發(fā)者只需編寫和上傳事件響應(yīng)代碼,而平臺(tái)則會(huì)負(fù)責(zé)計(jì)算資源的彈性伸縮。

    FaaS主要支持了 Node.js, Python, PHP等解釋型語(yǔ)言,也支持Java, C#等編譯型語(yǔ)言。由于在Node.js 8.0版本以后已經(jīng)內(nèi)置了WebAssembly運(yùn)行時(shí),在主流的FaaS環(huán)境可以通過Node.js實(shí)現(xiàn)調(diào)用WebAssembly模塊的能力,比如在AWS Lambda和Cloudflare Worker。

    在FaaS中利用Node.js調(diào)用WebAssembly 模塊,有以下優(yōu)點(diǎn)

  • 更好的性能 - 尤其是計(jì)算密集型任務(wù)
  • 可移植性 - 為NPM編譯原生代碼是一個(gè)大坑,在FaaS中運(yùn)行的原生代碼則需要針對(duì)目標(biāo)執(zhí)行環(huán)境進(jìn)行構(gòu)建來保障兼容性。比如AWS Lambda中的原生代碼需要依賴Amazon Linux構(gòu)建;阿里云函數(shù)計(jì)算要求二進(jìn)制代碼基于Linux 4.4構(gòu)建。而WebAssembly代碼可以保證在不同的目標(biāo)環(huán)境運(yùn)行有一致的結(jié)果。
  • 多語(yǔ)言支持 - 類似C/C++, Rust, Golang這樣的已有業(yè)務(wù)代碼可以通過編譯成WebAssembly進(jìn)行復(fù)用,比如可以直接將C編寫的圖像處理應(yīng)用運(yùn)行在函數(shù)計(jì)算中,而不受函數(shù)計(jì)算支持的現(xiàn)有運(yùn)行時(shí)的限制。
  • 我們也將做一個(gè)小實(shí)驗(yàn),結(jié)合Rust和AssemblyScript兩種語(yǔ)言在阿里云函數(shù)計(jì)算(FunctionCompute, FC)場(chǎng)景中體驗(yàn)WebAssembly。

    環(huán)境準(zhǔn)備

    • 安裝并配置阿里云函數(shù)計(jì)算的 Serverless 應(yīng)用部署的工具 Fun
    • 下載示例代碼,git clone https://github.com/denverdino/fun-wasm
    • (可選) Rust環(huán)境需要安裝 wasm-pack

    利用Rust構(gòu)建Serverless WebAssembly應(yīng)用

    Rust是Mozilla的一個(gè)新的系統(tǒng)級(jí)編程語(yǔ)言。Mozilla同時(shí)也是WebAssembly技術(shù)最重要的推動(dòng)者,它基于WebAssembly發(fā)布了wasm-bindgen,目的提升 JavaScript 和 Rust 之間的互操作性,可以讓 Rust代碼能夠與JavaScript一起使用。

    本節(jié)參考了Scott Logic的文章,我們將利用wasm-bindgen,在FunctionCompute的Node.js運(yùn)行時(shí)中運(yùn)行基于Rust編譯的WebAssembly代碼。

    $ cd rust-wasm# 一個(gè)簡(jiǎn)單的Rust Hello World應(yīng)用,利用wasm_bindgen聲明與JavaScript代碼的綁定$ cat src/lib.rsuse wasm_bindgen::prelude::*;#[wasm_bindgen]pub fn hello_world() -> String { let mut string = String::new(); string.push_str("Hello, rust-wasm!"); return string;}# 編譯生成WebAssembly和NodeJS綁定$ wasm-pack build --target nodejs# 簡(jiǎn)單的函數(shù)計(jì)算事件響應(yīng)代碼,在NodeJS中調(diào)用WebAssembly邏輯$ cat index.jsconst wasm = require("./pkg/rust_wasm");var getRawBody = require('raw-body')module.exports.handler = function (request, response, context) { // get request body getRawBody(request, function (err, body) { response.setStatusCode(200); response.send(wasm.hello_world()); });}# Serverless應(yīng)用部署模板,利用HTTP Trigger進(jìn)行訪問$ cat template.ymlROSTemplateFormatVersion: '2015-09-01'Transform: 'Aliyun::Serverless-2018-04-03'Resources: fun: Type: 'Aliyun::Serverless::Service' rust-wasm: Type: 'Aliyun::Serverless::Function' Properties: Handler: index.handler CodeUri: ./ Description: 'http trigger demo!' Runtime: nodejs8 Events: http-test: Type: HTTP Properties: AuthType: ANONYMOUS Methods: ['GET', 'POST', 'PUT']

    部署并測(cè)試

    $ fun deploy...Waiting for service fun to be deployed... Waiting for function rust-wasm to be deployed... Waiting for packaging function rust-wasm code... package function rust-wasm code done, the number of files you have packaged is:11 Waiting for HTTP trigger http-test to be deployed... methods: [ 'GET', 'POST', 'PUT' ] url: https://xxxxxxx.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/fun/rust-wasm/ function http-test deploy success function rust-wasm deploy successservice fun deploy success$ curl https://xxxxxxx.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/fun/rust-wasm/Hello, rust-wasm!

    利用AssemblyScript構(gòu)建Serverless WebAssembly應(yīng)用

    AssemblyScript可以將一個(gè) TypeScript 嚴(yán)格的子集編譯成 WebAssembly。AssemblyScript 使用與 TypeScript 相同的語(yǔ)法,但使用了自己的標(biāo)準(zhǔn)庫(kù)來支撐 WebAssembly 的功能,這意味著開發(fā)者不必為了編寫 WebAssembly 而去學(xué)習(xí)新的編程語(yǔ)言,這是一個(gè)巨大的優(yōu)點(diǎn)。而且AssemblyScript是針對(duì)WebAssembly設(shè)計(jì)的語(yǔ)言,它可以生成更加簡(jiǎn)練的WebAssembly代碼,并更加簡(jiǎn)單地與JavaScript集成交互。

    $ cd assemblyscript# 下面是一個(gè)簡(jiǎn)單的Fibonacci數(shù)列的遞歸實(shí)現(xiàn)$ cat assembly/index.ts// The entry file of your WebAssembly module.export function fib(n: i32): i32 { let t: i32; let a: i32 = 0; let b: i32 = 1; for (let i: i32 = 0; i < n; i++) { t = a + b; a = b; b = t; } return b;}# 生成WebAsssembly目標(biāo)代碼$ npm run asbuild# 如下是AssemblyScript自己生成的膠水代碼,用于加載WebAssembly模塊$ cat wasm.jsconst fs = require("fs");const compiled = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm"));const imports = { env: { abort(_msg, _file, line, column) { console.error("abort called at index.ts:" + line + ":" + column); } }};Object.defineProperty(module, "exports

    總結(jié)

    以上是生活随笔為你收集整理的中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。