在这里就不科普webassemly的作用以及好处了,请自行百度。

那么,怎么通过js的方式在浏览器中运行c程序呢,其中原理如下:

可能另一张图会更详细:

1.安装emscripten

说明文档地址:https://emscripten.org/docs/getting_started/downloads.html

以下步骤为macOs下命令:

step1:克隆项目------------git clone https://github.com/emscripten-core/emsdk.git

step2:进入项目目录--------cd emsdk

step3:安装最新emsdk工具---./emsdk install latest

step4:激活---------------./emsdk activate latest

step5:执行批处理添加环境变量source ./emsdk_env.sh

已经安装好了,看一下版本:

2.写一个c文件(test.c)并转换.wasm

#include <emscripten/emscripten.h>

int EMSCRIPTEN_KEEPALIVE add(int a, int b) {
return a + b;
} int EMSCRIPTEN_KEEPALIVE fibonacci(int n) {
if (n <= ) {
return n;
} else {
return fibonacci(n - ) + fibonacci(n - );
}
}

注意,红字必须,这是相比常规c文件不同的地方。

转换命令:

emcc test.c -Os -s WASM= -s SIDE_MODULE= -o test.wasm

然后你就在相同目录下得到了一个test.wasm文件。

3.通过js引入.wasm并执行其中函数

这里我封装了一个引入.wasm文件的工具函数,代码如下:

const importObj = {
global: {},
env: {
'memory': new WebAssembly.Memory({initial: , maximum: }),
'__memory_base': ,
'tableBase': ,
'table': new WebAssembly.Table({initial: , element: 'anyfunc'}),
abort:alert
}
}; export async function addModule(url,callback){
fetch(url).then(response =>
response.arrayBuffer()
).then(bytes => WebAssembly.instantiate(bytes,importObj)).then(results => {
var instance = results.instance;
var module = instance.exports;
callback(module);
});
}

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>WebAssemblyLearning</title>
</head>
<body> </body> <script type="module">
import {addModule} from './utils/wasm.js';
var num = ;
function getDuring(func,type){
const start = Date.now();
func(num);
console.log(type +'执行斐波那契数列消耗时间:' +(Date.now() - start) + 'ms\n');
};
addModule('./add.wasm',function(module){
getDuring(module._fibonacci,'C程序');
});
function fibonacci(n) {
if (n <= ) {
return n;
} else {
return fibonacci(n - ) + fibonacci(n - );
};
};
console.error('递归次数:'+ num);
getDuring(fibonacci,'JavaScript')
</script> </html>

我们看到,上面通过两种不同的方式执行了一个递归次数为42的斐波那契数列求和函数,对比一下两者的性能:

所以对于追求性能的web程序来说,webassemly将是一个很好的选择。

用js的方式运行c程序之webassemly的更多相关文章

  1. 命令行方式运行yii2程序

    测试环境,yii 2.0.3版本 web访问方式,控制器放在controllers目录下 ,浏览器访问如下地址 http://127.0.0.1/index.php?r=[controller-nam ...

  2. 命令行方式运行hadoop程序

    1,写一个java代码.*.java.(这里从example 拷贝一个过来作为测试) cp src/examples/org/apache/hadoop/examples/WordCount.java ...

  3. Scrapy:运行爬虫程序的方式

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在创建了爬虫程序后,就可以运行爬虫程序了.Scrapy中介绍了几种运行爬虫程序的方式,列举如下: -命令行工具之s ...

  4. Java魔法堂:以Windows服务的形式运行Java程序

    一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...

  5. Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..

    Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid Ap ...

  6. 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式

    连表查询都用Left Join吧   最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...

  7. [SAP ABAP开发技术总结]程序自己以JOB方式运行

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. 【node.js】本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    今天闲来无事想起了node.js,因此到网上下载了一个node.js的安装程序进行安装.其中: 安装程序:node-v0.11.13-x64.msi PC系统:Windows 7 自定义安装路径:D: ...

  9. 使用apache daemon让java程序在unix系统上以服务方式运行

    通过使用apache_commons_daemon,可以让Java程序在unix系统上以服务器的方式运行. 当然,通过wrapper也是可以达到这样的目的,wrapper还可以指定java应用中用到的 ...

随机推荐

  1. Spring入门篇——第7章 Spring对AspectJ的支持

    第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...

  2. iOS 中通过kvc 获取数组的均值、求和、最大最小值等

    NSArray *values = @[@, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @]; NSNumber *avg = [values valu ...

  3. EMS命令

    Tibco EMS 初级使用方法小结 http://blog.csdn.net/bincavin/article/details/8290905

  4. effective c++ (四)

    条款10:令operator=返回一个reference to *this 为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参,这是你为classes实现赋值操作符时应 ...

  5. 【csp模拟赛5】限制 (restrict.cpp)--数学

    自己看吧: 爆搜代码: //春水初涨-春林初盛-春风十里-不如你 //----hzwer // 这是啥子题,读不懂-- //题意有问题 -- #include<iostream> #inc ...

  6. jQuery系列(十一):jQuery的事件绑定和解绑

    1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data ( ...

  7. myeclipse使用SVN分支与合并详解

    此博文主要内容来源地址:https://blog.csdn.net/liuyifeng1920/article/details/53118183,感谢原创博主: 先介绍一下svn的两种开发和发布的规范 ...

  8. mysql的count和sum使用条件表达式

    count函数条件不为null的时候显示结果.即使为false也也会显示结果. 可以是使用if条件或者case when语句.如果条件不为null即需要的结果. 使用count()函数实现条件统计的基 ...

  9. js 给元素绑定回车事件

    经常会看到登录页面输入完账户密码,回车就登录了.实现方法: JQuery方法: $("#focus")为获取id为focus的元素 $("#focus").ke ...

  10. PIMPL(private implementantion)模式(转载)

    前记:请搜索PIMPL(private implementantion)模式和桥接模式, PIMPL是桥接模式的一种典型实现 以下转自:http://blog.csdn.net/nrc_douning ...