From 54b2f8da53ace9c087fc727db4c25bf2d48962de Mon Sep 17 00:00:00 2001
From: "yangguo@chromium.org"
 <yangguo@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Date: Tue, 22 Jul 2014 10:35:38 +0000
Subject: [PATCH] Add profiling to code serializer.

R=jochen@chromium.org

Review URL: https://codereview.chromium.org/408143004

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22521 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
---
 src/compiler.cc  | 19 +++++++++++++++----
 src/serialize.cc |  8 +++++++-
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/compiler.cc b/src/compiler.cc
index 718c0dc8fb..8d59dbca2d 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -960,15 +960,22 @@ Handle<SharedFunctionInfo> Compiler::CompileScript(
   MaybeHandle<SharedFunctionInfo> maybe_result;
   Handle<SharedFunctionInfo> result;
   if (extension == NULL) {
-    maybe_result = compilation_cache->LookupScript(
-        source, script_name, line_offset, column_offset,
-        is_shared_cross_origin, context);
-    if (maybe_result.is_null() && FLAG_serialize_toplevel &&
+    if (FLAG_serialize_toplevel &&
         compile_options == ScriptCompiler::kConsumeCodeCache) {
       return CodeSerializer::Deserialize(isolate, *cached_data, source);
+    } else {
+      maybe_result = compilation_cache->LookupScript(
+          source, script_name, line_offset, column_offset,
+          is_shared_cross_origin, context);
     }
   }
 
+  base::ElapsedTimer timer;
+  if (FLAG_profile_deserialization && FLAG_serialize_toplevel &&
+      compile_options == ScriptCompiler::kProduceCodeCache) {
+    timer.Start();
+  }
+
   if (!maybe_result.ToHandle(&result)) {
     // No cache entry found. Compile the script.
 
@@ -1002,6 +1009,10 @@ Handle<SharedFunctionInfo> Compiler::CompileScript(
       if (FLAG_serialize_toplevel &&
           compile_options == ScriptCompiler::kProduceCodeCache) {
         *cached_data = CodeSerializer::Serialize(isolate, result, source);
+        if (FLAG_profile_deserialization) {
+          PrintF("[Compiling and serializing %d bytes took %0.3f ms]\n",
+                 (*cached_data)->length(), timer.Elapsed().InMillisecondsF());
+        }
       }
     }
 
diff --git a/src/serialize.cc b/src/serialize.cc
index c35464e2f8..20319357ab 100644
--- a/src/serialize.cc
+++ b/src/serialize.cc
@@ -1991,11 +1991,12 @@ void CodeSerializer::SerializeSourceObject(HowToCode how_to_code,
 Handle<SharedFunctionInfo> CodeSerializer::Deserialize(Isolate* isolate,
                                                        ScriptData* data,
                                                        Handle<String> source) {
+  base::ElapsedTimer timer;
+  if (FLAG_profile_deserialization) timer.Start();
   SerializedCodeData scd(data, *source);
   SnapshotByteSource payload(scd.Payload(), scd.PayloadLength());
   Deserializer deserializer(&payload);
   STATIC_ASSERT(NEW_SPACE == 0);
-  // TODO(yangguo) what happens if remaining new space is too small?
   for (int i = NEW_SPACE; i <= PROPERTY_CELL_SPACE; i++) {
     deserializer.set_reservation(i, scd.GetReservation(i));
   }
@@ -2009,6 +2010,11 @@ Handle<SharedFunctionInfo> CodeSerializer::Deserialize(Isolate* isolate,
   Object* root;
   deserializer.DeserializePartial(isolate, &root);
   deserializer.FlushICacheForNewCodeObjects();
+  if (FLAG_profile_deserialization) {
+    double ms = timer.Elapsed().InMillisecondsF();
+    int length = data->length();
+    PrintF("[Deserializing from %d bytes took %0.3f ms]\n", length, ms);
+  }
   return Handle<SharedFunctionInfo>(SharedFunctionInfo::cast(root), isolate);
 }