From d52f5dc8646eb81f155d683d3b2eee1aec52c8e6 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 17 Oct 2016 13:42:03 +0200 Subject: [PATCH] src: speed up module loading, don't resize buffer Don't bother shrinking the read buffer on the final read because we dispose it immediately afterwards. Avoids some unnecessary memory allocation and copying. PR-URL: https://github.com/nodejs/node/pull/9132 Reviewed-By: James M Snell --- src/node_file.cc | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/node_file.cc b/src/node_file.cc index 58abec64f5b118..0abb88088786ae 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -546,10 +546,11 @@ static void InternalModuleReadFile(const FunctionCallbackInfo& args) { return; } + const size_t kBlockSize = 32 << 10; std::vector chars; int64_t offset = 0; - for (;;) { - const size_t kBlockSize = 32 << 10; + ssize_t numchars; + do { const size_t start = chars.size(); chars.resize(start + kBlockSize); @@ -558,24 +559,19 @@ static void InternalModuleReadFile(const FunctionCallbackInfo& args) { buf.len = kBlockSize; uv_fs_t read_req; - const ssize_t numchars = - uv_fs_read(loop, &read_req, fd, &buf, 1, offset, nullptr); + numchars = uv_fs_read(loop, &read_req, fd, &buf, 1, offset, nullptr); uv_fs_req_cleanup(&read_req); CHECK_GE(numchars, 0); - if (static_cast(numchars) < kBlockSize) { - chars.resize(start + numchars); - break; - } offset += numchars; - } + } while (static_cast(numchars) == kBlockSize); uv_fs_t close_req; CHECK_EQ(0, uv_fs_close(loop, &close_req, fd, nullptr)); uv_fs_req_cleanup(&close_req); size_t start = 0; - if (chars.size() >= 3 && 0 == memcmp(&chars[0], "\xEF\xBB\xBF", 3)) { + if (offset >= 3 && 0 == memcmp(&chars[0], "\xEF\xBB\xBF", 3)) { start = 3; // Skip UTF-8 BOM. } @@ -583,7 +579,7 @@ static void InternalModuleReadFile(const FunctionCallbackInfo& args) { String::NewFromUtf8(env->isolate(), &chars[start], String::kNormalString, - chars.size() - start); + offset - start); args.GetReturnValue().Set(chars_string); }