From 4f96b841221b91015ce6bc4df69f0c0a6d8cea84 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 31 Mar 2017 11:22:52 -0700 Subject: [PATCH] Large message latency improvements: remove a memcpy and a Buffer construtor call --- ext/byte_buffer.cc | 39 ++++++++++++++------------------------- ext/byte_buffer.h | 4 ---- ext/slice.cc | 5 ++--- 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/ext/byte_buffer.cc b/ext/byte_buffer.cc index 7d6fb198..a99b96be 100644 --- a/ext/byte_buffer.cc +++ b/ext/byte_buffer.cc @@ -45,6 +45,7 @@ namespace grpc { namespace node { +using Nan::Callback; using Nan::MaybeLocal; using v8::Function; @@ -62,7 +63,11 @@ grpc_byte_buffer *BufferToByteBuffer(Local buffer) { } namespace { -void delete_buffer(char *data, void *hint) { delete[] data; } +void delete_buffer(char *data, void *hint) { + grpc_slice *slice = static_cast(hint); + grpc_slice_unref(*slice); + delete slice; +} } Local ByteBufferToBuffer(grpc_byte_buffer *buffer) { @@ -75,31 +80,15 @@ Local ByteBufferToBuffer(grpc_byte_buffer *buffer) { Nan::ThrowError("Error initializing byte buffer reader."); return scope.Escape(Nan::Undefined()); } - grpc_slice slice = grpc_byte_buffer_reader_readall(&reader); - size_t length = GRPC_SLICE_LENGTH(slice); - char *result = new char[length]; - memcpy(result, GRPC_SLICE_START_PTR(slice), length); - grpc_slice_unref(slice); - return scope.Escape(MakeFastBuffer( - Nan::NewBuffer(result, length, delete_buffer, NULL).ToLocalChecked())); + grpc_slice *slice = new grpc_slice; + *slice = grpc_byte_buffer_reader_readall(&reader); + grpc_byte_buffer_reader_destroy(&reader); + char *result = reinterpret_cast(GRPC_SLICE_START_PTR(*slice)); + size_t length = GRPC_SLICE_LENGTH(*slice); + Local buf = + Nan::NewBuffer(result, length, delete_buffer, slice).ToLocalChecked(); + return scope.Escape(buf); } -Local MakeFastBuffer(Local slowBuffer) { - Nan::EscapableHandleScope scope; - Local globalObj = Nan::GetCurrentContext()->Global(); - MaybeLocal constructorValue = Nan::Get( - globalObj, Nan::New("Buffer").ToLocalChecked()); - Local bufferConstructor = Local::Cast( - constructorValue.ToLocalChecked()); - const int argc = 3; - Local consArgs[argc] = { - slowBuffer, - Nan::New(::node::Buffer::Length(slowBuffer)), - Nan::New(0) - }; - MaybeLocal fastBuffer = Nan::NewInstance(bufferConstructor, - argc, consArgs); - return scope.Escape(fastBuffer.ToLocalChecked()); -} } // namespace node } // namespace grpc diff --git a/ext/byte_buffer.h b/ext/byte_buffer.h index 55bc0ab3..e8c4ac90 100644 --- a/ext/byte_buffer.h +++ b/ext/byte_buffer.h @@ -50,10 +50,6 @@ grpc_byte_buffer *BufferToByteBuffer(v8::Local buffer); /* Convert a grpc_byte_buffer to a Node.js Buffer */ v8::Local ByteBufferToBuffer(grpc_byte_buffer *buffer); -/* Convert a ::node::Buffer to a fast Buffer, as defined in the Node - Buffer documentation */ -v8::Local MakeFastBuffer(v8::Local slowBuffer); - } // namespace node } // namespace grpc diff --git a/ext/slice.cc b/ext/slice.cc index 98a80b3d..104dd9e2 100644 --- a/ext/slice.cc +++ b/ext/slice.cc @@ -37,7 +37,6 @@ #include #include "slice.h" -#include "byte_buffer.h" namespace grpc { namespace node { @@ -93,9 +92,9 @@ Local CreateBufferFromSlice(const grpc_slice slice) { Nan::EscapableHandleScope scope; grpc_slice *slice_ptr = new grpc_slice; *slice_ptr = grpc_slice_ref(slice); - return scope.Escape(MakeFastBuffer(Nan::NewBuffer( + return scope.Escape(Nan::NewBuffer( const_cast(reinterpret_cast(GRPC_SLICE_START_PTR(*slice_ptr))), - GRPC_SLICE_LENGTH(*slice_ptr), SliceFreeCallback, slice_ptr).ToLocalChecked())); + GRPC_SLICE_LENGTH(*slice_ptr), SliceFreeCallback, slice_ptr).ToLocalChecked()); } } // namespace node