2012-12-23 18 views
9

Sto usando node.js per servire alcune immagini PNG che sono archiviate in un database SQLite come BLOB binari. Queste immagini sono piccole, in media 9500 byte.Cosa rende "lento" il file node.js SlowBuffers?

Sto usando the sqlite3 npm package, che sembra restituire oggetti BLOB binari come SlowBuffers. Il mio servizio node.js tiene questi SlowBuffers in memoria di mitigare la latenza IO, servendoli in questo modo:

response.send(slowBuffer); 

Sembra che SlowBuffer ha un'interfaccia simile a Buffer; la conversione in Buffer è banale:

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

Devo convertire questi SlowBuffers-Buffers?

Aiutami a capire perché vengono chiamati buffer "lenti".

risposta

14

Se volete leggere i post:

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

Nodo fornisce due tipi di oggetti di buffer. Buffer è una struttura dati Javascript nativa; SlowBuffer è implementato da un modulo C++. L'utilizzo di moduli C++ dall'ambiente Javascript nativo costa più tempo della CPU, quindi il "lento". Gli oggetti Buffer sono supportati dagli oggetti SlowBuffer, ma i contenuti possono essere letti/scritti direttamente da Javascript per prestazioni migliori.

Qualsiasi oggetto Buffer superiore a 8 KB è supportato da un singolo oggetto SlowBuffer. Più oggetti Buffer inferiori a 8 KB possono essere supportati da un singolo oggetto SlowBuffer. Quando nella memoria sono presenti molti oggetti Buffer di dimensioni inferiori a 8 KB (supportati da un singolo SlowBuffer), la penalità del modulo C++ può essere molto elevata se si dovesse invece utilizzare uno SlowBuffer per ciascuno. I piccoli Buffers vengono spesso utilizzati in grandi quantità.

This class is primarily for internal use significa che se si desidera gestire i buffer sul server da soli, quindi utilizzare SlowBuffer (per l'utilizzo in blocchi più piccoli è necessario partizionare SlowBuffer da soli). A meno che non si desideri il controllo del livello dei minuti nella gestione dei buffer, si consiglia di utilizzare gli oggetti Buffer.

+1

Se i dati in un 'Buffer' usano solo' SlowBuffer' comunque, perché la differenza? È che ci sono 'SlowBuffer's pre-assegnati? – Brad

+0

Entrambi sono allocazioni di memoria, ma Buffer utilizza le funzioni JS native per manipolare la memoria, mentre SlowBuffer utilizza l'API C++ esterna. C'è un sovraccarico quando chiami API C++ da node.js. – user568109

+1

'Buffer' usa solo' SlowBuffer' quando la memoria necessaria è superiore a 8K? Ciò è in conflitto con "ogni buffer è infatti supportato da SlowBuffer", che è il punto in cui sono confuso. – Brad

Problemi correlati