@@ -77,6 +77,8 @@ using v8::Undefined;
7777using v8::Value;
7878using worker::Worker;
7979
80+ constexpr size_t kManagedBufferCacheSize = 64 * 1024 ;
81+
8082int const ContextEmbedderTag::kNodeContextTag = 0x6e6f64 ;
8183void * const ContextEmbedderTag::kNodeContextTagPtr = const_cast <void *>(
8284 static_cast <const void *>(&ContextEmbedderTag::kNodeContextTag ));
@@ -782,10 +784,16 @@ void Environment::add_refs(int64_t diff) {
782784}
783785
784786uv_buf_t Environment::allocate_managed_buffer (const size_t suggested_size) {
785- std::unique_ptr<BackingStore> bs = ArrayBuffer::NewBackingStore (
786- isolate (),
787- suggested_size,
788- BackingStoreInitializationMode::kUninitialized );
787+ std::unique_ptr<BackingStore> bs;
788+ if (suggested_size == kManagedBufferCacheSize &&
789+ managed_buffer_cache_ != nullptr ) {
790+ bs = std::move (managed_buffer_cache_);
791+ } else {
792+ bs = ArrayBuffer::NewBackingStore (
793+ isolate (),
794+ suggested_size,
795+ BackingStoreInitializationMode::kUninitialized );
796+ }
789797 uv_buf_t buf = uv_buf_init (static_cast <char *>(bs->Data ()), bs->ByteLength ());
790798 released_allocated_buffers_.emplace (buf.base , std::move (bs));
791799 return buf;
@@ -803,6 +811,11 @@ std::unique_ptr<BackingStore> Environment::release_managed_buffer(
803811 return bs;
804812}
805813
814+ void Environment::recycle_managed_buffer (std::unique_ptr<BackingStore> bs) {
815+ if (bs != nullptr && bs->ByteLength () == kManagedBufferCacheSize )
816+ managed_buffer_cache_ = std::move (bs);
817+ }
818+
806819std::string Environment::GetExecPath (const std::vector<std::string>& argv) {
807820 char exec_path_buf[2 * PATH_MAX ];
808821 size_t exec_path_len = sizeof (exec_path_buf);
0 commit comments