• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    Rust-&gt;asm.js&amp;webassembly-WEB的高性能計算

    來源:懂視網 責編:小采 時間:2020-11-27 20:11:12
    文檔

    Rust->asm.js&webassembly-WEB的高性能計算

    Rust->asm.js&webassembly-WEB的高性能計算:我們之前說過,對于javascript來言,前端的世界千變萬化。前幾篇文章給大家說過用Emscripten來編譯C語言然后用到asm.js和WebAssembly,這種方法是可以始前端代碼的執行速度提升很大,但是由于在實際的項目里C語言缺乏很多高級特性,很多功能沒法實現,不利于
    推薦度:
    導讀Rust->asm.js&webassembly-WEB的高性能計算:我們之前說過,對于javascript來言,前端的世界千變萬化。前幾篇文章給大家說過用Emscripten來編譯C語言然后用到asm.js和WebAssembly,這種方法是可以始前端代碼的執行速度提升很大,但是由于在實際的項目里C語言缺乏很多高級特性,很多功能沒法實現,不利于
    我們之前說過,對于javascript來言,前端的世界千變萬化。前幾篇文章給大家說過用Emscripten來編譯C語言然后用到asm.js和WebAssembly,這種方法是可以始前端代碼的執行速度提升很大,但是由于在實際的項目里C語言缺乏很多高級特性,很多功能沒法實現,不利于開發大型的項目,而C++又太過于復雜,所以最終我選擇了用Rust。

    一開始也糾結過要用Go還是Rust或者Swift的,后來發現Go目前還不支持編譯到WebAssembly,Swift按理說應該可以支持的,因為都是用LLVM做的編譯器,不過沒有找到好的資料,好像說要自己編譯LLVM去支持https://stackoverflow.com/questions/46572144/compile-swift-to-webassembly 。另外對Rust的一些特性很是喜歡,聽說Rust很復雜,比較像Scala和Haskell,而偏偏我對Scala還算熟悉,也學過一下Haskell,所以決定嘗試一下Rust。

    https://github.com/ChristianMurphy/compile-to-web 這里可以查看目前能編譯到WebAssembly的語言。

    PS, 話說asm.js和Rust都是Mozilla搞的呢。

    安裝Rust的管理工具rustup

    rustup用于安裝管理Rust的相關工具,包括編譯器rustc、包管理工具cargo等,支持安裝不同版本比如stable, beta, nightly等以及在不同版本之間切換,類似于nvm。

    curl https://sh.rustup.rs -sSf | sh

    安裝Emscripten Rust編譯器

    用rustup安裝最新體驗版(Nightly Version):

    rustup toolchain add nightly
    rustup target add wasm32-unknown-emscripten --toolchain nightly

    安裝cmake

    根據平臺自行選擇:

    brew install cmake # MacOS, brew
    sudo port install cmake # MacOS, MacPorts
    sudo apt-get install cmake # Debian Linux

    安裝 Emscripten

    參考前一篇,或者直接執行下面命令:

    wget https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz
    tar -xvf emsdk-portable.tar.gz
    cd emsdk-portable
    ./emsdk update
    ./emsdk install sdk-incoming-64bit

    這一步花的時間比較久,據說要2個多小時,我是執行完命令就出去跟朋友吃飯了,所以具體時間不知道。

    添加下列路徑到PATH中:

    ~/emsdk-portable
    ~/emsdk-portable/clang/fastcomp/build_incoming_64/bin
    ~/emsdk-portable/emscripten/incoming

    終端執行emcc -v檢查是否安裝成功。

    用Webpack運行Rust

    新建一個Rust/Javascript混合項目:

    cargo new webasm --bin --vcs none
    cd webasm
    npm init
    rustup override set nightly

    安裝Webpack, webpack-dev-server, rust-wasm-loader,

    npm i -D webpack webpack-dev-server rust-wasm-loader

    增加package.json腳本:

    {
     "name": "webasm",
     "version": "1.0.0",
     "description": "",
     "main": "index.js",
     "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
     "compile": "webpack --progress",
     "serve": "http-server",
     "start": "webpack-dev-server --content-base ./build"
     },
     "author": "magicly",
     "license": "ISC",
     "devDependencies": {
     "http-server": "^0.10.0",
     "rust-wasm-loader": "^0.1.2",
     "webpack": "^3.6.0",
     "webpack-dev-server": "^2.8.2"
     }
    }

    在build目錄下新建文件index.html:

    <!DOCTYE html>
    <html>
     
    <head>
     <title>Hello WebAssembly</title>
    </head>
     
    <body>
    < div id="container"></div>
     <script src="/bundle.js"></script>
    </body>
     
    </html>

    配置webpack.config.js:

    module.exports = {
     entry: './src/index.js',
     output: {
     filename: 'bundle.js',
     path: dirname + '/build',
     },
     module: {
     rules: [
     {
     test: /\.rs$/,
     use: {
     loader: 'rust-wasm-loader',
     options: {
     <span>// The path to the webpack output relative to the project root</span>
     path: '',
     release: true <span>// 沒有的話性能巨差,差不多只有1/10</span>
     }
     }
     }
     ]
     },
     <span>// The .wasm 'glue' code generated by Emscripten requires these node builtins,</span>
     <span>// but won't actually use them in a web environment. We tell Webpack to not resolve those</span>
     <span>// require statements since we know we won't need them.</span>
     externals: {
     'fs': true,
     'path': true,
     }
    }

    新建src/main.rs文件,添加我們要從js中調用的函數:

    fn main() {
     println!("Hello, world!");
    }
     
    <span>// Functions that you wish to access from Javascript</span>
    <span>// must be marked as no_mangle</span>
    #[no_mangle]
    pub fn add(a: i32, b: i32) -> i32 {
     return a + b
    }

    新建src/index.js,寫代碼加載WebAssembly模塊:

    const wasm = require('./main.rs')
     
    wasm.initialize({ noExitRuntime: true }).then(module => {
     <span>// Create a Javascript wrapper around our Rust function</span>
     const add = module.cwrap('add', 'number', ['number', 'number'])
     
     console.log('Calling rust functions from javascript!')
     console.log(add(1, 2))
    })

    然后執行npm start,訪問http://localhost:8080/就可以看到調用rust代碼的效果了。并且還支持熱更新哦,直接修改rust代碼,保存,頁面就能看到最新效果。


    測試了一下前一篇里的代碼,直接運行rust優化過的代碼只需要300多ms,這個基本跟C代碼一樣,但是用wasm運行,居然要2.7s左右,不知道是哪里沒有配置好,還是說現在Rust編譯成wasm沒有優化好。Rust支持WebAssembly應該還不是特別成熟,可以關注https://github.com/rust-lang/rust/issues/38804 跟進。

    另外Rust有一個包https://crates.io/crates/webplatform, 可以用來操作DOM,不過我目前用不到(感覺沒啥用)

    以上文章就是我對于WEB的高性能計算的理解,希望能幫助到有需要的朋友,之前也有倆篇文章《asm.js & webassembly-WEB的高性能計算》,《asm.js & webassembly-WEB的高性能計算》,有需要的朋友可以去看一下。

    推薦閱讀:

    WebWorkers-前端的高性能計算

    asm.js & webassembly-WEB的高性能計算

    JavaScript提交表單校驗三種方法分享

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Rust->asm.js&webassembly-WEB的高性能計算

    Rust->asm.js&webassembly-WEB的高性能計算:我們之前說過,對于javascript來言,前端的世界千變萬化。前幾篇文章給大家說過用Emscripten來編譯C語言然后用到asm.js和WebAssembly,這種方法是可以始前端代碼的執行速度提升很大,但是由于在實際的項目里C語言缺乏很多高級特性,很多功能沒法實現,不利于
    推薦度:
    標簽: js 計算 性能
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: A级毛片无码久久精品免费| 精品国偷自产在线视频| 亚洲国产成人精品不卡青青草原| 久热精品视频第一页| 国内精品久久久久| 久久久久99精品成人片试看| 精品国产福利盛宴在线观看| 国产a精品视频| 亚洲中文久久精品无码ww16 | 国产午夜无码精品免费看| 精品国产一区二区三区在线观看 | 久久性精品| 久久99久久99小草精品免视看| 熟妇人妻VA精品中文字幕| 欧美精品www| 国产精品一区二区久久精品无码 | 久久久久久亚洲Av无码精品专口| 精品91自产拍在线观看二区| 亚洲国产精品免费视频| 97久久超碰成人精品网站| 奇米影视7777久久精品| 中文字幕精品亚洲无线码一区应用| 国产精品男男视频一区二区三区 | 亚洲国产精品人久久| 国产精品宾馆在线精品酒店| 久久亚洲私人国产精品vA | 国产亚洲精品xxx| 国产三级久久久精品麻豆三级 | 亚洲精品成人片在线播放| 亚洲国产综合精品一区在线播放| 久久99精品久久久久久齐齐| 国产观看精品一区二区三区| 精品午夜久久福利大片| 国产精品视频分类一区| 国产高清在线精品二区一| 99精品国产在热久久| 国产成人精品免费视| 国产成人无码精品一区二区三区| 国产麻豆精品一区二区三区v视界| 精品无码人妻一区二区三区品| 久久ww精品w免费人成|