| 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 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 isolate->GetCpuProfiler()->StartCpuProfiling(v8::String::New("Test")); | 465 isolate->GetCpuProfiler()->StartCpuProfiling(v8::String::New("Test")); |
| 466 isolate->GetCpuProfiler()->StopCpuProfiling(v8::String::New("Test")); | 466 isolate->GetCpuProfiler()->StopCpuProfiling(v8::String::New("Test")); |
| 467 } | 467 } |
| 468 CHECK(i::Isolate::Current()->IsInitialized()); | 468 CHECK(i::Isolate::Current()->IsInitialized()); |
| 469 CHECK_NE(NULL, isolate->GetCpuProfiler()); | 469 CHECK_NE(NULL, isolate->GetCpuProfiler()); |
| 470 isolate->Dispose(); | 470 isolate->Dispose(); |
| 471 CHECK_EQ(NULL, isolate->GetCpuProfiler()); | 471 CHECK_EQ(NULL, isolate->GetCpuProfiler()); |
| 472 } | 472 } |
| 473 | 473 |
| 474 | 474 |
| 475 static const v8::CpuProfile* RunProfiler( |
| 476 LocalContext& env, v8::Handle<v8::Function> function, |
| 477 v8::Handle<v8::Value> argv[], int argc, |
| 478 unsigned min_js_samples) { |
| 479 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 480 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); |
| 481 |
| 482 cpu_profiler->StartCpuProfiling(profile_name); |
| 483 |
| 484 i::Sampler* sampler = |
| 485 reinterpret_cast<i::Isolate*>(env->GetIsolate())->logger()->sampler(); |
| 486 sampler->StartCountingSamples(); |
| 487 do { |
| 488 function->Call(env->Global(), argc, argv); |
| 489 } while (sampler->js_and_external_sample_count() < min_js_samples); |
| 490 |
| 491 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); |
| 492 |
| 493 CHECK_NE(NULL, profile); |
| 494 // Dump collected profile to have a better diagnostic in case of failure. |
| 495 reinterpret_cast<i::CpuProfile*>( |
| 496 const_cast<v8::CpuProfile*>(profile))->Print(); |
| 497 |
| 498 return profile; |
| 499 } |
| 500 |
| 501 |
| 475 static bool ContainsString(v8::Handle<v8::String> string, | 502 static bool ContainsString(v8::Handle<v8::String> string, |
| 476 const Vector<v8::Handle<v8::String> >& vector) { | 503 const Vector<v8::Handle<v8::String> >& vector) { |
| 477 for (int i = 0; i < vector.length(); i++) { | 504 for (int i = 0; i < vector.length(); i++) { |
| 478 if (string->Equals(vector[i])) | 505 if (string->Equals(vector[i])) |
| 479 return true; | 506 return true; |
| 480 } | 507 } |
| 481 return false; | 508 return false; |
| 482 } | 509 } |
| 483 | 510 |
| 484 | 511 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 // 2 2 (program) [-1] | 605 // 2 2 (program) [-1] |
| 579 // 6 6 (garbage collector) [-1] | 606 // 6 6 (garbage collector) [-1] |
| 580 TEST(CollectCpuProfile) { | 607 TEST(CollectCpuProfile) { |
| 581 LocalContext env; | 608 LocalContext env; |
| 582 v8::HandleScope scope(env->GetIsolate()); | 609 v8::HandleScope scope(env->GetIsolate()); |
| 583 | 610 |
| 584 v8::Script::Compile(v8::String::New(cpu_profiler_test_source))->Run(); | 611 v8::Script::Compile(v8::String::New(cpu_profiler_test_source))->Run(); |
| 585 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 612 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
| 586 env->Global()->Get(v8::String::New("start"))); | 613 env->Global()->Get(v8::String::New("start"))); |
| 587 | 614 |
| 588 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 589 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 590 | |
| 591 cpu_profiler->StartCpuProfiling(profile_name); | |
| 592 int32_t profiling_interval_ms = 200; | 615 int32_t profiling_interval_ms = 200; |
| 593 #if defined(_WIN32) || defined(_WIN64) | |
| 594 // 200ms is not enough on Windows. See | |
| 595 // https://code.google.com/p/v8/issues/detail?id=2628 | |
| 596 profiling_interval_ms = 500; | |
| 597 #endif | |
| 598 v8::Handle<v8::Value> args[] = { v8::Integer::New(profiling_interval_ms) }; | 616 v8::Handle<v8::Value> args[] = { v8::Integer::New(profiling_interval_ms) }; |
| 617 const v8::CpuProfile* profile = |
| 618 RunProfiler(env, function, args, ARRAY_SIZE(args), 200); |
| 599 function->Call(env->Global(), ARRAY_SIZE(args), args); | 619 function->Call(env->Global(), ARRAY_SIZE(args), args); |
| 600 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | |
| 601 | |
| 602 CHECK_NE(NULL, profile); | |
| 603 // Dump collected profile to have a better diagnostic in case of failure. | |
| 604 reinterpret_cast<i::CpuProfile*>( | |
| 605 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 606 | 620 |
| 607 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 621 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 608 | 622 |
| 609 ScopedVector<v8::Handle<v8::String> > names(3); | 623 ScopedVector<v8::Handle<v8::String> > names(3); |
| 610 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); | 624 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); |
| 611 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); | 625 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); |
| 612 names[2] = v8::String::New("start"); | 626 names[2] = v8::String::New("start"); |
| 613 CheckChildrenNames(root, names); | 627 CheckChildrenNames(root, names); |
| 614 | 628 |
| 615 const v8::CpuProfileNode* startNode = GetChild(root, "start"); | 629 const v8::CpuProfileNode* startNode = GetChild(root, "start"); |
| 616 CHECK_EQ(1, startNode->GetChildrenCount()); | 630 CHECK_EQ(1, startNode->GetChildrenCount()); |
| 617 | 631 |
| 618 const v8::CpuProfileNode* fooNode = GetChild(startNode, "foo"); | 632 const v8::CpuProfileNode* fooNode = GetChild(startNode, "foo"); |
| 619 CHECK_EQ(3, fooNode->GetChildrenCount()); | 633 CHECK_EQ(3, fooNode->GetChildrenCount()); |
| 620 | 634 |
| 621 const char* barBranch[] = { "bar", "delay", "loop" }; | 635 const char* barBranch[] = { "bar", "delay", "loop" }; |
| 622 CheckSimpleBranch(fooNode, barBranch, ARRAY_SIZE(barBranch)); | 636 CheckSimpleBranch(fooNode, barBranch, ARRAY_SIZE(barBranch)); |
| 623 const char* bazBranch[] = { "baz", "delay", "loop" }; | 637 const char* bazBranch[] = { "baz", "delay", "loop" }; |
| 624 CheckSimpleBranch(fooNode, bazBranch, ARRAY_SIZE(bazBranch)); | 638 CheckSimpleBranch(fooNode, bazBranch, ARRAY_SIZE(bazBranch)); |
| 625 const char* delayBranch[] = { "delay", "loop" }; | 639 const char* delayBranch[] = { "delay", "loop" }; |
| 626 CheckSimpleBranch(fooNode, delayBranch, ARRAY_SIZE(delayBranch)); | 640 CheckSimpleBranch(fooNode, delayBranch, ARRAY_SIZE(delayBranch)); |
| 627 | 641 |
| 642 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 628 cpu_profiler->DeleteAllCpuProfiles(); | 643 cpu_profiler->DeleteAllCpuProfiles(); |
| 629 } | 644 } |
| 630 | 645 |
| 631 | 646 |
| 632 | 647 |
| 633 static const char* cpu_profiler_test_source2 = "function loop() {}\n" | 648 static const char* cpu_profiler_test_source2 = "function loop() {}\n" |
| 634 "function delay() { loop(); }\n" | 649 "function delay() { loop(); }\n" |
| 635 "function start(count) {\n" | 650 "function start(count) {\n" |
| 636 " var k = 0;\n" | 651 " var k = 0;\n" |
| 637 " do {\n" | 652 " do {\n" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 651 // 16 16 loop [-1] #5 | 666 // 16 16 loop [-1] #5 |
| 652 // 14 14 (program) [-1] #2 | 667 // 14 14 (program) [-1] #2 |
| 653 TEST(SampleWhenFrameIsNotSetup) { | 668 TEST(SampleWhenFrameIsNotSetup) { |
| 654 LocalContext env; | 669 LocalContext env; |
| 655 v8::HandleScope scope(env->GetIsolate()); | 670 v8::HandleScope scope(env->GetIsolate()); |
| 656 | 671 |
| 657 v8::Script::Compile(v8::String::New(cpu_profiler_test_source2))->Run(); | 672 v8::Script::Compile(v8::String::New(cpu_profiler_test_source2))->Run(); |
| 658 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 673 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
| 659 env->Global()->Get(v8::String::New("start"))); | 674 env->Global()->Get(v8::String::New("start"))); |
| 660 | 675 |
| 661 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 662 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 663 | |
| 664 cpu_profiler->StartCpuProfiling(profile_name); | |
| 665 int32_t repeat_count = 100; | 676 int32_t repeat_count = 100; |
| 666 #if defined(USE_SIMULATOR) | 677 #if defined(USE_SIMULATOR) |
| 667 // Simulators are much slower. | 678 // Simulators are much slower. |
| 668 repeat_count = 1; | 679 repeat_count = 1; |
| 669 #endif | 680 #endif |
| 670 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; | 681 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; |
| 671 function->Call(env->Global(), ARRAY_SIZE(args), args); | 682 const v8::CpuProfile* profile = |
| 672 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 683 RunProfiler(env, function, args, ARRAY_SIZE(args), 100); |
| 673 | |
| 674 CHECK_NE(NULL, profile); | |
| 675 // Dump collected profile to have a better diagnostic in case of failure. | |
| 676 reinterpret_cast<i::CpuProfile*>( | |
| 677 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 678 | 684 |
| 679 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 685 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 680 | 686 |
| 681 ScopedVector<v8::Handle<v8::String> > names(3); | 687 ScopedVector<v8::Handle<v8::String> > names(3); |
| 682 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); | 688 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); |
| 683 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); | 689 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); |
| 684 names[2] = v8::String::New("start"); | 690 names[2] = v8::String::New("start"); |
| 685 CheckChildrenNames(root, names); | 691 CheckChildrenNames(root, names); |
| 686 | 692 |
| 687 const v8::CpuProfileNode* startNode = FindChild(root, "start"); | 693 const v8::CpuProfileNode* startNode = FindChild(root, "start"); |
| 688 // On slow machines there may be no meaningfull samples at all, skip the | 694 // On slow machines there may be no meaningfull samples at all, skip the |
| 689 // check there. | 695 // check there. |
| 690 if (startNode && startNode->GetChildrenCount() > 0) { | 696 if (startNode && startNode->GetChildrenCount() > 0) { |
| 691 CHECK_EQ(1, startNode->GetChildrenCount()); | 697 CHECK_EQ(1, startNode->GetChildrenCount()); |
| 692 const v8::CpuProfileNode* delayNode = GetChild(startNode, "delay"); | 698 const v8::CpuProfileNode* delayNode = GetChild(startNode, "delay"); |
| 693 if (delayNode->GetChildrenCount() > 0) { | 699 if (delayNode->GetChildrenCount() > 0) { |
| 694 CHECK_EQ(1, delayNode->GetChildrenCount()); | 700 CHECK_EQ(1, delayNode->GetChildrenCount()); |
| 695 GetChild(delayNode, "loop"); | 701 GetChild(delayNode, "loop"); |
| 696 } | 702 } |
| 697 } | 703 } |
| 698 | 704 |
| 705 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 699 cpu_profiler->DeleteAllCpuProfiles(); | 706 cpu_profiler->DeleteAllCpuProfiles(); |
| 700 } | 707 } |
| 701 | 708 |
| 702 | 709 |
| 703 static const char* native_accessor_test_source = "function start(count) {\n" | 710 static const char* native_accessor_test_source = "function start(count) {\n" |
| 704 " for (var i = 0; i < count; i++) {\n" | 711 " for (var i = 0; i < count; i++) {\n" |
| 705 " var o = instance.foo;\n" | 712 " var o = instance.foo;\n" |
| 706 " instance.foo = o + 1;\n" | 713 " instance.foo = o + 1;\n" |
| 707 " }\n" | 714 " }\n" |
| 708 "}\n"; | 715 "}\n"; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 v8::String::New("foo"), &TestApiCallbacks::Getter, | 788 v8::String::New("foo"), &TestApiCallbacks::Getter, |
| 782 &TestApiCallbacks::Setter, data); | 789 &TestApiCallbacks::Setter, data); |
| 783 v8::Local<v8::Function> func = func_template->GetFunction(); | 790 v8::Local<v8::Function> func = func_template->GetFunction(); |
| 784 v8::Local<v8::Object> instance = func->NewInstance(); | 791 v8::Local<v8::Object> instance = func->NewInstance(); |
| 785 env->Global()->Set(v8::String::New("instance"), instance); | 792 env->Global()->Set(v8::String::New("instance"), instance); |
| 786 | 793 |
| 787 v8::Script::Compile(v8::String::New(native_accessor_test_source))->Run(); | 794 v8::Script::Compile(v8::String::New(native_accessor_test_source))->Run(); |
| 788 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 795 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
| 789 env->Global()->Get(v8::String::New("start"))); | 796 env->Global()->Get(v8::String::New("start"))); |
| 790 | 797 |
| 791 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 792 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 793 | |
| 794 cpu_profiler->StartCpuProfiling(profile_name); | |
| 795 int32_t repeat_count = 1; | 798 int32_t repeat_count = 1; |
| 796 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; | 799 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; |
| 797 function->Call(env->Global(), ARRAY_SIZE(args), args); | 800 const v8::CpuProfile* profile = |
| 798 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 801 RunProfiler(env, function, args, ARRAY_SIZE(args), 180); |
| 799 | |
| 800 CHECK_NE(NULL, profile); | |
| 801 // Dump collected profile to have a better diagnostic in case of failure. | |
| 802 reinterpret_cast<i::CpuProfile*>( | |
| 803 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 804 | 802 |
| 805 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 803 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 806 const v8::CpuProfileNode* startNode = GetChild(root, "start"); | 804 const v8::CpuProfileNode* startNode = GetChild(root, "start"); |
| 807 GetChild(startNode, "get foo"); | 805 GetChild(startNode, "get foo"); |
| 808 GetChild(startNode, "set foo"); | 806 GetChild(startNode, "set foo"); |
| 809 | 807 |
| 808 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 810 cpu_profiler->DeleteAllCpuProfiles(); | 809 cpu_profiler->DeleteAllCpuProfiles(); |
| 811 } | 810 } |
| 812 | 811 |
| 813 | 812 |
| 814 // Test that native accessors are properly reported in the CPU profile. | 813 // Test that native accessors are properly reported in the CPU profile. |
| 815 // This test makes sure that the accessors are called enough times to become | 814 // This test makes sure that the accessors are called enough times to become |
| 816 // hot and to trigger optimizations. | 815 // hot and to trigger optimizations. |
| 817 TEST(NativeAccessorMonomorphicIC) { | 816 TEST(NativeAccessorMonomorphicIC) { |
| 818 LocalContext env; | 817 LocalContext env; |
| 819 v8::HandleScope scope(env->GetIsolate()); | 818 v8::HandleScope scope(env->GetIsolate()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 839 { | 838 { |
| 840 // Make sure accessors ICs are in monomorphic state before starting | 839 // Make sure accessors ICs are in monomorphic state before starting |
| 841 // profiling. | 840 // profiling. |
| 842 accessors.set_warming_up(true); | 841 accessors.set_warming_up(true); |
| 843 int32_t warm_up_iterations = 3; | 842 int32_t warm_up_iterations = 3; |
| 844 v8::Handle<v8::Value> args[] = { v8::Integer::New(warm_up_iterations) }; | 843 v8::Handle<v8::Value> args[] = { v8::Integer::New(warm_up_iterations) }; |
| 845 function->Call(env->Global(), ARRAY_SIZE(args), args); | 844 function->Call(env->Global(), ARRAY_SIZE(args), args); |
| 846 accessors.set_warming_up(false); | 845 accessors.set_warming_up(false); |
| 847 } | 846 } |
| 848 | 847 |
| 849 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 850 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 851 | |
| 852 cpu_profiler->StartCpuProfiling(profile_name); | |
| 853 int32_t repeat_count = 100; | 848 int32_t repeat_count = 100; |
| 854 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; | 849 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; |
| 855 function->Call(env->Global(), ARRAY_SIZE(args), args); | 850 const v8::CpuProfile* profile = |
| 856 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 851 RunProfiler(env, function, args, ARRAY_SIZE(args), 200); |
| 857 | |
| 858 CHECK_NE(NULL, profile); | |
| 859 // Dump collected profile to have a better diagnostic in case of failure. | |
| 860 reinterpret_cast<i::CpuProfile*>( | |
| 861 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 862 | 852 |
| 863 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 853 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 864 const v8::CpuProfileNode* startNode = GetChild(root, "start"); | 854 const v8::CpuProfileNode* startNode = GetChild(root, "start"); |
| 865 GetChild(startNode, "get foo"); | 855 GetChild(startNode, "get foo"); |
| 866 GetChild(startNode, "set foo"); | 856 GetChild(startNode, "set foo"); |
| 867 | 857 |
| 858 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 868 cpu_profiler->DeleteAllCpuProfiles(); | 859 cpu_profiler->DeleteAllCpuProfiles(); |
| 869 } | 860 } |
| 870 | 861 |
| 871 | 862 |
| 872 static const char* native_method_test_source = "function start(count) {\n" | 863 static const char* native_method_test_source = "function start(count) {\n" |
| 873 " for (var i = 0; i < count; i++) {\n" | 864 " for (var i = 0; i < count; i++) {\n" |
| 874 " instance.fooMethod();\n" | 865 " instance.fooMethod();\n" |
| 875 " }\n" | 866 " }\n" |
| 876 "}\n"; | 867 "}\n"; |
| 877 | 868 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 892 &TestApiCallbacks::Callback, data, signature, 0)); | 883 &TestApiCallbacks::Callback, data, signature, 0)); |
| 893 | 884 |
| 894 v8::Local<v8::Function> func = func_template->GetFunction(); | 885 v8::Local<v8::Function> func = func_template->GetFunction(); |
| 895 v8::Local<v8::Object> instance = func->NewInstance(); | 886 v8::Local<v8::Object> instance = func->NewInstance(); |
| 896 env->Global()->Set(v8::String::New("instance"), instance); | 887 env->Global()->Set(v8::String::New("instance"), instance); |
| 897 | 888 |
| 898 v8::Script::Compile(v8::String::New(native_method_test_source))->Run(); | 889 v8::Script::Compile(v8::String::New(native_method_test_source))->Run(); |
| 899 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 890 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
| 900 env->Global()->Get(v8::String::New("start"))); | 891 env->Global()->Get(v8::String::New("start"))); |
| 901 | 892 |
| 902 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 903 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 904 | |
| 905 cpu_profiler->StartCpuProfiling(profile_name); | |
| 906 int32_t repeat_count = 1; | 893 int32_t repeat_count = 1; |
| 907 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; | 894 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; |
| 908 function->Call(env->Global(), ARRAY_SIZE(args), args); | 895 const v8::CpuProfile* profile = |
| 909 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 896 RunProfiler(env, function, args, ARRAY_SIZE(args), 100); |
| 910 | |
| 911 CHECK_NE(NULL, profile); | |
| 912 // Dump collected profile to have a better diagnostic in case of failure. | |
| 913 reinterpret_cast<i::CpuProfile*>( | |
| 914 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 915 | 897 |
| 916 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 898 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 917 const v8::CpuProfileNode* startNode = GetChild(root, "start"); | 899 const v8::CpuProfileNode* startNode = GetChild(root, "start"); |
| 918 GetChild(startNode, "fooMethod"); | 900 GetChild(startNode, "fooMethod"); |
| 919 | 901 |
| 902 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 920 cpu_profiler->DeleteAllCpuProfiles(); | 903 cpu_profiler->DeleteAllCpuProfiles(); |
| 921 } | 904 } |
| 922 | 905 |
| 923 | 906 |
| 924 TEST(NativeMethodMonomorphicIC) { | 907 TEST(NativeMethodMonomorphicIC) { |
| 925 LocalContext env; | 908 LocalContext env; |
| 926 v8::HandleScope scope(env->GetIsolate()); | 909 v8::HandleScope scope(env->GetIsolate()); |
| 927 | 910 |
| 928 TestApiCallbacks callbacks(1); | 911 TestApiCallbacks callbacks(1); |
| 929 v8::Local<v8::External> data = v8::External::New(&callbacks); | 912 v8::Local<v8::External> data = v8::External::New(&callbacks); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 946 { | 929 { |
| 947 // Make sure method ICs are in monomorphic state before starting | 930 // Make sure method ICs are in monomorphic state before starting |
| 948 // profiling. | 931 // profiling. |
| 949 callbacks.set_warming_up(true); | 932 callbacks.set_warming_up(true); |
| 950 int32_t warm_up_iterations = 3; | 933 int32_t warm_up_iterations = 3; |
| 951 v8::Handle<v8::Value> args[] = { v8::Integer::New(warm_up_iterations) }; | 934 v8::Handle<v8::Value> args[] = { v8::Integer::New(warm_up_iterations) }; |
| 952 function->Call(env->Global(), ARRAY_SIZE(args), args); | 935 function->Call(env->Global(), ARRAY_SIZE(args), args); |
| 953 callbacks.set_warming_up(false); | 936 callbacks.set_warming_up(false); |
| 954 } | 937 } |
| 955 | 938 |
| 956 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 957 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 958 | |
| 959 cpu_profiler->StartCpuProfiling(profile_name); | |
| 960 int32_t repeat_count = 100; | 939 int32_t repeat_count = 100; |
| 961 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; | 940 v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) }; |
| 962 function->Call(env->Global(), ARRAY_SIZE(args), args); | 941 const v8::CpuProfile* profile = |
| 963 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 942 RunProfiler(env, function, args, ARRAY_SIZE(args), 100); |
| 964 | |
| 965 CHECK_NE(NULL, profile); | |
| 966 // Dump collected profile to have a better diagnostic in case of failure. | |
| 967 reinterpret_cast<i::CpuProfile*>( | |
| 968 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 969 | 943 |
| 970 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 944 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 971 GetChild(root, "start"); | 945 GetChild(root, "start"); |
| 972 const v8::CpuProfileNode* startNode = GetChild(root, "start"); | 946 const v8::CpuProfileNode* startNode = GetChild(root, "start"); |
| 973 GetChild(startNode, "fooMethod"); | 947 GetChild(startNode, "fooMethod"); |
| 974 | 948 |
| 949 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 975 cpu_profiler->DeleteAllCpuProfiles(); | 950 cpu_profiler->DeleteAllCpuProfiles(); |
| 976 } | 951 } |
| 977 | 952 |
| 978 | 953 |
| 979 static const char* bound_function_test_source = "function foo(iterations) {\n" | 954 static const char* bound_function_test_source = "function foo(iterations) {\n" |
| 980 " var r = 0;\n" | 955 " var r = 0;\n" |
| 981 " for (var i = 0; i < iterations; i++) { r += i; }\n" | 956 " for (var i = 0; i < iterations; i++) { r += i; }\n" |
| 982 " return r;\n" | 957 " return r;\n" |
| 983 "}\n" | 958 "}\n" |
| 984 "function start(duration) {\n" | 959 "function start(duration) {\n" |
| 985 " var callback = foo.bind(this);\n" | 960 " var callback = foo.bind(this);\n" |
| 986 " var start = Date.now();\n" | 961 " var start = Date.now();\n" |
| 987 " while (Date.now() - start < duration) {\n" | 962 " while (Date.now() - start < duration) {\n" |
| 988 " callback(10 * 1000);\n" | 963 " callback(10 * 1000);\n" |
| 989 " }\n" | 964 " }\n" |
| 990 "}"; | 965 "}"; |
| 991 | 966 |
| 992 | 967 |
| 993 TEST(BoundFunctionCall) { | 968 TEST(BoundFunctionCall) { |
| 994 LocalContext env; | 969 LocalContext env; |
| 995 v8::HandleScope scope(env->GetIsolate()); | 970 v8::HandleScope scope(env->GetIsolate()); |
| 996 | 971 |
| 997 v8::Script::Compile(v8::String::New(bound_function_test_source))->Run(); | 972 v8::Script::Compile(v8::String::New(bound_function_test_source))->Run(); |
| 998 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 973 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
| 999 env->Global()->Get(v8::String::New("start"))); | 974 env->Global()->Get(v8::String::New("start"))); |
| 1000 | 975 |
| 1001 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 1002 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 1003 | |
| 1004 cpu_profiler->StartCpuProfiling(profile_name); | |
| 1005 int32_t duration_ms = 100; | 976 int32_t duration_ms = 100; |
| 1006 v8::Handle<v8::Value> args[] = { v8::Integer::New(duration_ms) }; | 977 v8::Handle<v8::Value> args[] = { v8::Integer::New(duration_ms) }; |
| 1007 function->Call(env->Global(), ARRAY_SIZE(args), args); | 978 const v8::CpuProfile* profile = |
| 1008 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 979 RunProfiler(env, function, args, ARRAY_SIZE(args), 100); |
| 1009 | |
| 1010 CHECK_NE(NULL, profile); | |
| 1011 // Dump collected profile to have a better diagnostic in case of failure. | |
| 1012 reinterpret_cast<i::CpuProfile*>( | |
| 1013 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 1014 | 980 |
| 1015 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 981 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 1016 ScopedVector<v8::Handle<v8::String> > names(3); | 982 ScopedVector<v8::Handle<v8::String> > names(3); |
| 1017 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); | 983 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); |
| 1018 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); | 984 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); |
| 1019 names[2] = v8::String::New("start"); | 985 names[2] = v8::String::New("start"); |
| 1020 // Don't allow |foo| node to be at the top level. | 986 // Don't allow |foo| node to be at the top level. |
| 1021 CheckChildrenNames(root, names); | 987 CheckChildrenNames(root, names); |
| 1022 | 988 |
| 1023 const v8::CpuProfileNode* startNode = GetChild(root, "start"); | 989 const v8::CpuProfileNode* startNode = GetChild(root, "start"); |
| 1024 GetChild(startNode, "foo"); | 990 GetChild(startNode, "foo"); |
| 1025 | 991 |
| 992 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 1026 cpu_profiler->DeleteAllCpuProfiles(); | 993 cpu_profiler->DeleteAllCpuProfiles(); |
| 1027 } | 994 } |
| 1028 | 995 |
| 1029 | 996 |
| 1030 static const char* call_function_test_source = "function bar(iterations) {\n" | 997 static const char* call_function_test_source = "function bar(iterations) {\n" |
| 1031 "}\n" | 998 "}\n" |
| 1032 "function start(duration) {\n" | 999 "function start(duration) {\n" |
| 1033 " var start = Date.now();\n" | 1000 " var start = Date.now();\n" |
| 1034 " while (Date.now() - start < duration) {\n" | 1001 " while (Date.now() - start < duration) {\n" |
| 1035 " try {\n" | 1002 " try {\n" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1052 // 1 1 bar [-1] #7 | 1019 // 1 1 bar [-1] #7 |
| 1053 // 19 19 (program) [-1] #2 | 1020 // 19 19 (program) [-1] #2 |
| 1054 TEST(FunctionCallSample) { | 1021 TEST(FunctionCallSample) { |
| 1055 LocalContext env; | 1022 LocalContext env; |
| 1056 v8::HandleScope scope(env->GetIsolate()); | 1023 v8::HandleScope scope(env->GetIsolate()); |
| 1057 | 1024 |
| 1058 v8::Script::Compile(v8::String::New(call_function_test_source))->Run(); | 1025 v8::Script::Compile(v8::String::New(call_function_test_source))->Run(); |
| 1059 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 1026 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
| 1060 env->Global()->Get(v8::String::New("start"))); | 1027 env->Global()->Get(v8::String::New("start"))); |
| 1061 | 1028 |
| 1062 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | 1029 int32_t duration_ms = 100; |
| 1063 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | 1030 v8::Handle<v8::Value> args[] = { v8::Integer::New(duration_ms) }; |
| 1064 | 1031 |
| 1065 cpu_profiler->StartCpuProfiling(profile_name); | 1032 const v8::CpuProfile* profile = |
| 1066 int32_t duration_ms = 100; | 1033 RunProfiler(env, function, args, ARRAY_SIZE(args), 100); |
| 1067 #if defined(_WIN32) || defined(_WIN64) | |
| 1068 // 100ms is not enough on Windows. See | |
| 1069 // https://code.google.com/p/v8/issues/detail?id=2628 | |
| 1070 duration_ms = 400; | |
| 1071 #endif | |
| 1072 v8::Handle<v8::Value> args[] = { v8::Integer::New(duration_ms) }; | |
| 1073 function->Call(env->Global(), ARRAY_SIZE(args), args); | |
| 1074 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | |
| 1075 | |
| 1076 CHECK_NE(NULL, profile); | |
| 1077 // Dump collected profile to have a better diagnostic in case of failure. | |
| 1078 reinterpret_cast<i::CpuProfile*>( | |
| 1079 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 1080 | 1034 |
| 1081 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 1035 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 1082 { | 1036 { |
| 1083 ScopedVector<v8::Handle<v8::String> > names(4); | 1037 ScopedVector<v8::Handle<v8::String> > names(4); |
| 1084 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); | 1038 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); |
| 1085 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); | 1039 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); |
| 1086 names[2] = v8::String::New("start"); | 1040 names[2] = v8::String::New("start"); |
| 1087 names[3] = v8::String::New(i::ProfileGenerator::kUnresolvedFunctionName); | 1041 names[3] = v8::String::New(i::ProfileGenerator::kUnresolvedFunctionName); |
| 1088 // Don't allow |bar| and |call| nodes to be at the top level. | 1042 // Don't allow |bar| and |call| nodes to be at the top level. |
| 1089 CheckChildrenNames(root, names); | 1043 CheckChildrenNames(root, names); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1103 } | 1057 } |
| 1104 | 1058 |
| 1105 const v8::CpuProfileNode* unresolvedNode = | 1059 const v8::CpuProfileNode* unresolvedNode = |
| 1106 FindChild(root, i::ProfileGenerator::kUnresolvedFunctionName); | 1060 FindChild(root, i::ProfileGenerator::kUnresolvedFunctionName); |
| 1107 if (unresolvedNode) { | 1061 if (unresolvedNode) { |
| 1108 ScopedVector<v8::Handle<v8::String> > names(1); | 1062 ScopedVector<v8::Handle<v8::String> > names(1); |
| 1109 names[0] = v8::String::New("call"); | 1063 names[0] = v8::String::New("call"); |
| 1110 CheckChildrenNames(unresolvedNode, names); | 1064 CheckChildrenNames(unresolvedNode, names); |
| 1111 } | 1065 } |
| 1112 | 1066 |
| 1067 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 1113 cpu_profiler->DeleteAllCpuProfiles(); | 1068 cpu_profiler->DeleteAllCpuProfiles(); |
| 1114 } | 1069 } |
| 1115 | 1070 |
| 1116 | 1071 |
| 1117 static const char* function_apply_test_source = "function bar(iterations) {\n" | 1072 static const char* function_apply_test_source = "function bar(iterations) {\n" |
| 1118 "}\n" | 1073 "}\n" |
| 1119 "function test() {\n" | 1074 "function test() {\n" |
| 1120 " bar.apply(this, [10 * 1000]);\n" | 1075 " bar.apply(this, [10 * 1000]);\n" |
| 1121 "}\n" | 1076 "}\n" |
| 1122 "function start(duration) {\n" | 1077 "function start(duration) {\n" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1140 // 9 9 apply [-1] #0 5 | 1095 // 9 9 apply [-1] #0 5 |
| 1141 // 10 10 (program) [-1] #0 2 | 1096 // 10 10 (program) [-1] #0 2 |
| 1142 TEST(FunctionApplySample) { | 1097 TEST(FunctionApplySample) { |
| 1143 LocalContext env; | 1098 LocalContext env; |
| 1144 v8::HandleScope scope(env->GetIsolate()); | 1099 v8::HandleScope scope(env->GetIsolate()); |
| 1145 | 1100 |
| 1146 v8::Script::Compile(v8::String::New(function_apply_test_source))->Run(); | 1101 v8::Script::Compile(v8::String::New(function_apply_test_source))->Run(); |
| 1147 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 1102 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
| 1148 env->Global()->Get(v8::String::New("start"))); | 1103 env->Global()->Get(v8::String::New("start"))); |
| 1149 | 1104 |
| 1150 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | |
| 1151 v8::Local<v8::String> profile_name = v8::String::New("my_profile"); | |
| 1152 | |
| 1153 cpu_profiler->StartCpuProfiling(profile_name); | |
| 1154 int32_t duration_ms = 100; | 1105 int32_t duration_ms = 100; |
| 1155 #if defined(_WIN32) || defined(_WIN64) | |
| 1156 // 100ms is not enough on Windows. See | |
| 1157 // https://code.google.com/p/v8/issues/detail?id=2628 | |
| 1158 duration_ms = 400; | |
| 1159 #endif | |
| 1160 v8::Handle<v8::Value> args[] = { v8::Integer::New(duration_ms) }; | 1106 v8::Handle<v8::Value> args[] = { v8::Integer::New(duration_ms) }; |
| 1161 function->Call(env->Global(), ARRAY_SIZE(args), args); | 1107 const v8::CpuProfile* profile = |
| 1162 const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name); | 1108 RunProfiler(env, function, args, ARRAY_SIZE(args), 100); |
| 1163 | |
| 1164 CHECK_NE(NULL, profile); | |
| 1165 // Dump collected profile to have a better diagnostic in case of failure. | |
| 1166 reinterpret_cast<i::CpuProfile*>( | |
| 1167 const_cast<v8::CpuProfile*>(profile))->Print(); | |
| 1168 | 1109 |
| 1169 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 1110 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 1170 { | 1111 { |
| 1171 ScopedVector<v8::Handle<v8::String> > names(3); | 1112 ScopedVector<v8::Handle<v8::String> > names(3); |
| 1172 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); | 1113 names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName); |
| 1173 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); | 1114 names[1] = v8::String::New(ProfileGenerator::kProgramEntryName); |
| 1174 names[2] = v8::String::New("start"); | 1115 names[2] = v8::String::New("start"); |
| 1175 // Don't allow |test|, |bar| and |apply| nodes to be at the top level. | 1116 // Don't allow |test|, |bar| and |apply| nodes to be at the top level. |
| 1176 CheckChildrenNames(root, names); | 1117 CheckChildrenNames(root, names); |
| 1177 } | 1118 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1195 | 1136 |
| 1196 if (const v8::CpuProfileNode* unresolvedNode = | 1137 if (const v8::CpuProfileNode* unresolvedNode = |
| 1197 FindChild(startNode, ProfileGenerator::kUnresolvedFunctionName)) { | 1138 FindChild(startNode, ProfileGenerator::kUnresolvedFunctionName)) { |
| 1198 ScopedVector<v8::Handle<v8::String> > names(1); | 1139 ScopedVector<v8::Handle<v8::String> > names(1); |
| 1199 names[0] = v8::String::New("apply"); | 1140 names[0] = v8::String::New("apply"); |
| 1200 CheckChildrenNames(unresolvedNode, names); | 1141 CheckChildrenNames(unresolvedNode, names); |
| 1201 GetChild(unresolvedNode, "apply"); | 1142 GetChild(unresolvedNode, "apply"); |
| 1202 } | 1143 } |
| 1203 } | 1144 } |
| 1204 | 1145 |
| 1146 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 1205 cpu_profiler->DeleteAllCpuProfiles(); | 1147 cpu_profiler->DeleteAllCpuProfiles(); |
| 1206 } | 1148 } |
| OLD | NEW |