asm.js的陷阱1
泰坦尼克号行驶的前方现在有一座冰山需要撞,我们需要弄清楚冰山下面究竟是什么?以及杰克的心里阴影的面积。
浮点数计算:并不是像官方文档上说的那样,这个交叉编译技术的最终生成的js是最优解,我说不要靠编译器,因为编译器
有时候就像一个傻瓜。
1 一个简单的浮点数运算的例子
17 //entry point 18 int webMain () {28 long double sum = 0; 29 long double i = 0; 30 for( sum = 0; i < 100000000; i ++ ) { 31 sum += i; 32 } 33 console.log(JSON.stringify(sum));35 }
通过clang 编译后生成的js代码
1 "use strict" 3 function h(){ 4 var d=0; 5 var a=0; 6 while(1){ 7 var d=(d+(+(a>>0))); 8 var a=((a>>0)+(1>>0)>>0); 9 if(((a>>0)<(100000000>>0))){ 10 }else{ 11 break; 12 } 13 } 14 var b=JSON.stringify(d); 15 var b=String(b); 16 console.log(b); 17 } 18 h()
至于这个是不是最优解呢?首先精度是没有丢失但是在while循环里的一个相加并赋值的操作,被无故的加入了一个if判断, 我们都知道,赋值是最快
的,加入分支判断后,流程会跳转如果有寄存器传送语言阶段解释会多执行一些计算和偏移,多少会对效率有些影响。
但是我不提倡推测,我们要测试。 不推测,要测试。
运行结果:均值
好我们用js手写一个同样的代码。
1 console.time("e"); 2 3 function main() { 4 var len = 100000000; 5 var sum = 0; 6 var i = 0; 7 for(; i < len; i ++ ){ 8 sum += i; 9 } 10 console.log(sum); 11 } 12 13 main(); 14 console.timeEnd("e");
结果:均值
那么我们写一个工具来转化数字到字符串,看看生成代码的体积。
1 #ifndef IDE_ENV 2 #define IDE_ENV 1 3 #endif 4 5 6 #if IDE_ENV == 1 7 #include <client.h> 8 #include <clientlib.h> 9 #define [[jsexport]] "" 10 #else 11 #endif 12 13 #define JS_RET_VALUE double 14 #define JS_OBJECT void * 15 #define LIB [[jsexport]] 16 #define HOOK class 17 #define K 1000 18 #define M 1000000 19 #define B 1000000000 20 21 using namespace client; 22 class LIB NumbericFormat { 23 private: 24 25 double baseCount ; 26 double bnum = 0.0; 27 double mnum = 0.0; 28 double knum = 0.0; 29 double count= 0.0; 30 String * innnerStringb; 31 32 public: 33 NumbericFormat(){} 34 void reset(){ 35 this->bnum = 0.0; 36 this->mnum = 0.0; 37 this->knum = 0.0; 38 this->count= 0.0; 39 } 40 41 String * num2format(double n) { 42 reset(); 43 if( n == 0 ) return new String(); 44 this->baseCount = n; 45 if(this->baseCount >= B) { 46 this->bnum = double(this->baseCount / B); 47 this->baseCount -= this->bnum * B; 48 } 49 if(this->baseCount >= M){ 50 this->mnum = double( this->baseCount / M); 51 this->baseCount -= this->mnum * M; 52 } 53 if (this->baseCount > K ){ 54 this->knum = double(this->baseCount / K); 55 this->baseCount -= this->knum * K; 56 } 57 this->count = this->baseCount; 58 this->baseCount = n; 59 return desciption(); 60 } 61 String * toString(double e){ 62 return JSON.stringify(e); 63 } 64 String * desciption () { 65 double k,m,b,c,e = 0; 66 k = this->knum ; 67 m = this->mnum ; 68 b = this->bnum ; 69 c = this->count; 70 if(k < 10 && c > 0) { 71 if ( k < 5 ) { 72 c = ( k * K )+ c; 73 k = 0; 74 e = (c >= 1000?1:0); 75 } else { 76 k =k + (c/K); 77 c = 0; 78 } 79 } 80 if(k >= 10 && c > 0) { 81 k =k + (c/K); 82 c = 0; 83 } 84 if( m > 0) { 85 if(m < 10){ 86 m = m + ((int(k)%int(K))/K); 87 } else { 88 m = m + ((int(k)%int(K))/K); 89 } 90 k = 0; 91 c = 0; 92 } 93 if (b > 0 && b < 10 ) { 94 b = b + (m/1000); 95 m = 0; 96 k = 0; 97 c = 0; 98 } 99 String * ret = new String(); 100 if(b > 0){ 101 ret=ret->concat(toString(b)); 102 ret=ret->concat(String("b")); 103 } else { 104 ret=ret->concat(new String()); 105 } 106 if(m >0 ){ 107 ret=ret->concat(toString(m)); 108 ret=ret->concat(String("m")); 109 }else{ 110 ret=ret->concat(new String()); 111 } 112 if(k > 0){ 113 ret= ret->concat(toString(k)); 114 ret=ret->concat(String("k")); 115 }else{ 116 ret=ret->concat(new String()); 117 } 118 if(c > 0) ret->concat(entrance(c,e)); 119 return ret; 120 } 121 String* entrance (double c, double e) { 122 String * a= toString(c); 123 String * t= a->substring(1,a->get_length()); 124 String * h= a->substr(0,1); 125 if (e != 0){ 126 h= h->concat(String(",")); 127 h= h->concat(t); 128 return h ; 129 } 130 return new String(); 131 } 132 }; 133 134 void webMain() { 135 NumbericFormat * a = new NumbericFormat(); 136 console.log(a->num2format(12340000)); 137 }
最终生成的压缩过的代码
1 "use strict" 2 function NumbericFormat(){this.d0=0;this.d1=0;this.d2=0;this.d3=0;this.d4=0;this.a5=null;this.d=[this];B(this);} 3 NumbericFormat.prototype.reset=function(){return A(this);} 4 NumbericFormat.prototype.num2format=function(a0){return z(this,a0);} 5 NumbericFormat.prototype.toString=function(a0){return y(this,a0);} 6 NumbericFormat.prototype.desciption=function(){return o(this);} 7 NumbericFormat.prototype.entrance=function(a0,a1){return p(this,a0,a1);} 8 var aSlot=null;var nullArray=[null];var nullObj={d:nullArray,o:0};function B(a){a.d1=0;a.d2=0;a.d3=0;a.d4=0;return;} 9 function A(a){a.d1=0;a.d2=0;a.d3=0;a.d4=0;return;} 10 function z(f,e){var label=0;f.d1=0;f.d2=0;f.d3=0;f.d4=0;if((e===0)){var c=String();return c;} 11 f.d0=e;if((e<1.0E+9)){var a=e;}else{var a=(e/1.0E+9);f.d1=a;var a=(e-(a*1.0E+9));f.d0=a;} 12 if((a<1.0E+6)){}else{var b=(a/1.0E+6);f.d2=b;var a=(a-(b*1.0E+6));f.d0=a;} 13 if((a>1000)){var b=(a/1000);f.d3=b;var a=(a-(b*1000));f.d0=a;}else{} 14 f.d4=a;f.d0=e;var c=o(f);return c;} 15 function o(m){var label=0;var e=(m.d3);var f=(m.d2);var i=(m.d1);var c=(m.d4);do{if(((e<10)&&(c>0))){if((e<5)){var c=((e*1000)+c);var q=(+((((c>=1000)?1:0)?1:0)>>0));var e=0;break;}else{var e=(e+(c/1000));var c=0;var q=0;break;}}else{if(!(((e>=10)&&(c>0)))){var q=0;break;} 16 var e=(e+(c/1000));var c=0;var q=0;}}while(0);if((f>0)){var c=(f+0);var f=0;var e=0;}else{var r=c;var c=f;var f=r;} 17 if(((i>0)&&(i<10))){var f=(i+(c/1000));var i=0;var c=0;var e=0;}else{var r=f;var f=i;var i=r;} 18 var b=String();if((f>0)){var a=JSON.stringify(f);var a=String(a);var b=b.concat(a);var a=String();var n=String.fromCharCode(98>>0);var a=a.concat(n);var a=String(a);var b=b.concat(a);}else{var a=String();var a=String(a);var b=b.concat(a);} 19 if((c>0)){var a=JSON.stringify(c);var a=String(a);var b=b.concat(a);var a=String();var n=String.fromCharCode(109>>0);var a=a.concat(n);var a=String(a);var b=b.concat(a);}else{var a=String();var a=String(a);var b=b.concat(a);} 20 if((e>0)){var a=JSON.stringify(e);var a=String(a);var b=b.concat(a);var a=String();var n=String.fromCharCode(107>>0);var a=a.concat(n);var a=String(a);var b=b.concat(a);}else{var a=String();var a=String(a);var b=b.concat(a);} 21 if(!((i>0))){return b;} 22 var a=p(m,i,q);var a=String(a);b.concat(a);return b;} 23 function y(b,a){return JSON.stringify(a);} 24 function p(e,c,b){var label=0;var a=JSON.stringify(c);var n=a.length;var f=a.substring(1>>0,n>>0);var i=a.substr(0>>0,1>>0);var a=String();if(!((b!==0))){return a;} 25 var m=String.fromCharCode(44>>0);var a=a.concat(m);var a=String(a);var a=i.concat(a);var f=String(f);var a=a.concat(f);return a;} 26 function u(){var a={d0:0,d1:0,d2:0,d3:0,d4:0,a5:null};a.d1=0;a.d3=0;a.d2=12.34;a.d4=0;a.d0=1.234E+7;var a=o(a);var a=String(a);console.log(a);return;} 27 u()
结果运行和纯js版本的一致 。体积2.69k和纯js版本的体积差不多。
转载于:https://www.cnblogs.com/cncmd/p/5149912.html
asm.js的陷阱1相关推荐
- IE和Chrome都将支持asm.js
根据modern.IE平台上的状态显示,asm.js正处于开发阶段.按照微软的说法,在Windows 10中所使用的Chakra引擎将支持asm.js,并且微软正与Mozilla进行合作,以争取尽快实 ...
- WebAssembly系列1-从 ASM.JS 到 WebAssembly
为什么80%的码农都做不了架构师?>>> 在2015.06.17, JavaScrpt之父Brendan Eich宣布了一个新项目:将新的底层原语(low level prim ...
- asm.js性能提升,让游戏飞起来
asm.js 的显著变化 asm.js是JavaScrpit的一个子集,是专门用来将C或者C++代码移植到网络中,非常便于优化.我们之前在博客中为大家介绍过Firefox如何使用32位浮点操作来优化a ...
- asm.js 和 WebAssembly 有什么区别?
asm.js是具有"高度可优化"指令的 JS 子集.基本上你可以声明类型 (int, float) 和 js 引擎(在浏览器和 node.js 中)将更快地执行指令.如果您的应用程 ...
- 用于 Unity 和虚幻引擎的 Asm.js 与 WebGL
用于 Unity 和虚幻引擎的 Asm.js 与 WebGL 摘要:本文来自微软,是一个 web 开发系列文章的一部分.感谢你对实现了 SitePoint 的成员的支持. Unity 以及 Epic ...
- 从Rust到远方:ASM.js星系
来源: https://mnt.io/2018/08/28/from-rust-to-beyond-the-asm-js-galaxy/ 这篇博客文章是这一系列解释如何将Rust发射到地球以外的许多星 ...
- asm.js 和 Emscripten 入门教程
http://www.ruanyifeng.com/blog/2017/09/asmjs_emscripten.html 作者: 阮一峰 日期: 2017年9月 7日 Web 技术突飞猛进,但是有一个 ...
- 如何在浏览器上跑深度学习模型?并且一行JS代码都不用写
翻译 | 林椿眄 编辑 | 周翔 2017 年 8 月,华盛顿大学的陈天奇团队发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机.CUDA.OpenCL.Metal.J ...
- 四十年前的 6502 CPU 指令翻译成 JS 代码会是怎样
去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个想法:能不能把某 ...
最新文章
- Linux安装Nginx、Redis、django
- Flex通过Iframe使用activex控件,点击除Iframe的其他地方后,Iframe内容消失
- 3、spring注解注入
- 【javascript 对日期的扩展 Format\addDays】
- STM8启动分析及IAP
- css button 四种状态,css中按钮的四种状态
- Android onKeyDown、onKeyUp、dispatchKeyEvent的区别
- 使用 IntraWeb (29) - 基本控件之 TIWAutherList、TIWAutherINI、TIWAutherEvent
- 【77.39%】【codeforces 734A】Anton and Danik
- 云端软件平台 如何共享自己封装的云端软件
- jspstudy 升级mysql_jspstudy+myeclipse 搭建jsp开发环境
- 纯JS实现倒序九九乘法表 for循环
- 微信小程序图集短视频去水印源码教程
- blos硬盘启动台式计算机,惠普台式机bios设置硬盘启动操作步骤
- blob/text column 'content' used in key specification without a key length
- 浪潮存储服务器VAAI
- android studio拨打电话代码,AndroidStudio实现拨打电话和发短信(kotlin)
- String的底层分析 (学习笔记)
- php网页可视化编辑器,在线HTML可视化编辑器KindEditor | 严佳冬
- 爱普生几种低功耗时钟芯片