On Sat, Oct 17, 2015 at 12:20 AM, Dmitry Orlov <alepho...@gmail.com> wrote:
> Thanks Jacob! > > On 16 October 2015 at 13:56, Jakob Kummerow <jkumme...@chromium.org> > wrote: > >> It's not about what the "internal array representation" is, it's about >> how the array is accessed. V8 employs all sorts of smarts to make >> JavaScript execution very fast, because that's its job. Accessing things >> via the C++ API ("array->Set(...)" in your example) isn't anywhere near as >> optimized. The difference is most pronounced for tight hot loops, it will >> be much smaller (to the point of being negligible) for code that runs only >> once. >> > Is there any way to bulk-allocate a v8::Array in a cheap way, for example, > from a C-array of v8::Handle<v8::Value>s? > The fastest way to exchange large amounts of data between C++ and JS is probably an externalized <https://chromium.googlesource.com/v8/v8/+/master/include/v8.h#3472> ArrayBuffer, which allows access to its raw backing store on the C++ side, and a TypedArray on top of it on the JS side. > That said, if "Build Type: DEBUG" in your output means what I think it >> means, then any performance measurement results are pretty much >> meaningless. Try again in Release mode. >> > This message is reported because the Google benchmark library was build > without NDEBUG directive: > > https://github.com/google/benchmark/blob/cf40a0f1172afc061e910eb5590f71e6ffdece66/src/console_reporter.cc#L43 > Apparently, that is the way its Makefile is written. > > My code is compiled wtih -O3: > CXXFLAGS=-Wall -Werror -g -O3 -march=corei7 -mtune=corei7-avx -std=gnu++0x > -pthread > > Is it possible that I inadvertently built V8 in debug mode? This is how I > install it: > $ export PATH=$PATH:/path/to/depot_tools > $ fetch v8 > $ cd v8 > $ git fetch > $ git checkout 4.2.77.21 > You should update, 4.2 is outdated and unmaintained. branch-heads/4.6 is a good choice right now (tip of the branch that's used in Chrome's Stable channel). > $ gclient sync > $ make clean > $ make -j8 native > OK, "make native" builds V8 in Release mode. > >> On Fri, Oct 16, 2015 at 8:57 PM, Dmitry Orlov <alepho...@gmail.com> >> wrote: >> >>> Hello everyone, >>> >>> I've noticed peculiar performance characteristics of V8 objects when >>> benchmarking my V8-embedding application. In particular, v8::Array is >>> incredibly expensive - each Set(index, value) operation on an array >>> consistently takes 100ns on a 3.4Ghz Xeon, instead of single digit >>> nanoseconds one would expect from a C-array based implementation. >>> In contrast, javascript code using arrays runs blaze-fast, taking around >>> 2ns for each assignment. >>> >>> I've benchmarked these code fragments separately, implementation is >>> below: >>> >>> void allocate_v8_integer_array(benchmark::State& state) { >>> v8::HandleScope scope(isolate); >>> v8::Local<v8::Value> int_value = v8::Integer::New(isolate, 100); >>> while (state.KeepRunning()) { >>> const int n = state.range_x(); >>> v8::Local<v8::Array> array = v8::Array::New(isolate, >>> state.range_x()); >>> for (int i = 0; i < n; ++i) { >>> array->Set(i, int_value); >>> } >>> } >>> } >>> >>> void allocate_v8_integer_array_in_javascript(benchmark::State& state) { >>> v8::TryCatch try_catch(isolate); >>> v8::HandleScope scope(isolate); >>> v8::Local<v8::Script> script = >>> v8::Script::Compile(v8::String::NewFromUtf8(isolate, >>> "function run(n) {" >>> " var x = Array(n);" >>> " for (var i = 0; i < n; i++) {" >>> " x[i] = i;" >>> " }" >>> "}")); >>> script->Run(); >>> assert(!try_catch.HasCaught()); >>> v8::Local<v8::Function> run = v8::Local<v8::Function>::Cast( >>> >>> context.Get(isolate)->Global()->Get(v8::String::NewFromUtf8(isolate, >>> "run"))); >>> v8::Local<v8::Value> arg = v8::Integer::New(isolate, >>> state.range_x()); >>> while (state.KeepRunning()) { >>> run->Call(context.Get(isolate)->Global(), 1, &arg); >>> assert(!try_catch.HasCaught()); >>> } >>> } >>> >>> Benchmark results: >>> Run on (8 X 3399.98 MHz CPU s >>> 2015-10-16 18:47:44 >>> Build Type: DEBUG >>> Benchmark Time(ns) CPU(ns) >>> Iterations >>> >>> --------------------------------------------------------------------------------- >>> allocate_v8_integer_array/1 190 190 >>> 3688287 >>> allocate_v8_integer_array/10 1061 1061 >>> 659836 >>> allocate_v8_integer_array/100 9936 9930 >>> 70495 >>> allocate_v8_integer_array/1000 96517 96458 >>> 7259 >>> allocate_v8_integer_array/9.76562k 967739 967146 >>> 724 >>> allocate_v8_integer_array_in_javascript/10 487 486 >>> 3104447 >>> allocate_v8_integer_array_in_javascript/100 1075 1074 >>> 1000000 >>> allocate_v8_integer_array_in_javascript/1000 3576 3573 >>> 264306 >>> allocate_v8_integer_array_in_javascript/9.76562k 22218 22204 >>> 33641 >>> >>> Note how allocate_v8_integer_array asymptotes at 100ns per array >>> assignment, where allocate_v8_integer_array_in_javascript asymptotes at 2ns >>> per assignment. >>> I would expect v8::Array to be the internal array representation for the >>> javascript too. Is that not the case? Why the performance difference is so >>> high? >>> >>> Thank you very much! >>> Dmitry. >>> >>> -- >>> -- >>> v8-users mailing list >>> v8-users@googlegroups.com >>> http://groups.google.com/group/v8-users >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "v8-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to v8-users+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- >> -- >> v8-users mailing list >> v8-users@googlegroups.com >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to a topic in the >> Google Groups "v8-users" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/v8-users/_fuFjcsktzc/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> v8-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to the Google Groups > "v8-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to v8-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.