body + = chunk会在每次块到达时重新分配整个响应string?
我正在阅读这篇文章=> http://mgutz.com/2010/10/01/check_gmail_with_node_js.html 。
下面的评论Shomrom说:
body + = chunk将在每次块到达时重新分配整个响应string。 我相信将每个块附加到一个数组并且在您拥有所有需要时执行.join()会更好。
每次块到达时,body + = chunk是否真的重新分配整个响应string? 如果是这样,那么改进这个片段的最好方法是什么?
它包含以下片段:
var http = require('http'); var user = 'user@gmail.com'; var password = 'password'; var auth = new Buffer(user + ':' + password).toString('base64'); var google = http.createClient(443, 'mail.google.com', true); var request = google.request('GET', '/mail/feed/atom/', { 'Host': 'mail.google.com', 'Authorization': 'Basic ' + auth }); request.addListener('response', function(res) { var body = ''; res.addListener('data', function(chunk) { body += chunk; }); res.addListener('end', function() { console.log(body); }); }); request.end();
不一定每次,但总的来说,它可能会经常这样做(半个时间,取决于你的string的长度和JavaScript的实现)。 使用数组和连接是一个好的build议:
var bodyBuilder = []; res.addListener('data', function(chunk) { bodyBuilder.push(chunk); });
当你完成后,join
var body = bodyBuilder.join('');
这是因为string通常被存储为连续的字符数组。 当额外的字符被追加时,如果在string末尾没有足够的可用空间来存储额外的东西,则数组可能不得不在内存中移动。 一个实现可能会保留一些额外的空间,但有多less是你无法控制的。