通过WasmFiddle平台构建WASM模块

1.WasmFiddle在线平台网址

https://wasdk.github.io/WasmFiddle/

2.编写C++源代码

#define N 10
//定义将从javascript环境导入的函数
extern void print(int* offset,int length);
//声明用于排序的全局数组,在模块初始化时就已在内存中生成
int array[N];
//用于在js环境中获取待排数组首地址的方法
int* getArrayOffset(){
  return array;
}
//交换函数
void swap(int *a,int *b){
  int temp;
  temp=*a;
  *a=*b;
  *b=temp;
  return;
}
//核心快排
void quicksort_core(int array[],int maxlen,int begin,int end){
  int i,j;
  if(begin<end){
    i=begin+1;
    j=end;
    while(i<j){
      if(array[i]>array[begin]){
        swap(&array[i],&array[j]);
        j--;
      }else{
        i++;
      }
    }
    if(array[i]>=array[begin]){
      i--;
    }
    swap(&array[begin],&array[i]);
    quicksort_core(array,maxlen,begin,i);
    quicksort_core(array,maxlen,j,end);
  }
}
//用于在js环境中调用的主排序的方法
void sort(){
  quicksort_core(array,N,0,N-1);
//调用从js环境导入的“打印”方法
  print(array,N);
}

extern是计算机语言中的一个关键字,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。

3.点击Build启动编译

4.下载Wasm模块

5.编写html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的第一个WASM应用</title>
</head>

<body>
<p><span>排序前:</span><span class="sequence-before"></span></p>
<p><span>排序后:</span><span class="sequence-after"></span></p>
<script>
//该方法用于从js环境向指定的共享堆内存段填充数据
function importArrayToBuffer(memory,array,offset) {
    const importBuffer = new Uint32Array(memory.buffer,offset,array.length);
    for(let i=0;i<array.length;i++){
        importBuffer[i] = array[i];
    }
}
//从远程加载一个WASM的模块,并将该模块中的内容转换成二进制数据
let startTime = performance.now();
fetch("/cctest/original.wasm").then(response => response.arrayBuffer()).then((bytes) =>{
    let memory;
//通过浏览器提供的标准WebAssembly接口来编译和初始化一个Wasm模块
    WebAssembly.compile(bytes).then(module => WebAssembly.instantiate(module,{
        env:{
            print (offset,len){
                let strBuffer = new Uint32Array(memory.buffer,offset,len);
                document.querySelector('.sequence-after').innerText=JSON.stringify(Object.values(strBuffer));
            }
        }
    })).then(instance =>{
//输出下载,编译及实例化模块花费的时间
        console.log(performance.now()-startTime);
//取出从Wasm模块中导出的函数
        let exports = instance.exports;
//wasm实例所有信息
        console.log("实例的所有信息");
        console.log(exports);
//获取该Wasm模块实例使用的堆内存对象
        memory=exports.memory;
        let arr =[];
        for(let i=0;i<10;i++){
            arr.push(Math.round(Math.random()*10));
        }
        document.querySelector('.sequence-before').innerText=JSON.stringify(arr);
//将整型数组内的元素依次填充到指定的内存段,即填充到Wasm模块初始化时生成的数组中
        importArrayToBuffer(memory,arr,exports.getArrayOffset());
//调用Wasm模块暴露的排序函数
        exports.sort();
    });
});
</script>
</body>
</html>

6.在IDEA中构建一个Web应用然后启动

推荐js方法二

利用WebAssembly.instantiateStreaming()方法,可直接从系统底层的数据流源来编译并实例化一个Wasm模块

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的第一个WASM应用</title>
</head>

<body>
<p><span>排序前:</span><span class="sequence-before"></span></p>
<p><span>排序后:</span><span class="sequence-after"></span></p>
<script>
function importArrayToBuffer(memory,array,offset) {
    const importBuffer = new Uint32Array(memory.buffer,offset,array.length);
    for(let i=0;i<array.length;i++){
        importBuffer[i] = array[i];
    }
}
let startTime = performance.now();
WebAssembly.instantiateStreaming(fetch("/cctest/original.wasm"),{
    env:{
         print (offset,len){
           let strBuffer = new Uint32Array(memory.buffer,offset,len);
           console.log(strBuffer);
           document.querySelector('.sequence-after').innerText=JSON.stringify(Object.values(strBuffer));
         }
    }
}).then(resultObject =>{
    console.log(performance.now()-startTime);
    //WebAssembly.Module
    console.log(resultObject.module);
    //WebAssembly.Instance
    console.log(resultObject.instance);
    //总和
    console.log(resultObject);
    let exports = resultObject.instance.exports;
    memory=exports.memory;
        let arr =[];
        for(let i=0;i<10;i++){
            arr.push(Math.round(Math.random()*10));
        }
        document.querySelector('.sequence-before').innerText=JSON.stringify(arr);
        importArrayToBuffer(memory,arr,exports.getArrayOffset());
        exports.sort();
});
</script>
</body>
</html>

注意:出现错误
Uncaught (in promise) TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.
因为 从远程服务器加载的Wasm模块文件只有在其HTTP相应结果中被标识为application/wasm类型,才可以被WebAssembly.instantiateStreaming方法正确的编译和处理

注意

解决办法:我这里的情况是这样用的springboot的tomcat,所以修改tomcat的mime类型,多添加一个wasm的类型
//www.greatytc.com/p/275977cda752

关系图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容