Native codes call Function of javascript is slower than javascript?

23 views
Skip to first unread message

Feng Wang

unread,
May 16, 2020, 9:07:33 AM5/16/20
to v8-dev
I have an image (1024x1024x3) that needs to be process pixel-by-pixel. The per-pixel processing code is written using javascript. I've found that it takes 277ms to loop through this handler in c++ code, and only 10ms to loop in javascript code. I want to know how to make the c++ call javascript function as fast as possible.

//javascript per-pixel processing function
var pixelfunction=function( rgb , index )
{
 
var outval = (rgb[0]-rgb[1]/(rgb[0]+rgb[1]) ;
 
return outval;
}



//c++ codes loop call pixelfunction
...
v8
::Function* pixelFunc = ...; // this Function pointer is pixelfunction in javascript.
v8
::Local<v8::Uint8Array> vals = ...; //
v8
::Local<Value> targs[2] ;
for(int it = 0 ;it<1024*1024;++it)
{
  vals
= ...; // get r,g,b values from image ;
  targs
[0] = vals;
  targs
[1] = v8::Integer::New( global , it );
  pixelFunc
->Call( context , context->Global() , 2 , targs);//For convenience, I'm giving up the return value.
}
...

-
//javascript loop call:
var vals=new Uint8Array(3);
for(var it = 0 ; it < 1024*1024 ; ++it )
{
  vals
=...; //get r,g,b values from image
  pixelfunction
( vals , it );//For convenience, I'm giving up the return value.
}

Yang Guo

unread,
May 16, 2020, 10:03:29 AM5/16/20
to v8-...@googlegroups.com
Put everything into an ArrayBuffer and call C++ just once.

--
--
v8-dev mailing list
v8-...@googlegroups.com
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to v8-dev+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/v8-dev/dd3c7a28-1144-4e5f-a982-15e8558d7e5c%40googlegroups.com.

Feng Wang

unread,
May 16, 2020, 4:36:04 PM5/16/20
to Yang Guo
Thanks Yang. But I have to define the processing algorithm in javascript.



Jakob Kummerow

unread,
May 18, 2020, 5:02:07 AM5/18/20
to v8-...@googlegroups.com
Use the JavaScript version of the loop, and call that just once from C++. 

If it's convenient from a packaging point of view, you can put it into a string literal in your C++ source, and compile/run it from there.

Calls between C++ and JavaScript (in both directions) are always going to have quite a bit of overhead; the best way to speed them up is to avoid doing too many of them.


Feng Wang

unread,
May 18, 2020, 8:29:29 PM5/18/20
to Jakob Kummerow
Reply all
Reply to author
Forward
0 new messages