2012-12-23 32 views
9

我使用node.js爲一些存儲在SQLite數據庫中的PNG圖像提供二進制BLOB。這些圖像很小,平均9500字節。是什麼讓node.js SlowBuffers「慢」?

我使用the sqlite3 npm package,這似乎返回二進制BLOB對象作爲SlowBuffers。我的node.js服務在內存中保存這些SlowBuffers緩解IO等待時間,爲他們提供服務是這樣的:

response.send(slowBuffer); 

看來,SlowBuffer有類似Buffer的接口;轉換爲Buffer很簡單:

var f = function(slowBuffer) { 
    var buffer = new Buffer(slowBuffer.length); 
    slowBuffer.copy(buffer); 
    return buffer; 
} 

我應該將這些SlowBuffersBuffers

幫助我理解了爲什麼他們被稱爲「慢」緩衝區。

回答

14

如果你想讀的帖子:

  1. https://groups.google.com/forum/?fromgroups=#!topic/nodejs-dev/jd52ZsVSZNo
  2. https://groups.google.com/forum/?fromgroups=#!topic/nodejs/s1dnFbb-Rj8

節點提供兩種類型的緩存對象。 Buffer是一個原生的Javascript數據結構; SlowBuffer由C++模塊實現。在原生Javascript環境中使用C++模塊需要額外的CPU時間,因此「慢」。 Buffer對象由SlowBuffer對象支持,但可以直接從Javascript讀取/寫入內容以獲得更好的性能。

不限Buffer對象大於8 KB是由一個單一對象SlowBuffer備份。多個Buffer小於8 KB的對象可以由單個SlowBuffer對象支持。當大於8 KB小許多Buffer對象在內存中(由單個SlowBuffer支持)存在時,C++模塊懲罰可以是,如果你要改用SlowBuffer爲每一個非常高。小Buffers經常大量使用。

This class is primarily for internal use意味着如果您想自己管理服務器上的緩衝區,然後使用SlowBuffer(要使用較小的塊,則必須自行將SlowBuffer分區)。除非你想在處理緩衝區中使用分鐘級別的控制,否則使用Buffer對象應該沒問題。

+1

如果'Buffer'中的數據無論如何都只是使用'SlowBuffer',那麼爲什麼會有所不同呢?是否預先分配了'SlowBuffer's? – Brad

+0

兩者都是內存分配,但Buffer使用原生JS函數來操縱內存,而SlowBuffer使用外部C++ API。從node.js調用C++ API時會有開銷。 – user568109

+1

當需要的內存超過8K時,'Buffer'只使用'SlowBuffer'嗎?這與「每個緩衝區實際上由SlowBuffer支持」相沖突,這是我感到困惑的地方。 – Brad