Skip to content

Commit dc22890

Browse files
anonrigRafaelGSS
authored andcommitted
buffer: improve byteLength performance
# Conflicts: # src/node_external_reference.h PR-URL: #58048 Reviewed-By: Robert Nagy <ronagy@icloud.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Vinícius Lourenço Claro Cardoso <contact@viniciusl.com.br> Reviewed-By: Daniel Lemire <daniel@lemire.me>
1 parent 6682861 commit dc22890

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

src/node_buffer.cc

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -728,16 +728,28 @@ void SlowByteLengthUtf8(const FunctionCallbackInfo<Value>& args) {
728728
args.GetReturnValue().Set(args[0].As<String>()->Utf8Length(env->isolate()));
729729
}
730730

731-
uint32_t FastByteLengthUtf8(Local<Value> receiver,
732-
const v8::FastOneByteString& source) {
731+
uint32_t FastByteLengthUtf8(
732+
Local<Value> receiver,
733+
Local<Value> sourceValue,
734+
v8::FastApiCallbackOptions& options) { // NOLINT(runtime/references)
735+
TRACK_V8_FAST_API_CALL("Buffer::FastByteLengthUtf8");
736+
auto isolate = options.isolate;
737+
HandleScope handleScope(isolate);
738+
CHECK(sourceValue->IsString());
739+
Local<String> sourceStr = sourceValue.As<String>();
740+
741+
if (!sourceStr->IsExternalOneByte()) {
742+
return sourceStr->Utf8Length(isolate);
743+
}
744+
auto source = sourceStr->GetExternalOneByteStringResource();
733745
// For short inputs, the function call overhead to simdutf is maybe
734746
// not worth it, reserve simdutf for long strings.
735-
if (source.length > 128) {
736-
return simdutf::utf8_length_from_latin1(source.data, source.length);
747+
if (source->length() > 128) {
748+
return simdutf::utf8_length_from_latin1(source->data(), source->length());
737749
}
738750

739-
uint32_t length = source.length;
740-
const auto input = reinterpret_cast<const uint8_t*>(source.data);
751+
uint32_t length = source->length();
752+
const auto input = reinterpret_cast<const uint8_t*>(source->data());
741753

742754
uint32_t answer = length;
743755
uint32_t i = 0;

src/node_external_reference.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ using CFunctionCallbackWithMultipleValueAndOptions =
1717
v8::Local<v8::Value>,
1818
v8::Local<v8::Value>,
1919
v8::FastApiCallbackOptions&);
20+
using CFunctionA =
21+
uint32_t (*)(v8::Local<v8::Value> receiver,
22+
v8::Local<v8::Value> sourceValue,
23+
// NOLINTNEXTLINE(runtime/references) This is V8 api.
24+
v8::FastApiCallbackOptions& options);
2025
using CFunctionCallbackWithOneByteString =
2126
uint32_t (*)(v8::Local<v8::Value>, const v8::FastOneByteString&);
2227

@@ -98,6 +103,7 @@ class ExternalReferenceRegistry {
98103
ExternalReferenceRegistry();
99104

100105
#define ALLOWED_EXTERNAL_REFERENCE_TYPES(V) \
106+
V(CFunctionA) \
101107
V(CFunctionCallback) \
102108
V(CFunctionCallbackWithalueAndOptions) \
103109
V(CFunctionCallbackWithMultipleValueAndOptions) \

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy