diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 6e141b974131cc..f7f379cf10291d 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -35,6 +35,7 @@ #include "v8-fast-api-calls.h" #include "v8.h" +#include #include #include #include "nbytes.h" @@ -752,12 +753,23 @@ uint32_t FastByteLengthUtf8(Local receiver, if (source.length > 128) { return simdutf::utf8_length_from_latin1(source.data, source.length); } + uint32_t length = source.length; uint32_t result = length; - const uint8_t* data = reinterpret_cast(source.data); - for (uint32_t i = 0; i < length; ++i) { + const auto data = reinterpret_cast(source.data); + + uint32_t i = 0; + const auto length8 = length & ~0x7; + while (i < length8) { + result += std::popcount(*reinterpret_cast(data + i) & 0x8080808080808080); + i += 8; + } + + while (i < length) { result += (data[i] >> 7); + i++; } + return result; }