用js的方式运行c程序之webassemly
在这里就不科普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的更多相关文章
- 命令行方式运行yii2程序
测试环境,yii 2.0.3版本 web访问方式,控制器放在controllers目录下 ,浏览器访问如下地址 http://127.0.0.1/index.php?r=[controller-nam ...
- 命令行方式运行hadoop程序
1,写一个java代码.*.java.(这里从example 拷贝一个过来作为测试) cp src/examples/org/apache/hadoop/examples/WordCount.java ...
- Scrapy:运行爬虫程序的方式
Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在创建了爬虫程序后,就可以运行爬虫程序了.Scrapy中介绍了几种运行爬虫程序的方式,列举如下: -命令行工具之s ...
- Java魔法堂:以Windows服务的形式运行Java程序
一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...
- Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..
Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid Ap ...
- 连表查询都用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%我不知道在 ...
- [SAP ABAP开发技术总结]程序自己以JOB方式运行
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 【node.js】本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件。
今天闲来无事想起了node.js,因此到网上下载了一个node.js的安装程序进行安装.其中: 安装程序:node-v0.11.13-x64.msi PC系统:Windows 7 自定义安装路径:D: ...
- 使用apache daemon让java程序在unix系统上以服务方式运行
通过使用apache_commons_daemon,可以让Java程序在unix系统上以服务器的方式运行. 当然,通过wrapper也是可以达到这样的目的,wrapper还可以指定java应用中用到的 ...
随机推荐
- u-boot器件驱动模型(Device&Drivers)之uclass (转)
一.剧情回顾 在上一篇链接器的秘密里面我们讲到我们用一些特殊的宏让链接器帮我们把一些初始化好的结构体列好队并安排在程序的某一个段里面,这里我例举出了三个和我们主题相关段的分布情况,它们大概如下图所示: ...
- p4434 [COCI2017-2018#2] Usmjeri
思路 并查集的好题 考虑到求满足条件限制的方案数,显然观察样例可知结果就是2^x,x是互不影响的边的集合数量 然后考虑如何求互不影响的边的集合数量 可以使用并查集,用i和i+n表示这个点的父亲连向它的 ...
- Centos7静态ip设置(亲测有效)
本文引自:https://www.cnblogs.com/toov5/p/10340395.html,特此鸣谢 最近想测试消息中间件等各类web集群相关技术,这就需要解决linux主机之间互联互通的若 ...
- django缓存--缓存加数据库型
4.缓存+数据库Session 数据库用于做持久化,缓存用于提高效率 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessio ...
- Break 和 Continue 语句
break 语句用于跳出循环. continue 用于跳过循环中的一个迭代. 1.break关键字可以用来退出switch或循环语句 不能在IF语句中使用break和continue 示例:在if ...
- python下vs的使用
part 1:导入pygame包 在python环境下:视图---其他窗口--python环境,选择从pypi安装pygame
- code命令用vscode打开项目代码
1. 打开vscode, 使用Command + shift + p, 输入shelll 选择
- SpringBoot 测试类 @RunWith & @SpringBootTest
@RunWith(SpringRunner.class) @SpringBootTest public class RabbitMqTest { @Autowired RabbitMqSender r ...
- axios中出现两次请求,OPTIONS请求和GET请求
在项目中发现ajax中出现两次请求,OPTIONS请求和GET请求 查看到浏览器NetWork有两次请求,请求url一样: 查找原因是浏览器对简单跨域请求和复杂跨域请求的处理区别. XMLHttpRe ...
- 使用策略模式减少if else
首先要明确的说出策略模式会不可避免导致你的代码类变得很多,如果对应方法逻辑很复杂时可采用,如果逻辑不是很复杂就有点大材小用了. package com.zihexin.application.stra ...