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是你无法控制的。