Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Unified Diff: runtime/vm/profiler_service.cc

Issue 1202943002: Begin transition to ProcessedSample in Profiler (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« runtime/vm/profiler.h ('K') | « runtime/vm/profiler.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/profiler_service.cc
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 9fd95f2c9d19e60505acf2d9017b91d91979974a..a0626ffe2b9e699c8fcdc5320f0378d737e930a1 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -17,7 +17,7 @@ namespace dart {
DECLARE_FLAG(int, profile_depth);
DECLARE_FLAG(int, profile_period);
-DEFINE_FLAG(bool, trace_profiler, false, "Trace profiler.");
+DEFINE_FLAG(bool, trace_profiler, true, "Trace profiler.");
rmacnak 2015/06/23 22:38:54 Revert to false.
Cutch 2015/06/24 13:54:34 Done.
// Forward declarations.
class CodeRegion;
@@ -384,7 +384,6 @@ class CodeRegion : public ZoneAllocated {
inclusive_tick_serial_(0),
name_(NULL),
compile_timestamp_(timestamp),
- creation_serial_(0),
code_(Code::ZoneHandle(code.raw())),
profile_function_(NULL),
code_table_index_(-1) {
@@ -425,10 +424,6 @@ class CodeRegion : public ZoneAllocated {
contains(other->end() - 1);
}
- intptr_t creation_serial() const { return creation_serial_; }
- void set_creation_serial(intptr_t serial) {
- creation_serial_ = serial;
- }
int64_t compile_timestamp() const { return compile_timestamp_; }
void set_compile_timestamp(int64_t timestamp) {
compile_timestamp_ = timestamp;
@@ -563,11 +558,10 @@ class CodeRegion : public ZoneAllocated {
}
void DebugPrint() const {
- OS::Print("%s [%" Px ", %" Px ") %" Pd " %" Pd64 "\n",
+ OS::Print("%s [%" Px ", %" Px ") %" Pd64 "\n",
KindToCString(kind_),
start(),
end(),
- creation_serial_,
compile_timestamp_);
}
@@ -739,8 +733,6 @@ class CodeRegion : public ZoneAllocated {
const char* name_;
// The compilation timestamp associated with this code region.
int64_t compile_timestamp_;
- // Serial number at which this CodeRegion was created.
- intptr_t creation_serial_;
// Dart code object (may be null).
const Code& code_;
// Pointer to ProfileFunction.
@@ -950,15 +942,14 @@ class CodeRegionTable : public ValueObject {
};
-class CodeRegionTableBuilder : public SampleVisitor {
+class CodeRegionTableBuilder {
public:
CodeRegionTableBuilder(Isolate* isolate,
CodeRegionTable* live_code_table,
CodeRegionTable* dead_code_table,
CodeRegionTable* tag_code_table,
DeoptimizedCodeSet* deoptimized_code)
- : SampleVisitor(isolate),
- live_code_table_(live_code_table),
+ : live_code_table_(live_code_table),
dead_code_table_(dead_code_table),
tag_code_table_(tag_code_table),
isolate_(isolate),
@@ -976,7 +967,7 @@ class CodeRegionTableBuilder : public SampleVisitor {
max_time_ = 0;
}
- void VisitSample(Sample* sample) {
+ void VisitSample(intptr_t index, ProcessedSample* sample) {
int64_t timestamp = sample->timestamp();
if (timestamp > max_time_) {
max_time_ = timestamp;
@@ -994,16 +985,23 @@ class CodeRegionTableBuilder : public SampleVisitor {
// Make sure user tag is created.
CreateUserTag(sample->user_tag());
// Exclusive tick for top frame if we aren't sampled from an exit frame.
- if (!sample->exit_frame_sample()) {
- Tick(sample->At(0), true, timestamp);
+ if (!sample->first_frame_executing()) {
+ Tick(sample->At(0), true, index, timestamp);
}
// Inclusive tick for all frames.
- for (intptr_t i = 0; i < FLAG_profile_depth; i++) {
+ for (intptr_t i = 0; i < sample->length(); i++) {
if (sample->At(i) == 0) {
break;
}
frames_++;
- Tick(sample->At(i), false, timestamp);
+ Tick(sample->At(i), false, index, timestamp);
+ }
+ }
+
+ void Build(ProcessedSampleBuffer* buffer) {
+ for (intptr_t i = 0; i < buffer->length(); i++) {
+ ProcessedSample* sample = buffer->At(i);
+ VisitSample(i, sample);
}
}
@@ -1028,7 +1026,6 @@ class CodeRegionTableBuilder : public SampleVisitor {
null_code_);
index = tag_code_table_->InsertCodeRegion(region);
ASSERT(index >= 0);
- region->set_creation_serial(visited());
}
void CreateUserTag(uword tag) {
@@ -1039,9 +1036,9 @@ class CodeRegionTableBuilder : public SampleVisitor {
return CreateTag(tag);
}
- void Tick(uword pc, bool exclusive, int64_t timestamp) {
+ void Tick(uword pc, bool exclusive, intptr_t sample_idx, int64_t timestamp) {
CodeRegionTable::TickResult r;
- intptr_t serial = exclusive ? -1 : visited();
+ intptr_t serial = exclusive ? -1 : sample_idx;
r = live_code_table_->Tick(pc, exclusive, serial, timestamp);
if (r == CodeRegionTable::kTicked) {
// Live code found and ticked.
@@ -1063,7 +1060,6 @@ class CodeRegionTableBuilder : public SampleVisitor {
// Create new live CodeRegion.
ASSERT(r == CodeRegionTable::kNotFound);
CodeRegion* region = CreateCodeRegion(pc);
- region->set_creation_serial(visited());
intptr_t index = live_code_table_->InsertCodeRegion(region);
ASSERT(index >= 0);
region = live_code_table_->At(index);
@@ -1085,7 +1081,6 @@ class CodeRegionTableBuilder : public SampleVisitor {
0,
null_code_);
intptr_t index = dead_code_table_->InsertCodeRegion(region);
- region->set_creation_serial(visited());
ASSERT(index >= 0);
dead_code_table_->At(index)->Tick(pc, exclusive, serial);
}
@@ -1198,7 +1193,6 @@ class CodeRegionFunctionMapper : public ValueObject {
null_code);
truncated_index = tag_code_table_->InsertCodeRegion(truncated);
ASSERT(truncated_index >= 0);
- truncated->set_creation_serial(0);
// Create the root tag.
intptr_t root_index = tag_code_table_->FindIndex(VMTag::kRootTagId);
@@ -1210,7 +1204,6 @@ class CodeRegionFunctionMapper : public ValueObject {
null_code);
root_index = tag_code_table_->InsertCodeRegion(root);
ASSERT(root_index >= 0);
- root->set_creation_serial(0);
}
void Map() {
@@ -1409,21 +1402,17 @@ class ProfileFunctionTrieNode : public ZoneAllocated {
};
-class ProfileFunctionTrieBuilder : public SampleVisitor {
+class ProfileFunctionTrieBuilder {
public:
- ProfileFunctionTrieBuilder(Isolate* isolate,
- CodeRegionTable* live_code_table,
+ ProfileFunctionTrieBuilder(CodeRegionTable* live_code_table,
CodeRegionTable* dead_code_table,
CodeRegionTable* tag_code_table,
ProfileFunctionTable* function_table)
- : SampleVisitor(isolate),
- live_code_table_(live_code_table),
+ : live_code_table_(live_code_table),
dead_code_table_(dead_code_table),
tag_code_table_(tag_code_table),
function_table_(function_table),
- inclusive_tree_(false),
- trace_(false),
- trace_code_filter_(NULL) {
+ inclusive_tree_(false) {
ASSERT(live_code_table_ != NULL);
ASSERT(dead_code_table_ != NULL);
ASSERT(tag_code_table_ != NULL);
@@ -1447,11 +1436,18 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
inclusive_root_ = new ProfileFunctionTrieNode(function->index());
}
- void VisitSample(Sample* sample) {
+ void VisitSample(intptr_t sample_idx, ProcessedSample* sample) {
inclusive_tree_ = false;
- ProcessSampleExclusive(sample);
+ ProcessSampleExclusive(sample_idx, sample);
inclusive_tree_ = true;
- ProcessSampleInclusive(sample);
+ ProcessSampleInclusive(sample_idx, sample);
+ }
+
+ void Build(ProcessedSampleBuffer* buffer) {
+ for (intptr_t i = 0; i < buffer->length(); i++) {
+ ProcessedSample* sample = buffer->At(i);
+ VisitSample(i, sample);
+ }
}
ProfileFunctionTrieNode* exclusive_root() const {
@@ -1477,54 +1473,52 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
}
private:
- void ProcessSampleInclusive(Sample* sample) {
+ void ProcessSampleInclusive(intptr_t sample_idx, ProcessedSample* sample) {
// Give the root a tick.
inclusive_root_->Tick();
ProfileFunctionTrieNode* current = inclusive_root_;
current = AppendTags(sample, current);
- if (sample->truncated_trace()) {
+ if (sample->truncated()) {
InclusiveTickTruncatedTag();
current = AppendTruncatedTag(current);
}
// Walk the sampled PCs.
- for (intptr_t i = FLAG_profile_depth - 1; i >= 0; i--) {
+ for (intptr_t i = sample->length() - 1; i >= 0; i--) {
if (sample->At(i) == 0) {
continue;
}
current = ProcessPC(sample->At(i),
sample->timestamp(),
current,
- visited(),
+ sample_idx,
(i == 0),
- sample->exit_frame_sample() && (i == 0),
- sample->missing_frame_inserted());
+ !sample->first_frame_executing() && (i == 0));
}
}
- void ProcessSampleExclusive(Sample* sample) {
+ void ProcessSampleExclusive(intptr_t sample_idx, ProcessedSample* sample) {
// Give the root a tick.
exclusive_root_->Tick();
ProfileFunctionTrieNode* current = exclusive_root_;
current = AppendTags(sample, current);
// Walk the sampled PCs.
- for (intptr_t i = 0; i < FLAG_profile_depth; i++) {
+ for (intptr_t i = 0; i < sample->length(); i++) {
if (sample->At(i) == 0) {
break;
}
current = ProcessPC(sample->At(i),
sample->timestamp(),
current,
- visited(),
+ sample_idx,
(i == 0),
- sample->exit_frame_sample() && (i == 0),
- sample->missing_frame_inserted());
+ !sample->first_frame_executing() && (i == 0));
}
- if (sample->truncated_trace()) {
+ if (sample->truncated()) {
current = AppendTruncatedTag(current);
}
}
- ProfileFunctionTrieNode* AppendUserTag(Sample* sample,
+ ProfileFunctionTrieNode* AppendUserTag(ProcessedSample* sample,
ProfileFunctionTrieNode* current) {
intptr_t user_tag_index = FindTagIndex(sample->user_tag());
if (user_tag_index >= 0) {
@@ -1552,7 +1546,7 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
function->inc_inclusive_ticks();
}
- ProfileFunctionTrieNode* AppendVMTag(Sample* sample,
+ ProfileFunctionTrieNode* AppendVMTag(ProcessedSample* sample,
ProfileFunctionTrieNode* current) {
if (VMTag::IsNativeEntryTag(sample->vm_tag())) {
// Insert a dummy kNativeTagId node.
@@ -1576,7 +1570,7 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
}
ProfileFunctionTrieNode* AppendSpecificNativeRuntimeEntryVMTag(
- Sample* sample, ProfileFunctionTrieNode* current) {
+ ProcessedSample* sample, ProfileFunctionTrieNode* current) {
// Only Native and Runtime entries have a second VM tag.
if (!VMTag::IsNativeEntryTag(sample->vm_tag()) &&
!VMTag::IsRuntimeEntryTag(sample->vm_tag())) {
@@ -1589,14 +1583,14 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
return current;
}
- ProfileFunctionTrieNode* AppendVMTags(Sample* sample,
+ ProfileFunctionTrieNode* AppendVMTags(ProcessedSample* sample,
ProfileFunctionTrieNode* current) {
current = AppendVMTag(sample, current);
current = AppendSpecificNativeRuntimeEntryVMTag(sample, current);
return current;
}
- ProfileFunctionTrieNode* AppendTags(Sample* sample,
+ ProfileFunctionTrieNode* AppendTags(ProcessedSample* sample,
ProfileFunctionTrieNode* current) {
// None.
if (tag_order() == ProfilerService::kNoTags) {
@@ -1653,8 +1647,7 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
ProfileFunctionTrieNode* current,
intptr_t inclusive_serial,
bool top_frame,
- bool exit_frame,
- bool missing_frame_inserted) {
+ bool exit_frame) {
CodeRegion* region = FindCodeObject(pc, timestamp);
if (region == NULL) {
return current;
@@ -1674,23 +1667,12 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
// No inlined functions.
ProfileFunction* function = region->function();
ASSERT(function != NULL);
- if (trace_) {
- OS::Print("[%" Px "] X - %s (%s)\n",
- pc, function->name(), region_name);
- }
current = ProcessFunction(function,
current,
inclusive_serial,
top_frame,
exit_frame,
code_index);
- if ((trace_code_filter_ != NULL) &&
- (strstr(region_name, trace_code_filter_) != NULL)) {
- trace_ = true;
- OS::Print("Tracing from: %" Px " [%s] ", pc,
- missing_frame_inserted ? "INSERTED" : "");
- Dump(current);
- }
return current;
}
@@ -1712,11 +1694,6 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
Function* inlined_function = inlined_functions[i];
ASSERT(inlined_function != NULL);
ASSERT(!inlined_function->IsNull());
- const char* inline_name = inlined_function->ToQualifiedCString();
- if (trace_) {
- OS::Print("[%" Px "] %" Pd " - %s (%s)\n",
- pc, i, inline_name, region_name);
- }
current = ProcessInlinedFunction(inlined_function,
current,
inclusive_serial,
@@ -1724,13 +1701,6 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
exit_frame,
code_index);
top_frame = false;
- if ((trace_code_filter_ != NULL) &&
- (strstr(region_name, trace_code_filter_) != NULL)) {
- trace_ = true;
- OS::Print("Tracing from: %" Px " [%s] ",
- pc, missing_frame_inserted ? "INSERTED" : "");
- Dump(current);
- }
}
}
@@ -1811,8 +1781,6 @@ class ProfileFunctionTrieBuilder : public SampleVisitor {
CodeRegionTable* tag_code_table_;
ProfileFunctionTable* function_table_;
bool inclusive_tree_;
- bool trace_;
- const char* trace_code_filter_;
};
@@ -1908,14 +1876,13 @@ class CodeRegionTrieNode : public ZoneAllocated {
};
-class CodeRegionTrieBuilder : public SampleVisitor {
+class CodeRegionTrieBuilder {
public:
CodeRegionTrieBuilder(Isolate* isolate,
CodeRegionTable* live_code_table,
CodeRegionTable* dead_code_table,
CodeRegionTable* tag_code_table)
- : SampleVisitor(isolate),
- live_code_table_(live_code_table),
+ : live_code_table_(live_code_table),
dead_code_table_(dead_code_table),
tag_code_table_(tag_code_table) {
ASSERT(live_code_table_ != NULL);
@@ -1936,11 +1903,18 @@ class CodeRegionTrieBuilder : public SampleVisitor {
inclusive_root_ = new CodeRegionTrieNode(region->code_table_index());
}
- void VisitSample(Sample* sample) {
+ void VisitSample(ProcessedSample* sample) {
ProcessSampleExclusive(sample);
ProcessSampleInclusive(sample);
}
+ void Build(ProcessedSampleBuffer* buffer) {
+ for (intptr_t i = 0; i < buffer->length(); i++) {
+ ProcessedSample* sample = buffer->At(i);
+ VisitSample(sample);
+ }
+ }
+
CodeRegionTrieNode* inclusive_root() const {
return inclusive_root_;
}
@@ -1964,16 +1938,16 @@ class CodeRegionTrieBuilder : public SampleVisitor {
}
private:
- void ProcessSampleInclusive(Sample* sample) {
+ void ProcessSampleInclusive(ProcessedSample* sample) {
// Give the root a tick.
inclusive_root_->Tick();
CodeRegionTrieNode* current = inclusive_root_;
current = AppendTags(sample, current);
- if (sample->truncated_trace()) {
+ if (sample->truncated()) {
current = AppendTruncatedTag(current);
}
// Walk the sampled PCs.
- for (intptr_t i = FLAG_profile_depth - 1; i >= 0; i--) {
+ for (intptr_t i = sample->length() - 1; i >= 0; i--) {
if (sample->At(i) == 0) {
continue;
}
@@ -1986,13 +1960,13 @@ class CodeRegionTrieBuilder : public SampleVisitor {
}
}
- void ProcessSampleExclusive(Sample* sample) {
+ void ProcessSampleExclusive(ProcessedSample* sample) {
// Give the root a tick.
exclusive_root_->Tick();
CodeRegionTrieNode* current = exclusive_root_;
current = AppendTags(sample, current);
// Walk the sampled PCs.
- for (intptr_t i = 0; i < FLAG_profile_depth; i++) {
+ for (intptr_t i = 0; i < sample->length(); i++) {
if (sample->At(i) == 0) {
break;
}
@@ -2003,7 +1977,7 @@ class CodeRegionTrieBuilder : public SampleVisitor {
current = current->GetChild(index);
if (i == 0) {
// Executing PC.
- if (!sample->exit_frame_sample() || vm_tags_emitted()) {
+ if (!sample->first_frame_executing() || vm_tags_emitted()) {
// Only tick if this isn't an exit frame or VM tags are emitted.
current->Tick();
}
@@ -2012,12 +1986,12 @@ class CodeRegionTrieBuilder : public SampleVisitor {
current->Tick();
}
}
- if (sample->truncated_trace()) {
+ if (sample->truncated()) {
current = AppendTruncatedTag(current);
}
}
- CodeRegionTrieNode* AppendUserTag(Sample* sample,
+ CodeRegionTrieNode* AppendUserTag(ProcessedSample* sample,
CodeRegionTrieNode* current) {
intptr_t user_tag_index = FindTagIndex(sample->user_tag());
if (user_tag_index >= 0) {
@@ -2036,7 +2010,7 @@ class CodeRegionTrieBuilder : public SampleVisitor {
return current;
}
- CodeRegionTrieNode* AppendVMTag(Sample* sample,
+ CodeRegionTrieNode* AppendVMTag(ProcessedSample* sample,
CodeRegionTrieNode* current) {
if (VMTag::IsNativeEntryTag(sample->vm_tag())) {
// Insert a dummy kNativeTagId node.
@@ -2060,7 +2034,7 @@ class CodeRegionTrieBuilder : public SampleVisitor {
}
CodeRegionTrieNode* AppendSpecificNativeRuntimeEntryVMTag(
- Sample* sample, CodeRegionTrieNode* current) {
+ ProcessedSample* sample, CodeRegionTrieNode* current) {
// Only Native and Runtime entries have a second VM tag.
if (!VMTag::IsNativeEntryTag(sample->vm_tag()) &&
!VMTag::IsRuntimeEntryTag(sample->vm_tag())) {
@@ -2073,14 +2047,15 @@ class CodeRegionTrieBuilder : public SampleVisitor {
return current;
}
- CodeRegionTrieNode* AppendVMTags(Sample* sample,
+ CodeRegionTrieNode* AppendVMTags(ProcessedSample* sample,
CodeRegionTrieNode* current) {
current = AppendVMTag(sample, current);
current = AppendSpecificNativeRuntimeEntryVMTag(sample, current);
return current;
}
- CodeRegionTrieNode* AppendTags(Sample* sample, CodeRegionTrieNode* current) {
+ CodeRegionTrieNode* AppendTags(ProcessedSample* sample,
+ CodeRegionTrieNode* current) {
// None.
if (tag_order() == ProfilerService::kNoTags) {
return current;
@@ -2175,6 +2150,14 @@ void ProfilerService::PrintJSON(JSONStream* stream, TagOrder tag_order) {
{
StackZone zone(isolate);
HANDLESCOPE(isolate);
+
+ ProcessedSampleBuffer* processed_samples = NULL;
+ {
+ ScopeTimer sw("BuildProcessedSampleBuffer", FLAG_trace_profiler);
+ SampleFilter filter(isolate);
+ processed_samples = sample_buffer->BuildProcessedSampleBuffer(&filter);
+ }
+
{
// Live code holds Dart, Native, and Collected CodeRegions.
CodeRegionTable live_code_table;
@@ -2187,13 +2170,6 @@ void ProfilerService::PrintJSON(JSONStream* stream, TagOrder tag_order) {
// Set of deoptimized code still referenced by the profiler.
DeoptimizedCodeSet* deoptimized_code = new DeoptimizedCodeSet(isolate);
- {
- ScopeTimer sw("PreprocessSamples", FLAG_trace_profiler);
- // Preprocess samples.
- PreprocessVisitor preprocessor(isolate);
- sample_buffer->VisitSamples(&preprocessor);
- }
-
// Build CodeRegion tables.
CodeRegionTableBuilder builder(isolate,
&live_code_table,
@@ -2201,10 +2177,10 @@ void ProfilerService::PrintJSON(JSONStream* stream, TagOrder tag_order) {
&tag_code_table,
deoptimized_code);
{
- ScopeTimer sw("CodeRegionTableBuilder", FLAG_trace_profiler);
- sample_buffer->VisitSamples(&builder);
+ ScopeTimer sw("CodeRegionTableBuilder::Build", FLAG_trace_profiler);
+ builder.Build(processed_samples);
}
- intptr_t samples = builder.visited();
+ intptr_t samples = processed_samples->length();
intptr_t frames = builder.frames();
if (FLAG_trace_profiler) {
intptr_t total_live_code_objects = live_code_table.Length();
@@ -2244,8 +2220,8 @@ void ProfilerService::PrintJSON(JSONStream* stream, TagOrder tag_order) {
code_trie_builder.set_tag_order(tag_order);
{
// Build CodeRegion trie.
- ScopeTimer sw("CodeRegionTrieBuilder", FLAG_trace_profiler);
- sample_buffer->VisitSamples(&code_trie_builder);
+ ScopeTimer sw("CodeRegionTrieBuilder::Build", FLAG_trace_profiler);
+ code_trie_builder.Build(processed_samples);
code_trie_builder.exclusive_root()->SortByCount();
code_trie_builder.inclusive_root()->SortByCount();
}
@@ -2254,17 +2230,16 @@ void ProfilerService::PrintJSON(JSONStream* stream, TagOrder tag_order) {
code_trie_builder.exclusive_root()->count(),
code_trie_builder.inclusive_root()->count());
}
- ProfileFunctionTrieBuilder function_trie_builder(isolate,
- &live_code_table,
+ ProfileFunctionTrieBuilder function_trie_builder(&live_code_table,
&dead_code_table,
&tag_code_table,
&function_table);
function_trie_builder.set_tag_order(tag_order);
{
// Build ProfileFunction trie.
- ScopeTimer sw("ProfileFunctionTrieBuilder",
+ ScopeTimer sw("ProfileFunctionTrieBuilder::Build",
FLAG_trace_profiler);
- sample_buffer->VisitSamples(&function_trie_builder);
+ function_trie_builder.Build(processed_samples);
function_trie_builder.exclusive_root()->SortByCount();
function_trie_builder.inclusive_root()->SortByCount();
}
« runtime/vm/profiler.h ('K') | « runtime/vm/profiler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698