OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 26 matching lines...) Expand all Loading... |
37 using i::CodeEntry; | 37 using i::CodeEntry; |
38 using i::CpuProfile; | 38 using i::CpuProfile; |
39 using i::CpuProfiler; | 39 using i::CpuProfiler; |
40 using i::CpuProfilesCollection; | 40 using i::CpuProfilesCollection; |
41 using i::Heap; | 41 using i::Heap; |
42 using i::ProfileGenerator; | 42 using i::ProfileGenerator; |
43 using i::ProfileNode; | 43 using i::ProfileNode; |
44 using i::ProfilerEventsProcessor; | 44 using i::ProfilerEventsProcessor; |
45 using i::ScopedVector; | 45 using i::ScopedVector; |
46 using i::SmartPointer; | 46 using i::SmartPointer; |
| 47 using i::TimeDelta; |
47 using i::Vector; | 48 using i::Vector; |
48 | 49 |
49 | 50 |
50 TEST(StartStop) { | 51 TEST(StartStop) { |
51 CpuProfilesCollection profiles; | 52 CpuProfilesCollection profiles; |
52 ProfileGenerator generator(&profiles); | 53 ProfileGenerator generator(&profiles); |
53 SmartPointer<ProfilerEventsProcessor> processor( | 54 SmartPointer<ProfilerEventsProcessor> processor(new ProfilerEventsProcessor( |
54 new ProfilerEventsProcessor(&generator, NULL, 100)); | 55 &generator, NULL, TimeDelta::FromMicroseconds(100))); |
55 processor->Start(); | 56 processor->Start(); |
56 processor->StopSynchronously(); | 57 processor->StopSynchronously(); |
57 } | 58 } |
58 | 59 |
59 | 60 |
60 static inline i::Address ToAddress(int n) { | 61 static inline i::Address ToAddress(int n) { |
61 return reinterpret_cast<i::Address>(n); | 62 return reinterpret_cast<i::Address>(n); |
62 } | 63 } |
63 | 64 |
64 static void EnqueueTickSampleEvent(ProfilerEventsProcessor* proc, | 65 static void EnqueueTickSampleEvent(ProfilerEventsProcessor* proc, |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 i::Code* comment_code = CreateCode(&env); | 136 i::Code* comment_code = CreateCode(&env); |
136 i::Code* args5_code = CreateCode(&env); | 137 i::Code* args5_code = CreateCode(&env); |
137 i::Code* comment2_code = CreateCode(&env); | 138 i::Code* comment2_code = CreateCode(&env); |
138 i::Code* moved_code = CreateCode(&env); | 139 i::Code* moved_code = CreateCode(&env); |
139 i::Code* args3_code = CreateCode(&env); | 140 i::Code* args3_code = CreateCode(&env); |
140 i::Code* args4_code = CreateCode(&env); | 141 i::Code* args4_code = CreateCode(&env); |
141 | 142 |
142 CpuProfilesCollection* profiles = new CpuProfilesCollection; | 143 CpuProfilesCollection* profiles = new CpuProfilesCollection; |
143 profiles->StartProfiling("", 1, false); | 144 profiles->StartProfiling("", 1, false); |
144 ProfileGenerator generator(profiles); | 145 ProfileGenerator generator(profiles); |
145 SmartPointer<ProfilerEventsProcessor> processor( | 146 SmartPointer<ProfilerEventsProcessor> processor(new ProfilerEventsProcessor( |
146 new ProfilerEventsProcessor(&generator, NULL, 100)); | 147 &generator, NULL, TimeDelta::FromMicroseconds(100))); |
147 processor->Start(); | 148 processor->Start(); |
148 CpuProfiler profiler(isolate, profiles, &generator, *processor); | 149 CpuProfiler profiler(isolate, profiles, &generator, *processor); |
149 | 150 |
150 // Enqueue code creation events. | 151 // Enqueue code creation events. |
151 const char* aaa_str = "aaa"; | 152 const char* aaa_str = "aaa"; |
152 i::Handle<i::String> aaa_name = factory->NewStringFromAscii( | 153 i::Handle<i::String> aaa_name = factory->NewStringFromAscii( |
153 i::Vector<const char>(aaa_str, i::StrLength(aaa_str))); | 154 i::Vector<const char>(aaa_str, i::StrLength(aaa_str))); |
154 profiler.CodeCreateEvent(i::Logger::FUNCTION_TAG, aaa_code, *aaa_name); | 155 profiler.CodeCreateEvent(i::Logger::FUNCTION_TAG, aaa_code, *aaa_name); |
155 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, comment_code, "comment"); | 156 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, comment_code, "comment"); |
156 profiler.CodeCreateEvent(i::Logger::STUB_TAG, args5_code, 5); | 157 profiler.CodeCreateEvent(i::Logger::STUB_TAG, args5_code, 5); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 i::Isolate* isolate = i::Isolate::Current(); | 198 i::Isolate* isolate = i::Isolate::Current(); |
198 i::HandleScope scope(isolate); | 199 i::HandleScope scope(isolate); |
199 | 200 |
200 i::Code* frame1_code = CreateCode(&env); | 201 i::Code* frame1_code = CreateCode(&env); |
201 i::Code* frame2_code = CreateCode(&env); | 202 i::Code* frame2_code = CreateCode(&env); |
202 i::Code* frame3_code = CreateCode(&env); | 203 i::Code* frame3_code = CreateCode(&env); |
203 | 204 |
204 CpuProfilesCollection* profiles = new CpuProfilesCollection; | 205 CpuProfilesCollection* profiles = new CpuProfilesCollection; |
205 profiles->StartProfiling("", 1, false); | 206 profiles->StartProfiling("", 1, false); |
206 ProfileGenerator generator(profiles); | 207 ProfileGenerator generator(profiles); |
207 SmartPointer<ProfilerEventsProcessor> processor( | 208 SmartPointer<ProfilerEventsProcessor> processor(new ProfilerEventsProcessor( |
208 new ProfilerEventsProcessor(&generator, NULL, 100)); | 209 &generator, NULL, TimeDelta::FromMicroseconds(100))); |
209 processor->Start(); | 210 processor->Start(); |
210 CpuProfiler profiler(isolate, profiles, &generator, *processor); | 211 CpuProfiler profiler(isolate, profiles, &generator, *processor); |
211 | 212 |
212 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, frame1_code, "bbb"); | 213 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, frame1_code, "bbb"); |
213 profiler.CodeCreateEvent(i::Logger::STUB_TAG, frame2_code, 5); | 214 profiler.CodeCreateEvent(i::Logger::STUB_TAG, frame2_code, 5); |
214 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, frame3_code, "ddd"); | 215 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, frame3_code, "ddd"); |
215 | 216 |
216 EnqueueTickSampleEvent(*processor, frame1_code->instruction_start()); | 217 EnqueueTickSampleEvent(*processor, frame1_code->instruction_start()); |
217 EnqueueTickSampleEvent( | 218 EnqueueTickSampleEvent( |
218 *processor, | 219 *processor, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 TestSetup test_setup; | 267 TestSetup test_setup; |
267 LocalContext env; | 268 LocalContext env; |
268 i::Isolate* isolate = i::Isolate::Current(); | 269 i::Isolate* isolate = i::Isolate::Current(); |
269 i::HandleScope scope(isolate); | 270 i::HandleScope scope(isolate); |
270 | 271 |
271 i::Code* code = CreateCode(&env); | 272 i::Code* code = CreateCode(&env); |
272 | 273 |
273 CpuProfilesCollection* profiles = new CpuProfilesCollection; | 274 CpuProfilesCollection* profiles = new CpuProfilesCollection; |
274 profiles->StartProfiling("", 1, false); | 275 profiles->StartProfiling("", 1, false); |
275 ProfileGenerator generator(profiles); | 276 ProfileGenerator generator(profiles); |
276 SmartPointer<ProfilerEventsProcessor> processor( | 277 SmartPointer<ProfilerEventsProcessor> processor(new ProfilerEventsProcessor( |
277 new ProfilerEventsProcessor(&generator, NULL, 100)); | 278 &generator, NULL, TimeDelta::FromMicroseconds(100))); |
278 processor->Start(); | 279 processor->Start(); |
279 CpuProfiler profiler(isolate, profiles, &generator, *processor); | 280 CpuProfiler profiler(isolate, profiles, &generator, *processor); |
280 | 281 |
281 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, code, "bbb"); | 282 profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, code, "bbb"); |
282 | 283 |
283 i::TickSample* sample = processor->StartTickSample(); | 284 i::TickSample* sample = processor->StartTickSample(); |
284 sample->pc = code->address(); | 285 sample->pc = code->address(); |
285 sample->tos = 0; | 286 sample->tos = 0; |
286 sample->frames_count = i::TickSample::kMaxFramesCount; | 287 sample->frames_count = i::TickSample::kMaxFramesCount; |
287 for (int i = 0; i < sample->frames_count; ++i) { | 288 for (int i = 0; i < sample->frames_count; ++i) { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 isolate->Dispose(); | 413 isolate->Dispose(); |
413 CHECK_EQ(NULL, isolate->GetCpuProfiler()); | 414 CHECK_EQ(NULL, isolate->GetCpuProfiler()); |
414 } | 415 } |
415 | 416 |
416 | 417 |
417 TEST(ProfileStartEndTime) { | 418 TEST(ProfileStartEndTime) { |
418 LocalContext env; | 419 LocalContext env; |
419 v8::HandleScope scope(env->GetIsolate()); | 420 v8::HandleScope scope(env->GetIsolate()); |
420 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | 421 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
421 | 422 |
422 int64_t time_before_profiling = i::OS::Ticks(); | |
423 v8::Local<v8::String> profile_name = v8::String::New("test"); | 423 v8::Local<v8::String> profile_name = v8::String::New("test"); |
424 cpu_profiler->StartCpuProfiling(profile_name); | 424 cpu_profiler->StartCpuProfiling(profile_name); |
425 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 425 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); |
426 CHECK(time_before_profiling <= profile->GetStartTime()); | |
427 CHECK(profile->GetStartTime() <= profile->GetEndTime()); | 426 CHECK(profile->GetStartTime() <= profile->GetEndTime()); |
428 CHECK(profile->GetEndTime() <= i::OS::Ticks()); | |
429 } | 427 } |
430 | 428 |
431 | 429 |
432 static const v8::CpuProfile* RunProfiler( | 430 static const v8::CpuProfile* RunProfiler( |
433 LocalContext& env, v8::Handle<v8::Function> function, | 431 LocalContext& env, v8::Handle<v8::Function> function, |
434 v8::Handle<v8::Value> argv[], int argc, | 432 v8::Handle<v8::Value> argv[], int argc, |
435 unsigned min_js_samples) { | 433 unsigned min_js_samples) { |
436 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | 434 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
437 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | 435 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); |
438 | 436 |
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 CHECK_EQ(0, programNode->GetChildrenCount()); | 1372 CHECK_EQ(0, programNode->GetChildrenCount()); |
1375 CHECK_GE(programNode->GetHitCount(), 3); | 1373 CHECK_GE(programNode->GetHitCount(), 3); |
1376 | 1374 |
1377 const v8::CpuProfileNode* idleNode = | 1375 const v8::CpuProfileNode* idleNode = |
1378 GetChild(root, ProfileGenerator::kIdleEntryName); | 1376 GetChild(root, ProfileGenerator::kIdleEntryName); |
1379 CHECK_EQ(0, idleNode->GetChildrenCount()); | 1377 CHECK_EQ(0, idleNode->GetChildrenCount()); |
1380 CHECK_GE(idleNode->GetHitCount(), 3); | 1378 CHECK_GE(idleNode->GetHitCount(), 3); |
1381 | 1379 |
1382 cpu_profiler->DeleteAllCpuProfiles(); | 1380 cpu_profiler->DeleteAllCpuProfiles(); |
1383 } | 1381 } |
OLD | NEW |