2010-12-05 1 views
1

私はこの記事を読んでいた=>http://mgutz.com/2010/10/01/check_gmail_with_node_js.html。 Shomromが言うコメントで以下本文+ =チャンクは、チャンクが到着するたびに応答文字列全体を再割り当てしますか?

ボディ+ =チャンクが 全体の応答文字列に チャンクが到着するたびに再割り当てされます。 配列に各チャンクを追加し、 必要なときに.join()を実行する方がはるかに良いと思います。

+ =チャンク 体は本当に全体の応答文字列にチャンクが到着するたびに再配分していますか?もしそうなら、bodyを安く印刷することができるこのスニペットを改善する最良の方法は何ですか?

それは次のスニペットが含まれます。必ずしも

var http = require('http'); 

var user = '[email protected]'; 
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(); 

答えて

2

ないたびに、一般的には、それはかなり頻繁にそうすること(あなたの文字列とJavaScriptの実装の長さに応じて、半分の時間を言います) 。良い勧告された結合配列を使用して:

var body = bodyBuilder.join(''); 

に参加し、

var bodyBuilder = []; 
res.addListener('data', function(chunk) { 
    bodyBuilder.push(chunk); 
}); 

設定が完了したらその理由は、文字列は通常、文字の連続した配列として保存されていることです。余分な文字が追加されると、余分なものを格納するのに十分なスペースが文字列の最後を過ぎていない場合、配列をメモリ内で移動する必要があります。インプリメンテーションでは余分なスペースを確保できますが、コントロールからどれだけ離れていますか。

+0

JavaScript実装で文字列に素晴らしいロープデータ構造が使用されていても、誰もロープを使用しない場合、これは当てはまりません。 –

+0

非常に良い。私は、バッファを使用しても、私が推測するような大きさの事前ハンドブックがわからないのに、より効率的になると思います。あるいは、最初のヘッダからそれを抽出することができますか?コンテンツの長さ? – Alfred

+0

私はむしろ、バッファベースのアプローチを使い、必要に応じて、配列に参加するよりも速く、Node.jsをV8の土地で直接文字列ポインタを取得し、巨大な文字列を書くハックランドまで再割り当てします何かに出るのは非常に遅いです。 –

関連する問題