Revision: 15429
Author: [email protected]
Date: Mon Jul 1 08:15:57 2013
Log: CPUProfiler: propagate scriptId to the front-end
Each CpuProfileNode has resource_name string property.
It cost us N * strlen(resource_name) where N is number of functions in the
collected profile.
We could transfer script_id instead of resource_name so it would reduce
transfer
size and help us to solve the problem with evals and sourceURL.
BUG=none
TEST=test-cpu-profiler/CollectCpuProfile
[email protected], [email protected]
Review URL: https://codereview.chromium.org/17642009
http://code.google.com/p/v8/source/detail?r=15429
Modified:
/branches/bleeding_edge/include/v8-profiler.h
/branches/bleeding_edge/src/api.cc
/branches/bleeding_edge/src/cpu-profiler.cc
/branches/bleeding_edge/src/profile-generator-inl.h
/branches/bleeding_edge/src/profile-generator.cc
/branches/bleeding_edge/src/profile-generator.h
/branches/bleeding_edge/test/cctest/test-profile-generator.cc
=======================================
--- /branches/bleeding_edge/include/v8-profiler.h Fri Jun 21 00:56:22 2013
+++ /branches/bleeding_edge/include/v8-profiler.h Mon Jul 1 08:15:57 2013
@@ -75,6 +75,9 @@
/** Returns function name (empty string for anonymous functions.) */
Handle<String> GetFunctionName() const;
+ /** Returns id of the script where function is located. */
+ int GetScriptId() const;
+
/** Returns resource name for script from where the function originates.
*/
Handle<String> GetScriptResourceName() const;
=======================================
--- /branches/bleeding_edge/src/api.cc Mon Jul 1 05:57:15 2013
+++ /branches/bleeding_edge/src/api.cc Mon Jul 1 08:15:57 2013
@@ -7324,6 +7324,15 @@
isolate->factory()->InternalizeUtf8String(entry->name())));
}
}
+
+
+int CpuProfileNode::GetScriptId() const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptId");
+ const i::ProfileNode* node = reinterpret_cast<const
i::ProfileNode*>(this);
+ const i::CodeEntry* entry = node->entry();
+ return entry->script_id();
+}
Handle<String> CpuProfileNode::GetScriptResourceName() const {
=======================================
--- /branches/bleeding_edge/src/cpu-profiler.cc Mon Jul 1 07:57:58 2013
+++ /branches/bleeding_edge/src/cpu-profiler.cc Mon Jul 1 08:15:57 2013
@@ -255,9 +255,12 @@
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
rec->start = code->address();
rec->entry = profiles_->NewCodeEntry(tag,
profiles_->GetFunctionName(name));
- rec->entry->set_no_frame_ranges(info ?
- info->ReleaseNoFrameRanges() :
- NULL);
+ if (info) {
+ rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges());
+ }
+ ASSERT(Script::cast(shared->script()));
+ Script* script = Script::cast(shared->script());
+ rec->entry->set_script_id(script->id()->value());
rec->size = code->ExecutableSize();
rec->shared = shared->address();
processor_->Enqueue(evt_rec);
@@ -280,9 +283,12 @@
CodeEntry::kEmptyNamePrefix,
profiles_->GetName(source),
line);
- rec->entry->set_no_frame_ranges(info ?
- info->ReleaseNoFrameRanges() :
- NULL);
+ if (info) {
+ rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges());
+ }
+ ASSERT(Script::cast(shared->script()));
+ Script* script = Script::cast(shared->script());
+ rec->entry->set_script_id(script->id()->value());
rec->size = code->ExecutableSize();
rec->shared = shared->address();
processor_->Enqueue(evt_rec);
=======================================
--- /branches/bleeding_edge/src/profile-generator-inl.h Mon Jul 1 07:57:58
2013
+++ /branches/bleeding_edge/src/profile-generator-inl.h Mon Jul 1 08:15:57
2013
@@ -56,6 +56,7 @@
resource_name_(resource_name),
line_number_(line_number),
shared_id_(0),
+ script_id_(v8::Script::kNoScriptId),
security_token_id_(security_token_id),
no_frame_ranges_(NULL) {
}
=======================================
--- /branches/bleeding_edge/src/profile-generator.cc Mon Jul 1 07:57:58
2013
+++ /branches/bleeding_edge/src/profile-generator.cc Mon Jul 1 08:15:57
2013
@@ -273,12 +273,13 @@
void ProfileNode::Print(int indent) {
- OS::Print("%5u %5u %*c %s%s [%d] #%d",
+ OS::Print("%5u %5u %*c %s%s [%d] #%d %d",
total_ticks_, self_ticks_,
indent, ' ',
entry_->name_prefix(),
entry_->name(),
entry_->security_token_id(),
+ entry_->script_id(),
id());
if (entry_->resource_name()[0] != '\0')
OS::Print(" %s:%d", entry_->resource_name(), entry_->line_number());
=======================================
--- /branches/bleeding_edge/src/profile-generator.h Mon Jul 1 07:57:58 2013
+++ /branches/bleeding_edge/src/profile-generator.h Mon Jul 1 08:15:57 2013
@@ -111,6 +111,8 @@
INLINE(const char* resource_name() const) { return resource_name_; }
INLINE(int line_number() const) { return line_number_; }
INLINE(void set_shared_id(int shared_id)) { shared_id_ = shared_id; }
+ INLINE(int script_id() const) { return script_id_; }
+ INLINE(void set_script_id(int script_id)) { script_id_ = script_id; }
INLINE(int security_token_id() const) { return security_token_id_; }
INLINE(static bool is_js_function_tag(Logger::LogEventsAndTags tag));
@@ -138,6 +140,7 @@
const char* resource_name_;
int line_number_;
int shared_id_;
+ int script_id_;
int security_token_id_;
List<OffsetRange>* no_frame_ranges_;
=======================================
--- /branches/bleeding_edge/test/cctest/test-profile-generator.cc Mon Jul
1 03:12:03 2013
+++ /branches/bleeding_edge/test/cctest/test-profile-generator.cc Mon Jul
1 08:15:57 2013
@@ -905,3 +905,62 @@
for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i)
i::DeleteArray(titles[i]);
}
+
+
+static const v8::CpuProfileNode* PickChild(const v8::CpuProfileNode*
parent,
+ const char* name) {
+ for (int i = 0; i < parent->GetChildrenCount(); ++i) {
+ const v8::CpuProfileNode* child = parent->GetChild(i);
+ v8::String::AsciiValue function_name(child->GetFunctionName());
+ if (strcmp(*function_name, name) == 0) return child;
+ }
+ return NULL;
+}
+
+
+TEST(ProfileNodeScriptId) {
+ // This test does not pass with inlining enabled since inlined functions
+ // don't appear in the stack trace.
+ i::FLAG_use_inlining = false;
+
+ const char* extensions[] = { "v8/profiler" };
+ v8::ExtensionConfiguration config(1, extensions);
+ LocalContext env(&config);
+ v8::HandleScope hs(env->GetIsolate());
+
+ v8::CpuProfiler* profiler = env->GetIsolate()->GetCpuProfiler();
+ CHECK_EQ(0, profiler->GetProfileCount());
+ v8::Handle<v8::Script> script_a = v8::Script::Compile(v8::String::New(
+ "function a() { startProfiling(); }\n"));
+ script_a->Run();
+ v8::Handle<v8::Script> script_b = v8::Script::Compile(v8::String::New(
+ "function b() { a(); }\n"
+ "b();\n"
+ "stopProfiling();\n"));
+ script_b->Run();
+ CHECK_EQ(1, profiler->GetProfileCount());
+ const v8::CpuProfile* profile = profiler->GetCpuProfile(0);
+ const v8::CpuProfileNode* current = profile->GetTopDownRoot();
+ reinterpret_cast<ProfileNode*>(
+ const_cast<v8::CpuProfileNode*>(current))->Print(0);
+ // The tree should look like this:
+ // (root)
+ // (anonymous function)
+ // b
+ // a
+ // There can also be:
+ // startProfiling
+ // if the sampler managed to get a tick.
+ current = PickChild(current,
i::ProfileGenerator::kAnonymousFunctionName);
+ CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
+
+ current = PickChild(current, "b");
+ CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
+ CHECK_EQ(script_b->GetId(), current->GetScriptId());
+
+ current = PickChild(current, "a");
+ CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
+ CHECK_EQ(script_a->GetId(), current->GetScriptId());
+}
+
+
--
--
v8-dev mailing list
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.