diff options
author | Karl Skomski <karl@skomski.com> | 2015-09-09 18:35:04 +0200 |
---|---|---|
committer | Trevor Norris <trev.norris@gmail.com> | 2015-09-15 15:50:25 -0600 |
commit | e7a3ca3d313c0fd18795102df19d3ea9154d3cd3 (patch) | |
tree | 340a2cd407b1fb843bebaa8d2e82f3b2a9c90ec1 /src/node_buffer.cc | |
parent | 7d927ab506800428e4fbfc118b0efd414183487e (diff) | |
download | android-node-v8-e7a3ca3d313c0fd18795102df19d3ea9154d3cd3.tar.gz android-node-v8-e7a3ca3d313c0fd18795102df19d3ea9154d3cd3.tar.bz2 android-node-v8-e7a3ca3d313c0fd18795102df19d3ea9154d3cd3.zip |
src: use subarray() in Buffer#slice() for speedup
Use the built-in Typed Array method subarray() to improve performance of
Buffer#slice().
Benchmark improvements:
benchmark/buffer-slice: 40%
benchmark/buffer-creation (pool): 25%
Additional tests also added.
PR-URL: https://github.com/nodejs/node/pull/2777
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
Diffstat (limited to 'src/node_buffer.cc')
-rw-r--r-- | src/node_buffer.cc | 24 |
1 files changed, 0 insertions, 24 deletions
diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 878c6c5e00..dc0c742e3b 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -456,29 +456,6 @@ void CreateFromArrayBuffer(const FunctionCallbackInfo<Value>& args) { } -void Slice(const FunctionCallbackInfo<Value>& args) { - CHECK(args[0]->IsUint8Array()); - CHECK(args[1]->IsNumber()); - CHECK(args[2]->IsNumber()); - Environment* env = Environment::GetCurrent(args); - Local<Uint8Array> ab_ui = args[0].As<Uint8Array>(); - Local<ArrayBuffer> ab = ab_ui->Buffer(); - ArrayBuffer::Contents ab_c = ab->GetContents(); - size_t offset = ab_ui->ByteOffset(); - size_t start = args[1]->NumberValue() + offset; - size_t end = args[2]->NumberValue() + offset; - CHECK_GE(end, start); - size_t size = end - start; - CHECK_GE(ab_c.ByteLength(), start + size); - Local<Uint8Array> ui = Uint8Array::New(ab, start, size); - Maybe<bool> mb = - ui->SetPrototype(env->context(), env->buffer_prototype_object()); - if (!mb.FromMaybe(false)) - return env->ThrowError("Unable to set Object prototype"); - args.GetReturnValue().Set(ui); -} - - template <encoding encoding> void StringSlice(const FunctionCallbackInfo<Value>& args) { Environment* env = Environment::GetCurrent(args); @@ -1002,7 +979,6 @@ void Initialize(Local<Object> target, env->SetMethod(target, "createFromString", CreateFromString); env->SetMethod(target, "createFromArrayBuffer", CreateFromArrayBuffer); - env->SetMethod(target, "slice", Slice); env->SetMethod(target, "byteLengthUtf8", ByteLengthUtf8); env->SetMethod(target, "compare", Compare); env->SetMethod(target, "fill", Fill); |