Thanks Ben and Yang:

On Wednesday, April 8, 2015 at 6:28:13 AM UTC-7, Yang Guo wrote:
>
> Ben, thanks for answering that question, but there are some inaccuracies :)
>
> On Wednesday, April 8, 2015 at 2:16:37 PM UTC+2, Ben Noordhuis wrote:
>>
>> On Wed, Apr 8, 2015 at 12:18 PM, Augusto Roman <[email protected]> wrote: 
>> > I've dug through the post history, but I'm still having trouble 
>> > understanding exactly what capability snapshots provide. 
>> > 
>> > My question is: 
>> >   Within a single execution of a single binary, given a single isolate 
>> and 
>> > context that has executed some JS, can I snapshot the state and later 
>> create 
>> > a new context from that snapshot?  
>
>
>> Yes, with restrictions.  Native functions and objects currently cannot 
>> be serialized.  Large typed arrays exist outside of the JS heap and 
>> probably cannot be serialized.  No doubt there are more caveats. 
>>
>
> Correct. You can play around this by for example building with
> make x64.release embedscript=somescript.js 
>

> somescript.js will be run before creating the snapshot, so that it will be 
> part of every context you create from that snapshot.
>

Awesome, that's exactly what I'm interested in.  Can snapshots be created 
at runtime?  For example, can I have my running server create a new 
isolate, run somescript2.js, save the snapshot, and then rapidly process 
many new isolates+contexts with somescript2 preloaded?  That appears to be 
the case using CreateSnapshotDataBlob, and that should NOT be used for 
Natives but should be used for SetSnapshotDataBlob, right?

> For example, imagine a server that should execute one of N JS functions 
>> with 
>> > per-request parameters.  I'd like to snapshot each of the loaded JS 
>> > functions and (for each request selecting a JS func and specifying 
>> > parameters) create a new, clean context from the appropriate snapshot 
>> and 
>> > execute the func with the parameters. 
>>
>> I don't think that's going to work.  The snapshot is a per-isolate 
>> property, not per-context.
>
>
> This is not entirely correct. The snapshot consists of two parts. The 
> first one is to create the isolate. The second part is to initialize each 
> context. By providing a snapshot, both creating an isolate and creating a 
> context can be sped up
>

So, given a particular snapshot, I can apply it to an isolate and all 
contexts created within that isolate will have that snapshot applied. 
 However, if I want a different snapshot, I need a new isolate... right?

> How do snapshots relate to StartupData?  (What is StartupData?)  What's 
>> the 
>> > difference between SetNativesDataBlob and SetSnapshotDataBlob? 
>>  mksnapshot 
>> > appears to enable compiling in a fixed, hard-coded snapshot, which is 
>> not 
>> > what I want. 
>>
>
> The natives data blob is simply the natives js sources minified and in a 
> binary format. V8 requires those sources for example when functions like 
> Array.prototype.push is called, to compile it before the call.
>
> The snapshot data blob is the dump of the isolate and a fresh context, 
> like explained above.
>  
>
>>
>> StartupData is a serialized snapshot, basically a VM core dump. 
>>
>> The natives blob contains the built-in objects and functions, like 
>> Array, Date, Object, etc.  I don't think you would normally touch 
>> this. 
>>
>> The snapshot blob is your custom start state and you can set it with 
>> V8::SetSnapshotDataBlob() or pass it in the Isolate::CreateParams 
>> argument to Isolate::New(). 
>>
>> You need to build V8 with v8_use_snapshot == 'true' and 
>> v8_use_external_startup_data == 1 for that to work, or `make 
>> snapshot=external` when using the Makefile. 
>>
>> > I understand that V8 is not an AOT JS compiler, but some posts seem to 
>> > indicate that snapshots may be appropriate for my use case which is 
>> > confusingly inconsistent. 
>>
>
> The snapshot is mainly used so that initialization scripts (including V8's 
> internal ones) don't have to be run when creating a new context. For 
> example, if you require a pre-calculated lookup table for your program, you 
> would usually calculate it upfront upon startup. With snapshot, you could 
> calculate it before creating the snapshot, and have it loaded as part of 
> the context directly.
>  
>
>>
>> It's similar to emacs' dump mechanism if you are familiar with that, 
>> only with more restrictions. :-) 
>>
>  
>

-- 
-- 
v8-users mailing list
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to