注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

C++写node笔记(六)  

2012-12-13 14:53:53|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
自从node出现,感觉事情一切都变的很美好,依靠node的异步和事件驱动做流程,抵御I/O的大并发,很多人攻击js做cpu密集型操作似乎有性能问题,于是我们可以利用c++做node模块来处理cpu密集型的操作,当然这样看上去似乎我们找到了通吃大部分情况的完美解决方案,而且node配合C++,多牛B多装B的组合,说出去特有面子。
可喜可贺的是我们用了斐波那契算法排名第二的语言开发应用,而且开发效率绝对比第一的C要高很多,斐波那契算法排名地址,感谢苏千的测试:

但是在我近一个月的c++模块和v8引擎摸索后,我发现事情似乎不如想象中那么美好(当然只能是业余时间,有写错望大牛们指正)。

先上一个不是很完美的c++模块,用来做验证的,虽然有时候他的确比node本身要快:
你也可以 npm install hvalidator 进行安装。

我们来看下replace操作的测试结果:
我们利用hvalidator模块中的toXss函数来替换掉可能xss注入攻击的字符串,使用方法如下:

var hv = require('hvalidator');

hv.toXss(str);//Remove common XSS attack

然后我们同样构建js的代码:

function toxss(text){
text = text.replace(/&/g, "&");
text = text.replace(/"/g, """);
text = text.replace(/</g, "&lt;");
text = text.replace(/>/g, "&gt;");
text = text.replace(/'/g, "&#146;");
return text;
}

ok,我们构建测试字符串:

var t='<body><div id="{$userid}">{$username}</div><div id="userid">{$usersex}</div></body></html>';

然后我们分别执行1000次,看下测试结果:

nodejs: 19ms
c++: 9ms

是不是感觉结果正常,然后我们加大到10000次的匹配,看下测试结果:

nodejs: 50ms
c++: 62ms

是不是感觉很疑惑,为什么c++的速度要开始稍稍落后于node了,我个人感觉就3种可能:
a、V8引擎太牛X了,性能直逼c++。
b、本人水平太差,写出了比js性能更差的c++代码。
c、因为频繁的v8接口调用和数据类型转换,造成的消耗已经超过了c++代码本身执行的时间。

接下来的测试,可能会让大家感到吃惊,我们把字符串的长度加长到100倍,也就是说上面的变量t被加长100次,然后执行100次匹配,我看下测试结果:

nodejs: 24ms
c++: 506ms

这让我直接怀疑我写的C++是不是真的很渣,由于字符串的长度变的很长,所以导致c++性能直线下降,而node却还是保持着一个很好的性能。
当然这其中的原因可能跟我在对v8::local<string>类型转换时发生的,也可能是c++的replace函数写的有问题,但是这也发出了一个信号,并不是说写了C++模块肯定是优于node本身的代码性能。

(如果有C++大牛方便解答下我的问题,c++的replace函数在多次对大字符串替换的时候性能很差,有什么办法吗?特别是当我对字符串加长到原来1000倍以上时,C++代码可能溢出了,卡死在那里。)
replace函数的c++代码:

我们再来看下hvalidator对比node的其他性能:
下面是利用hvalidator对比一些格式验证的测试,执行1000次:

nodejs: 73ms
c++: 36ms

这些验证都是很简单的一些验证,直接调用v8::value 类下面的一些 比如 IsArray这类的方法,然后返回bool值给node,在小并发情况下c++的验证速度要优于node,但是随着执行次数的增加比如我们增加到10W次,我们再来看结果:

nodejs: 2549ms
c++: 1918ms

他们之间的差距在逐渐缩小,这时候C++函数的调用成为了比计算更为消耗的地方。

说了这么多就是想找一个合适的场景来为node写c++模块,究竟什么样的情况下我们需要c++模块,而不是为了写c++模块而写。目前我也没有答案,当我充满信心的去写C++模块后,hvalidator模块的性能测试结果让我充满失败感,希望有大牛能指点一二。

下一篇再总结自己这些天写c++模块的一些心得吧。

  评论这张
 
阅读(1266)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016