On Wed, Apr 30, 2014 at 11:10 AM, Kees k <keeskwekkeb...@gmail.com> wrote: > Hello all, > > I am writing a piece of code to interface with a modbus library > (libmodbus),which should be really fast. One bottleneck is that I have to > convert a Local<Array> to uint8_t array: > >>> uint8_t req[req_length]; >>> Local<Array> req_arr = Local<Array>::Cast(args[1]); >>> struct timespec tstart, tstop; >>> clock_gettime(CLOCK_MONOTONIC, &tstart); >>> for (int i = 0; i < req_length; i++) { >>> req[i] = req_arr->Get(i)->Uint32Value(); >>> } >>> clock_gettime(CLOCK_MONOTONIC, &tstop); > > According to benchmarks this piece of code takes about 1 ms with a > req_length of 80 on a Beaglebone Black (1 MHz), which really surprises me. > After some digging I found that the conversion 'Uint32Value()' consumes most > of the time. After leaving out this conversion the benchmark results in 100 > usec. > > Does anyone have an idea to improve the performance of this simple > 'Uint32Value' conversion?
Maybe try switching to v8::Object::SetIndexedPropertiesToExternalArrayData() with type kExternalUint32Array. That lets you construct a typed array without going through (much of) the typed array machinery. void Create(const FunctionCallbackInfo<Value>& args) { HandleScope handle_scope(args.GetIsolate()); Local<Object> obj = args[0]->ToObject(); uint32_t nelts = args[1]->Uint32Value(); uint32_t* elts = new uint32_t[nelts]; obj->SetIndexedPropertiesToExternalArrayData(elts, kExternalUint32Array, nelts); } void Process(const FunctionCallbackInfo<Value>& args) { HandleScope handle_scope(args.GetIsolate()); Local<Object> obj = args[0]->ToObject(); void* data = obj->GetIndexedPropertiesExternalArrayData(); if (data == NULL) return; uint32_t* elts = static_cast<uint32_t*>(data); uint32_t nelts = obj->GetIndexedPropertiesExternalArrayDataLength(); // Process the data. } Note that you need to take care of releasing the memory again when you're done with it. Either do that manually or turn the object into a weak persistent handle and release the memory in your weak callback. You can also use the typed array API in v8.h but that's only available in node.js master. (Writing that I realized I used the V8 3.25 API in the example above; the gist of it is the same in v0.10, however.) -- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines You received this message because you are subscribed to the Google Groups "nodejs" group. To post to this group, send email to nodejs@googlegroups.com To unsubscribe from this group, send email to nodejs+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/nodejs?hl=en?hl=en --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.