Browse Source
lib: avoid recompilation of anonymous functions
Since at least V8 5.4, using function.bind() is now fast enough to
use to avoid recompiling/reoptimizing the same anonymous functions.
These changes especially impact http servers.
PR-URL: https://github.com/nodejs/node/pull/6533
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
v6
Brian White
8 years ago
No known key found for this signature in database
GPG Key ID: 606D7358F94DA209
2 changed files with
21 additions and
21 deletions
lib/_http_outgoing.js
lib/_stream_writable.js
@ -545,6 +545,9 @@ OutgoingMessage.prototype.addTrailers = function addTrailers(headers) {
const crlf_buf = Buffer . from ( '\r\n' ) ;
function onFinish ( outmsg ) {
outmsg . emit ( 'finish' ) ;
}
OutgoingMessage . prototype . end = function end ( data , encoding , callback ) {
if ( typeof data === 'function' ) {
@ -592,9 +595,7 @@ OutgoingMessage.prototype.end = function end(data, encoding, callback) {
if ( typeof callback === 'function' )
this . once ( 'finish' , callback ) ;
const finish = ( ) => {
this . emit ( 'finish' ) ;
} ;
var finish = onFinish . bind ( undefined , this ) ;
var ret ;
if ( this . _ hasBody && this . chunkedEncoding ) {
@ -86,9 +86,7 @@ function WritableState(options, stream) {
this . bufferProcessing = false ;
// the callback that's passed to _write(chunk,cb)
this . onwrite = function ( er ) {
onwrite ( stream , er ) ;
} ;
this . onwrite = onwrite . bind ( undefined , stream ) ;
// the callback that the user supplies to write(chunk,encoding,cb)
this . writecb = null ;
@ -538,20 +536,21 @@ function endWritable(stream, state, cb) {
function CorkedRequest ( state ) {
this . next = null ;
this . entry = null ;
this . finish = onCorkedFinish . bind ( undefined , this , state ) ;
}
this . finish = ( err ) => {
var entry = this . entry ;
this . entry = null ;
while ( entry ) {
var cb = entry . callback ;
state . pendingcb -- ;
cb ( err ) ;
entry = entry . next ;
}
if ( state . corkedRequestsFree ) {
state . corkedRequestsFree . next = this ;
} else {
state . corkedRequestsFree = this ;
}
} ;
function onCorkedFinish ( corkReq , state , err ) {
var entry = corkReq . entry ;
corkReq . entry = null ;
while ( entry ) {
var cb = entry . callback ;
state . pendingcb -- ;
cb ( err ) ;
entry = entry . next ;
}
if ( state . corkedRequestsFree ) {
state . corkedRequestsFree . next = corkReq ;
} else {
state . corkedRequestsFree = corkReq ;
}
}