| Index: test/cctest/test-heap-profiler.cc
|
| diff --git a/test/cctest/test-heap-profiler.cc b/test/cctest/test-heap-profiler.cc
|
| index ea385743f2e35d9d9038cffd6ddae231ef52ec09..a2fd09e9f59d4edd27b4c6ca1c0b3800648e8729 100644
|
| --- a/test/cctest/test-heap-profiler.cc
|
| +++ b/test/cctest/test-heap-profiler.cc
|
| @@ -2852,148 +2852,3 @@
|
| CHECK_EQ(0u, map.size());
|
| CHECK_EQ(0u, map.GetTraceNodeId(ToAddress(0x400)));
|
| }
|
| -
|
| -
|
| -static const v8::AllocationProfile::Node* FindAllocationProfileNode(
|
| - v8::AllocationProfile& profile, const Vector<const char*>& names) {
|
| - v8::AllocationProfile::Node* node = profile.GetRootNode();
|
| - for (int i = 0; node != nullptr && i < names.length(); ++i) {
|
| - const char* name = names[i];
|
| - auto children = node->children;
|
| - node = nullptr;
|
| - for (v8::AllocationProfile::Node* child : children) {
|
| - v8::String::Utf8Value child_name(child->name);
|
| - if (strcmp(*child_name, name) == 0) {
|
| - node = child;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - return node;
|
| -}
|
| -
|
| -
|
| -TEST(SamplingHeapProfiler) {
|
| - v8::HandleScope scope(v8::Isolate::GetCurrent());
|
| - LocalContext env;
|
| - v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
|
| -
|
| - // Turn off always_opt. Inlining can cause stack traces to be shorter than
|
| - // what we expect in this test.
|
| - v8::internal::FLAG_always_opt = false;
|
| -
|
| - const char* script_source =
|
| - "var A = [];\n"
|
| - "function bar(size) { return new Array(size); }\n"
|
| - "var foo = function() {\n"
|
| - " for (var i = 0; i < 1024; ++i) {\n"
|
| - " A[i] = bar(1024);\n"
|
| - " }\n"
|
| - "}\n"
|
| - "foo();";
|
| -
|
| - // Sample should be empty if requested before sampling has started.
|
| - {
|
| - v8::AllocationProfile* profile = heap_profiler->GetAllocationProfile();
|
| - CHECK(profile == nullptr);
|
| - }
|
| -
|
| - int count_512kb = 0;
|
| - {
|
| - heap_profiler->StartSamplingHeapProfiler(512 * 1024);
|
| - CompileRun(script_source);
|
| -
|
| - v8::base::SmartPointer<v8::AllocationProfile> profile(
|
| - heap_profiler->GetAllocationProfile());
|
| - CHECK(!profile.is_empty());
|
| -
|
| - const char* names[] = {"", "foo", "bar"};
|
| - auto node_bar = FindAllocationProfileNode(
|
| - *profile, Vector<const char*>(names, arraysize(names)));
|
| - CHECK(node_bar);
|
| -
|
| - // Count the number of allocations we sampled from bar.
|
| - for (auto allocation : node_bar->allocations) {
|
| - count_512kb += allocation.count;
|
| - }
|
| -
|
| - heap_profiler->StopSamplingHeapProfiler();
|
| - }
|
| -
|
| - // Samples should get cleared once sampling is stopped.
|
| - {
|
| - v8::AllocationProfile* profile = heap_profiler->GetAllocationProfile();
|
| - CHECK(profile == nullptr);
|
| - }
|
| -
|
| - // Sampling at a higher rate should give us more sampled objects.
|
| - {
|
| - heap_profiler->StartSamplingHeapProfiler(32 * 1024);
|
| - CompileRun(script_source);
|
| -
|
| - v8::base::SmartPointer<v8::AllocationProfile> profile(
|
| - heap_profiler->GetAllocationProfile());
|
| - CHECK(!profile.is_empty());
|
| -
|
| - const char* names[] = {"", "foo", "bar"};
|
| - auto node_bar = FindAllocationProfileNode(
|
| - *profile, Vector<const char*>(names, arraysize(names)));
|
| - CHECK(node_bar);
|
| -
|
| - // Count the number of allocations we sampled from bar.
|
| - int count_32kb = 0;
|
| - for (auto allocation : node_bar->allocations) {
|
| - count_32kb += allocation.count;
|
| - }
|
| -
|
| - // We should have roughly 16x as many sampled allocations. However, since
|
| - // sampling is a randomized process, we use a weaker test.
|
| - CHECK_GT(count_32kb, count_512kb);
|
| -
|
| - heap_profiler->StopSamplingHeapProfiler();
|
| - }
|
| -
|
| - // A more complicated test cases with deeper call graph and dynamically
|
| - // generated function names.
|
| - {
|
| - heap_profiler->StartSamplingHeapProfiler(128);
|
| - CompileRun(record_trace_tree_source);
|
| -
|
| - v8::base::SmartPointer<v8::AllocationProfile> profile(
|
| - heap_profiler->GetAllocationProfile());
|
| - CHECK(!profile.is_empty());
|
| -
|
| - const char* names1[] = {"", "start", "f_0_0", "f_0_1", "f_0_2"};
|
| - auto node1 = FindAllocationProfileNode(
|
| - *profile, Vector<const char*>(names1, arraysize(names1)));
|
| - CHECK(node1);
|
| -
|
| - const char* names2[] = {"", "generateFunctions"};
|
| - auto node2 = FindAllocationProfileNode(
|
| - *profile, Vector<const char*>(names2, arraysize(names2)));
|
| - CHECK(node2);
|
| -
|
| - heap_profiler->StopSamplingHeapProfiler();
|
| - }
|
| -}
|
| -
|
| -
|
| -TEST(SamplingHeapProfilerApiAllocation) {
|
| - v8::HandleScope scope(v8::Isolate::GetCurrent());
|
| - LocalContext env;
|
| - v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
|
| -
|
| - heap_profiler->StartSamplingHeapProfiler(256);
|
| -
|
| - for (int i = 0; i < 8 * 1024; ++i) v8::Object::New(env->GetIsolate());
|
| -
|
| - v8::base::SmartPointer<v8::AllocationProfile> profile(
|
| - heap_profiler->GetAllocationProfile());
|
| - CHECK(!profile.is_empty());
|
| - const char* names[] = {"(V8 API)"};
|
| - auto node = FindAllocationProfileNode(
|
| - *profile, Vector<const char*>(names, arraysize(names)));
|
| - CHECK(node);
|
| -
|
| - heap_profiler->StopSamplingHeapProfiler();
|
| -}
|
|
|