Chromium Code Reviews| Index: runtime/vm/profiler_service.cc |
| diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc |
| index 09d4d433f4bad784d0d5386bb35f39c79cf311b2..2ef7b813fe871925300718154c6c26cadfa533de 100644 |
| --- a/runtime/vm/profiler_service.cc |
| +++ b/runtime/vm/profiler_service.cc |
| @@ -5,6 +5,7 @@ |
| #include "vm/profiler_service.h" |
| #include "vm/growable_array.h" |
| +#include "vm/hash_map.h" |
| #include "vm/log.h" |
| #include "vm/native_symbol.h" |
| #include "vm/object.h" |
| @@ -18,8 +19,6 @@ namespace dart { |
| DECLARE_FLAG(int, max_profile_depth); |
| DECLARE_FLAG(int, profile_period); |
| -DEFINE_FLAG(bool, trace_profiler, false, "Trace profiler."); |
| - |
| #ifndef PRODUCT |
| class DeoptimizedCodeSet : public ZoneAllocated { |
| @@ -161,7 +160,7 @@ void ProfileFunction::TickSourcePosition(TokenPosition token_position, |
| for (; i < source_position_ticks_.length(); i++) { |
| ProfileFunctionSourcePosition& position = source_position_ticks_[i]; |
| if (position.token_pos().value() == token_position.value()) { |
| - if (FLAG_trace_profiler) { |
| + if (FLAG_trace_profiler_verbose) { |
| OS::Print("Ticking source position %s %s\n", |
| exclusive ? "exclusive" : "inclusive", |
| token_position.ToCString()); |
| @@ -177,7 +176,7 @@ void ProfileFunction::TickSourcePosition(TokenPosition token_position, |
| // Add new one, sorted by token position value. |
| ProfileFunctionSourcePosition pfsp(token_position); |
| - if (FLAG_trace_profiler) { |
| + if (FLAG_trace_profiler_verbose) { |
| OS::Print("Ticking source position %s %s\n", |
| exclusive ? "exclusive" : "inclusive", |
| token_position.ToCString()); |
| @@ -515,8 +514,8 @@ class ProfileFunctionTable : public ZoneAllocated { |
| public: |
| ProfileFunctionTable() |
| : null_function_(Function::ZoneHandle()), |
| - table_(8), |
| - unknown_function_(NULL) { |
| + unknown_function_(NULL), |
| + table_(8) { |
| unknown_function_ = Add(ProfileFunction::kUnknownFunction, |
| "<unknown Dart function>"); |
| } |
| @@ -530,15 +529,9 @@ class ProfileFunctionTable : public ZoneAllocated { |
| return Add(function); |
| } |
| - intptr_t LookupIndex(const Function& function) { |
| + ProfileFunction* Lookup(const Function& function) { |
| ASSERT(!function.IsNull()); |
| - for (intptr_t i = 0; i < table_.length(); i++) { |
| - ProfileFunction* profile_function = table_[i]; |
| - if (profile_function->function() == function.raw()) { |
| - return i; |
| - } |
| - } |
| - return -1; |
| + return function_hash_.Lookup(&function); |
| } |
| ProfileFunction* GetUnknown() { |
| @@ -595,21 +588,37 @@ class ProfileFunctionTable : public ZoneAllocated { |
| function, |
| table_.length()); |
| table_.Add(profile_function); |
| + function_hash_.Insert(profile_function); |
| return profile_function; |
| } |
| - ProfileFunction* Lookup(const Function& function) { |
| - ASSERT(!function.IsNull()); |
| - intptr_t index = LookupIndex(function); |
| - if (index == -1) { |
| - return NULL; |
| + // Needed for DirectChainedHashMap. |
| + struct ProfileFunctionTableTrait { |
| + typedef ProfileFunction* Value; |
| + typedef const Function* Key; |
| + typedef ProfileFunction* Pair; |
| + |
| + static Key KeyOf(Pair kv) { |
| + return kv->function(); |
| } |
| - return table_[index]; |
| - } |
| + |
| + static Value ValueOf(Pair kv) { |
| + return kv; |
| + } |
| + |
| + static inline intptr_t Hashcode(Key key) { |
| + return key->Hash(); |
| + } |
| + |
| + static inline bool IsKeyEqual(Pair kv, Key key) { |
| + return kv->function()->raw() == key->raw(); |
| + } |
| + }; |
| const Function& null_function_; |
| - ZoneGrowableArray<ProfileFunction*> table_; |
| ProfileFunction* unknown_function_; |
| + ZoneGrowableArray<ProfileFunction*> table_; |
| + DirectChainedHashMap<ProfileFunctionTableTrait> function_hash_; |
| }; |
| @@ -1498,7 +1507,7 @@ class ProfileBuilder : public ValueObject { |
| inlined_token_positions.InsertAt(0, token_position); |
| } |
| ASSERT(inlined_functions.length() <= inlined_token_positions.length()); |
| - if (FLAG_trace_profiler) { |
| + if (FLAG_trace_profiler_verbose) { |
| for (intptr_t i = 0; i < inlined_functions.length(); i++) { |
| const String& name = |
| String::Handle(inlined_functions[i]->QualifiedScrubbedName()); |
| @@ -1616,7 +1625,7 @@ class ProfileBuilder : public ValueObject { |
| TokenPosition token_position, |
| intptr_t code_index) { |
| if (tick_functions_) { |
| - if (FLAG_trace_profiler) { |
| + if (FLAG_trace_profiler_verbose) { |
| THR_Print("S[%" Pd "]F[%" Pd "] %s %s 0x%" Px "\n", |
| sample_index, |
| frame_index, |
| @@ -2259,11 +2268,7 @@ void Profile::PrintTimelineJSON(JSONStream* stream) { |
| ProfileFunction* Profile::FindFunction(const Function& function) { |
| - const intptr_t index = functions_->LookupIndex(function); |
| - if (index < 0) { |
| - return NULL; |
| - } |
| - return functions_->At(index); |
| + return functions_->Lookup(function); |
| } |
| @@ -2395,7 +2400,7 @@ const char* ProfileTrieWalker::CurrentToken() { |
| return NULL; |
| } |
| ProfileFunction* func = profile_->GetFunction(current_->table_index()); |
| - const Function& function = Function::Handle(func->function()); |
| + const Function& function = Function::Handle(func->function()->raw()); |
|
Ivan Posva
2016/03/24 22:21:29
Why do you need to allocate a new Function::Handle
|
| if (function.IsNull()) { |
| // No function. |
| return NULL; |