泰坦尼克号行驶的前方现在有一座冰山需要撞,我们需要弄清楚冰山下面究竟是什么?以及杰克的心里阴影的面积。
浮点数计算:并不是像官方文档上说的那样,这个交叉编译技术的最终生成的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稍微大一些。
原文:http://www.cnblogs.com/cncmd/p/5149912.html