把string转成buffer会不会很耗cpu?
发布于 3年前 作者 chosen0ne 2031 次浏览

之前做过测试,开发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’);
var http = require(‘http’);
var cpunum = require(‘os’).cpus().length;

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

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

这是代码,很简单

@byvoid 测试了没有。。。

回到顶部