Chromium Code Reviews| 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 1492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1503 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | 1503 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
| 1504 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); | 1504 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); |
| 1505 const v8::CpuProfileNode* native_node = | 1505 const v8::CpuProfileNode* native_node = |
| 1506 GetChild(env, start_node, "CallJsFunction"); | 1506 GetChild(env, start_node, "CallJsFunction"); |
| 1507 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar"); | 1507 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar"); |
| 1508 GetChild(env, bar_node, "foo"); | 1508 GetChild(env, bar_node, "foo"); |
| 1509 | 1509 |
| 1510 profile->Delete(); | 1510 profile->Delete(); |
| 1511 } | 1511 } |
| 1512 | 1512 |
| 1513 void CheckChildIsRare(const v8::Local<v8::Context>& context, | |
| 1514 const v8::CpuProfileNode* node, const char* name) { | |
| 1515 const v8::CpuProfileNode* child = FindChild(context, node, name); | |
| 1516 CHECK(!child || child->GetHitCount() < 10u); | |
| 1517 } | |
| 1518 | |
| 1519 static const char* inlining_test_source = | |
| 1520 "%NeverOptimizeFunction(action);\n" | |
| 1521 "%NeverOptimizeFunction(start);\n" | |
| 1522 "%OptimizeFunctionOnNextCall(level1);\n" | |
| 1523 "%OptimizeFunctionOnNextCall(level2);\n" | |
| 1524 "%OptimizeFunctionOnNextCall(level3);\n" | |
| 1525 "function action(n) {\n" | |
| 1526 " var s = 0;\n" | |
| 1527 " for (var i = 0; i < n; ++i) s += i*i*i;\n" | |
| 1528 " return s;\n" | |
| 1529 "}\n" | |
| 1530 "function level3() { return action(1000); }\n" | |
| 1531 "function level2() { return level3() * 2; }\n" | |
| 1532 "function level1() { return level2(); }\n" | |
| 1533 "function start() {\n" | |
| 1534 " startProfiling('my_profile');\n" | |
| 1535 " var startTime = Date.now();\n" | |
| 1536 " do {\n" | |
| 1537 " level1();\n" | |
| 1538 " } while (Date.now() - startTime < 200);\n" | |
| 1539 "}"; | |
| 1540 | |
| 1541 // The test check multiple entrances/exits between JS and native code. | |
| 1542 // | |
| 1543 // [Top down]: | |
| 1544 // (root) #0 1 | |
| 1545 // start #16 3 | |
| 1546 // level1 #0 4 | |
| 1547 // level2 #16 5 | |
| 1548 // level3 #16 6 | |
| 1549 // action #16 7 | |
| 1550 // (program) #0 2 | |
| 1551 TEST(Inlining) { | |
|
titzer
2016/02/26 21:24:01
Is there a way to make this test non-flaky? It cur
alph
2016/02/26 22:12:10
It does not. It was supposed to check that there's
titzer
2016/02/26 23:46:52
It's still inherently flaky. Why can't you test th
alph
2016/02/27 08:24:02
looks like I managed to make the test deterministi
| |
| 1552 i::FLAG_allow_natives_syntax = true; | |
| 1553 v8::HandleScope scope(CcTest::isolate()); | |
| 1554 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); | |
| 1555 v8::Context::Scope context_scope(env); | |
| 1556 | |
| 1557 CompileRun(inlining_test_source); | |
| 1558 v8::Local<v8::Function> function = GetFunction(env, "start"); | |
| 1559 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 1000); | |
| 1560 | |
| 1561 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); | |
| 1562 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); | |
| 1563 const v8::CpuProfileNode* level1_node = GetChild(env, start_node, "level1"); | |
| 1564 const v8::CpuProfileNode* level2_node = GetChild(env, level1_node, "level2"); | |
| 1565 const v8::CpuProfileNode* level3_node = GetChild(env, level2_node, "level3"); | |
| 1566 GetChild(env, level3_node, "action"); | |
| 1567 CheckChildIsRare(env, start_node, "level2"); | |
| 1568 CheckChildIsRare(env, start_node, "level3"); | |
| 1569 CheckChildIsRare(env, start_node, "action"); | |
| 1570 CheckChildIsRare(env, level1_node, "level3"); | |
| 1571 CheckChildIsRare(env, level1_node, "action"); | |
| 1572 CheckChildIsRare(env, level2_node, "action"); | |
| 1573 | |
| 1574 profile->Delete(); | |
| 1575 } | |
| 1576 | |
| 1513 // [Top down]: | 1577 // [Top down]: |
| 1514 // 0 (root) #0 1 | 1578 // 0 (root) #0 1 |
| 1515 // 2 (program) #0 2 | 1579 // 2 (program) #0 2 |
| 1516 // 3 (idle) #0 3 | 1580 // 3 (idle) #0 3 |
| 1517 TEST(IdleTime) { | 1581 TEST(IdleTime) { |
| 1518 LocalContext env; | 1582 LocalContext env; |
| 1519 v8::HandleScope scope(env->GetIsolate()); | 1583 v8::HandleScope scope(env->GetIsolate()); |
| 1520 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | 1584 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
| 1521 | 1585 |
| 1522 v8::Local<v8::String> profile_name = v8_str("my_profile"); | 1586 v8::Local<v8::String> profile_name = v8_str("my_profile"); |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1968 iprofile->Print(); | 2032 iprofile->Print(); |
| 1969 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile); | 2033 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile); |
| 1970 | 2034 |
| 1971 const char* branch[] = {"", "test"}; | 2035 const char* branch[] = {"", "test"}; |
| 1972 const ProfileNode* itest_node = | 2036 const ProfileNode* itest_node = |
| 1973 GetSimpleBranch(env, profile, branch, arraysize(branch)); | 2037 GetSimpleBranch(env, profile, branch, arraysize(branch)); |
| 1974 CHECK_EQ(0U, itest_node->deopt_infos().size()); | 2038 CHECK_EQ(0U, itest_node->deopt_infos().size()); |
| 1975 | 2039 |
| 1976 iprofiler->DeleteProfile(iprofile); | 2040 iprofiler->DeleteProfile(iprofile); |
| 1977 } | 2041 } |
| OLD | NEW |