把string转成buffer会不会很耗cpu?
发布于 12 年前 作者 chosen0ne 6017 次浏览 最后一次编辑是 8 年前

之前做过测试,开发http应用时,输出buffer比输出string性能要高几倍,几乎和nginx媲美。但是,在代码中不得不把要输出的string都一一转化为buffer,调用var buf = new Buffer(str);,我的疑问是每次这样的转化是需要cpu计算的,那么在高并发应用时,cpu是不是就会是瓶颈?

8 回复

没有看过代码不敢乱讲。 凭直觉:不会, 理由string 转buffer 是更多的是内存操作 并不是计算操作

我對你的測試結果表示懷疑,除非整個過程都是在操作 Buffer 完全不涉及 string,否則輸出 string 和轉化爲 Buffer 的 string 效率應該是一樣的。因爲從內部實現考慮最終輸出只能是 Buffer ,輸出 string 只不過是隱式轉換了而已。

調用 var buf = new Buffer(str); 會有 CPU 操作,因爲涉及到了編碼轉換,默認是 UCS2 轉換爲 UTF8 。不過就算你不調用,系統也會在內部幫你調用的。

你可以用ab压测一下,响应内容大小要大一点,100k左右。我做的测试是,10000并发请求10000次,在用Buffer包装的情况下,rps为3000;没有用Buffer时只有450。

@chosen0ne 能給出你的代碼嗎?

@chosen0ne 表示怀疑,求代码

var cluster = require(‘cluster’);<br> var http = require(‘http’);<br> var cpunum = require(‘os’).cpus().length;<br>

var str = ‘’;<br> // 生成100k数据<br> for(var i=0; i<1024*100; i++){<br> str += ‘a’;<br> }<br> console.log(str.length);<br>

var str = new Buffer(str);//测试string时,把这句删掉<br> if(cluster.isMaster){<br> for(var i=0; i < cpunum; i++)<br> cluster.fork();<br> }else{<br> http.Server(function(req, res){<br> console.log(‘a’);<br> res.end(str); <br> }).listen(9000);<br> }<br>

这是代码,很简单

@byvoid 测试了没有。。。

回到顶部