泰坦尼克号行驶的前方现在有一座冰山需要撞,我们需要弄清楚冰山下面究竟是什么?以及杰克的心里阴影的面积。

浮点数计算:并不是像官方文档上说的那样,这个交叉编译技术的最终生成的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相关推荐

  1. IE和Chrome都将支持asm.js

    根据modern.IE平台上的状态显示,asm.js正处于开发阶段.按照微软的说法,在Windows 10中所使用的Chakra引擎将支持asm.js,并且微软正与Mozilla进行合作,以争取尽快实 ...

  2. WebAssembly系列1-从 ASM.JS 到 WebAssembly

    为什么80%的码农都做不了架构师?>>>    在2015.06.17, JavaScrpt之父Brendan Eich宣布了一个新项目:将新的底层原语(low level prim ...

  3. asm.js性能提升,让游戏飞起来

    asm.js 的显著变化 asm.js是JavaScrpit的一个子集,是专门用来将C或者C++代码移植到网络中,非常便于优化.我们之前在博客中为大家介绍过Firefox如何使用32位浮点操作来优化a ...

  4. asm.js 和 WebAssembly 有什么区别?

    asm.js是具有"高度可优化"指令的 JS 子集.基本上你可以声明类型 (int, float) 和 js 引擎(在浏览器和 node.js 中)将更快地执行指令.如果您的应用程 ...

  5. 用于 Unity 和虚幻引擎的 Asm.js 与 WebGL

    用于 Unity 和虚幻引擎的 Asm.js 与 WebGL 摘要:本文来自微软,是一个 web 开发系列文章的一部分.感谢你对实现了 SitePoint 的成员的支持. Unity 以及 Epic ...

  6. 从Rust到远方:ASM.js星系

    来源: https://mnt.io/2018/08/28/from-rust-to-beyond-the-asm-js-galaxy/ 这篇博客文章是这一系列解释如何将Rust发射到地球以外的许多星 ...

  7. asm.js 和 Emscripten 入门教程

    http://www.ruanyifeng.com/blog/2017/09/asmjs_emscripten.html 作者: 阮一峰 日期: 2017年9月 7日 Web 技术突飞猛进,但是有一个 ...

  8. 如何在浏览器上跑深度学习模型?并且一行JS代码都不用写

    翻译 | 林椿眄 编辑 | 周翔 2017 年 8 月,华盛顿大学的陈天奇团队发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机.CUDA.OpenCL.Metal.J ...

  9. 四十年前的 6502 CPU 指令翻译成 JS 代码会是怎样

    去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个想法:能不能把某 ...

最新文章

  1. Linux安装Nginx、Redis、django
  2. Flex通过Iframe使用activex控件,点击除Iframe的其他地方后,Iframe内容消失
  3. 3、spring注解注入
  4. 【javascript 对日期的扩展 Format\addDays】
  5. STM8启动分析及IAP
  6. css button 四种状态,css中按钮的四种状态
  7. Android onKeyDown、onKeyUp、dispatchKeyEvent的区别
  8. 使用 IntraWeb (29) - 基本控件之 TIWAutherList、TIWAutherINI、TIWAutherEvent
  9. 【77.39%】【codeforces 734A】Anton and Danik
  10. 云端软件平台 如何共享自己封装的云端软件
  11. jspstudy 升级mysql_jspstudy+myeclipse 搭建jsp开发环境
  12. 纯JS实现倒序九九乘法表 for循环
  13. 微信小程序图集短视频去水印源码教程
  14. blos硬盘启动台式计算机,惠普台式机bios设置硬盘启动操作步骤
  15. blob/text column 'content' used in key specification without a key length
  16. 浪潮存储服务器VAAI
  17. android studio拨打电话代码,AndroidStudio实现拨打电话和发短信(kotlin)
  18. String的底层分析 (学习笔记)
  19. php网页可视化编辑器,在线HTML可视化编辑器KindEditor | 严佳冬
  20. 爱普生几种低功耗时钟芯片

热门文章

  1. Xcode编译Undefined symbols for architecture xxx 错误总结
  2. Stumpwm的编译安装
  3. SQL Server 2008不能修改表的解决方法
  4. 面向过程方法学开发软件的特点
  5. stdarg.h的库函数用法小结
  6. 【Python学习系列二十一】pandas库基本操作
  7. 【神经网络与深度学习】读书笔记
  8. linux gdb#039;查找寄存器地址,【Linux跟踪和调试】gdb
  9. php mysql简单链接_php mysql 数据库链接简单例子
  10. jQuery 发送 AJAX 请求