CNode

把string转成buffer会不会很耗cpu?

Cchosen0ne发布于14 年前最后回复14 年前8 回复7544 浏览0 收藏

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

查看回复

回复 (8)

J
jackeychen#2·14 年前

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

B
byvoid#3·14 年前

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

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

C
chosen0ne#4·14 年前
引用 byvoid我對你的測試結果表示懷疑,除非整個過程都是在操作 Buffer 完全不涉及 string,否則輸出 string 和轉化爲 Buffer 的 string 效率應該是一樣的。因爲從內部實現考慮...

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

C
chosen0ne#8·14 年前

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); }

这是代码,很简单

参与回复
登录后即可参与回复。登录