Thanks a lot Jakob. I will move the HandleScope out of the loop first. I think moving to Wee8 is the best solution, since I only need WebAssembly support. (I tried Wee8 some months ago, but failed. I will give it another try.) I will experiment with your suggestion of producing the string in WebAssembly.
Am Montag, 23. März 2020 11:04:27 UTC+1 schrieb Jakob Kummerow: > > No, there is no way to write to stdout directly, and that's intentional. > WebAssembly code can only use imported functions to communicate with the > environment. > > The lowest-hanging fruit here is to move the HandleScope out of the loop. > HandleScope creation/destruction is somewhat expensive, and you certainly > don't need a fresh scope for every iteration. > > Beyond that, I think your other idea is on the right track: every > transition from generated code (i.e., in this case, your Wasm code) and C++ > code is going to have a cost that's comparatively higher than calling > within those worlds (Wasm -> Wasm or C++ -> C++). One way to reduce the > number of expensive calls would be to reserve some memory for the string > representation, move the creation of the string to Wasm (for ints it's > easy, for floats you can find some existing library and compile it to > Wasm), and then have a single call out that reads the entire > null-terminated string and prints it to stdout. > > You didn't say how you're embedding V8 and how much functionality you need > from it. If you only need WebAssembly (no JavaScript), you could take a > look at the Wasm C/C++ API <https://github.com/WebAssembly/wasm-c-api/> > and our implementation of it > <https://docs.google.com/document/d/1oFPHyNb_eXg6NzrE6xJDNPdJrHMZvx0LqsD6wpbd9vY/edit>, > > which gives you considerably faster calls between Wasm and C++ (in both > directions) than the JS-style callbacks that the regular V8 API uses. (It's > not possible to mix both APIs.) > > > On Mon, Mar 23, 2020 at 9:50 AM Immanuel Haffner <haffner...@gmail.com > <javascript:>> wrote: > >> Hi all, >> >> I am compiling WebAssembly modules that perform computations and produce >> results. These results (tuples of values of various types) I would like to >> print to stdout. My current approach is importing a callback function to >> the WebAssembly module instance that performs the printing: >> >> void print(const v8::FunctionCallbackInfo<v8::Value> &info) >> { >> for (int i = 0; i != info.Length(); ++i) { >> v8::HandleScope handle_scope(info.GetIsolate()); >> if (i != 0) std::cout << ','; >> std::cout << *v8::String::Utf8Value(info.GetIsolate(), info[i]); >> } >> std::cout << '\n'; >> } >> >> This callback prints an entire tuple in CSV format. >> >> While this works, it has some drawbacks for me. The biggest drawback is >> performance! The callbacks from the VM to the host seem horribly slow >> compared to native function calls. Is there something I can do about this? >> Is there a way to speed up these callbacks from VM to the host? >> >> I tried an alternative solution, where the WebAssembly module writes the >> results to its linear memory and the host reads them back from the memory, >> interprets them, and prints them. This seems to be faster, actually. >> However, it requires additional memory and the host must "interpret" the >> values. This is in my scenario also a performance issue, because I don't >> know the types of the result when compiling the host code. I only know the >> types when compiling the WebAssembly module. Hence, in this approach there >> is some interpretation overhead involved. >> >> Is there maybe a way to directly write to stdout from WebAssembly? >> >> Thanks & regards, >> Immanuel >> >> -- >> -- >> v8-users mailing list >> v8-u...@googlegroups.com <javascript:> >> 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-u...@googlegroups.com <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/v8-users/b8840b18-820d-406d-a24b-b99545fbf09a%40googlegroups.com >> >> <https://groups.google.com/d/msgid/v8-users/b8840b18-820d-406d-a24b-b99545fbf09a%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/7daa396d-df96-4302-97f9-993fb61c1fb2%40googlegroups.com.