OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <utility> | 5 #include <utility> |
6 | 6 |
7 #include "base/test/launcher/unit_test_launcher.h" | 7 #include "base/test/launcher/unit_test_launcher.h" |
8 #include "base/test/test_suite.h" | 8 #include "base/test/test_suite.h" |
9 #include "cc/ipc/cc_param_traits.h" | 9 #include "cc/ipc/cc_param_traits.h" |
10 #include "cc/ipc/compositor_frame.mojom.h" | 10 #include "cc/ipc/compositor_frame.mojom.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 | 30 |
31 namespace cc { | 31 namespace cc { |
32 namespace { | 32 namespace { |
33 | 33 |
34 static const int kTimeLimitMillis = 2000; | 34 static const int kTimeLimitMillis = 2000; |
35 static const int kNumWarmupRuns = 20; | 35 static const int kNumWarmupRuns = 20; |
36 static const int kTimeCheckInterval = 10; | 36 static const int kTimeCheckInterval = 10; |
37 | 37 |
38 class CCSerializationPerfTest : public testing::Test { | 38 class CCSerializationPerfTest : public testing::Test { |
39 protected: | 39 protected: |
40 static void RunTestParamTraits(const std::string& test_name, | 40 static bool ReadMessage(const IPC::Message* msg, CompositorFrame* frame) { |
41 const CompositorFrame& frame) { | 41 base::PickleIterator iter(*msg); |
| 42 return IPC::ParamTraits<CompositorFrame>::Read(msg, &iter, frame); |
| 43 } |
| 44 |
| 45 static void RunDeserializationTestParamTraits(const std::string& test_name, |
| 46 const CompositorFrame& frame) { |
| 47 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); |
| 48 IPC::ParamTraits<CompositorFrame>::Write(&msg, frame); |
| 49 for (int i = 0; i < kNumWarmupRuns; ++i) { |
| 50 CompositorFrame compositor_frame; |
| 51 ReadMessage(&msg, &compositor_frame); |
| 52 } |
| 53 |
| 54 base::TimeTicks start = base::TimeTicks::Now(); |
| 55 base::TimeTicks end = |
| 56 start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis); |
| 57 base::TimeDelta min_time; |
| 58 size_t count = 0; |
| 59 while (start < end) { |
| 60 for (int i = 0; i < kTimeCheckInterval; ++i) { |
| 61 ++count; |
| 62 CompositorFrame compositor_frame; |
| 63 ReadMessage(&msg, &compositor_frame); |
| 64 } |
| 65 |
| 66 base::TimeTicks now = base::TimeTicks::Now(); |
| 67 if (now - start < min_time || min_time.is_zero()) |
| 68 min_time = now - start; |
| 69 start = base::TimeTicks::Now(); |
| 70 } |
| 71 |
| 72 perf_test::PrintResult( |
| 73 "ParamTraits deserialization: min_frame_deserialization_time", "", |
| 74 test_name, min_time.InMillisecondsF() / kTimeCheckInterval * 1000, "us", |
| 75 true); |
| 76 perf_test::PrintResult("ParamTraits deserialization: num runs in 2 seconds", |
| 77 "", test_name, count, "", true); |
| 78 } |
| 79 |
| 80 static void RunSerializationTestParamTraits(const std::string& test_name, |
| 81 const CompositorFrame& frame) { |
42 for (int i = 0; i < kNumWarmupRuns; ++i) { | 82 for (int i = 0; i < kNumWarmupRuns; ++i) { |
43 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); | 83 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); |
44 IPC::ParamTraits<CompositorFrame>::Write(&msg, frame); | 84 IPC::ParamTraits<CompositorFrame>::Write(&msg, frame); |
45 } | 85 } |
46 | 86 |
47 base::TimeTicks start = base::TimeTicks::Now(); | 87 base::TimeTicks start = base::TimeTicks::Now(); |
48 base::TimeTicks end = | 88 base::TimeTicks end = |
49 start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis); | 89 start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis); |
50 base::TimeDelta min_time; | 90 base::TimeDelta min_time; |
51 size_t count = 0; | 91 size_t count = 0; |
52 while (start < end) { | 92 while (start < end) { |
53 for (int i = 0; i < kTimeCheckInterval; ++i) { | 93 for (int i = 0; i < kTimeCheckInterval; ++i) { |
54 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); | 94 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); |
55 IPC::ParamTraits<CompositorFrame>::Write(&msg, frame); | 95 IPC::ParamTraits<CompositorFrame>::Write(&msg, frame); |
56 ++count; | 96 ++count; |
57 } | 97 } |
58 | 98 |
59 base::TimeTicks now = base::TimeTicks::Now(); | 99 base::TimeTicks now = base::TimeTicks::Now(); |
60 if (now - start < min_time || min_time.is_zero()) | 100 if (now - start < min_time || min_time.is_zero()) |
61 min_time = now - start; | 101 min_time = now - start; |
62 start = base::TimeTicks::Now(); | 102 start = base::TimeTicks::Now(); |
63 } | 103 } |
64 | 104 |
65 perf_test::PrintResult( | 105 perf_test::PrintResult( |
66 "ParamTraits: min_frame_serialization_time", "", test_name, | 106 "ParamTraits serialization: min_frame_serialization_time", "", |
67 min_time.InMillisecondsF() / kTimeCheckInterval * 1000, "us", true); | 107 test_name, min_time.InMillisecondsF() / kTimeCheckInterval * 1000, "us", |
68 perf_test::PrintResult("ParamTraits: num runs in 2 seconds", "", test_name, | 108 true); |
69 count, "", true); | 109 perf_test::PrintResult("ParamTraits serialization: num runs in 2 seconds", |
| 110 "", test_name, count, "", true); |
70 } | 111 } |
71 | 112 |
72 static void RunTestStructTraits(const std::string& test_name, | 113 static void RunDeserializationTestStructTraits(const std::string& test_name, |
73 const CompositorFrame& frame) { | 114 const CompositorFrame& frame) { |
| 115 mojo::Array<uint8_t> data = mojom::CompositorFrame::Serialize(&frame); |
| 116 DCHECK_GT(data.size(), 0u); |
| 117 for (int i = 0; i < kNumWarmupRuns; ++i) { |
| 118 CompositorFrame compositor_frame; |
| 119 mojom::CompositorFrame::Deserialize(data, &compositor_frame); |
| 120 } |
| 121 |
| 122 base::TimeTicks start = base::TimeTicks::Now(); |
| 123 base::TimeTicks end = |
| 124 start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis); |
| 125 base::TimeDelta min_time; |
| 126 size_t count = 0; |
| 127 while (start < end) { |
| 128 for (int i = 0; i < kTimeCheckInterval; ++i) { |
| 129 CompositorFrame compositor_frame; |
| 130 mojom::CompositorFrame::Deserialize(data, &compositor_frame); |
| 131 ++count; |
| 132 } |
| 133 |
| 134 base::TimeTicks now = base::TimeTicks::Now(); |
| 135 if (now - start < min_time || min_time.is_zero()) |
| 136 min_time = now - start; |
| 137 start = base::TimeTicks::Now(); |
| 138 } |
| 139 |
| 140 perf_test::PrintResult( |
| 141 "StructTraits deserialization min_frame_deserialization_time", "", |
| 142 test_name, min_time.InMillisecondsF() / kTimeCheckInterval * 1000, "us", |
| 143 true); |
| 144 perf_test::PrintResult( |
| 145 "StructTraits deserialization: num runs in 2 seconds", "", test_name, |
| 146 count, "", true); |
| 147 } |
| 148 |
| 149 static void RunSerializationTestStructTraits(const std::string& test_name, |
| 150 const CompositorFrame& frame) { |
74 for (int i = 0; i < kNumWarmupRuns; ++i) { | 151 for (int i = 0; i < kNumWarmupRuns; ++i) { |
75 mojo::Array<uint8_t> data = mojom::CompositorFrame::Serialize(&frame); | 152 mojo::Array<uint8_t> data = mojom::CompositorFrame::Serialize(&frame); |
76 DCHECK_GT(data.size(), 0u); | 153 DCHECK_GT(data.size(), 0u); |
77 } | 154 } |
78 | 155 |
79 base::TimeTicks start = base::TimeTicks::Now(); | 156 base::TimeTicks start = base::TimeTicks::Now(); |
80 base::TimeTicks end = | 157 base::TimeTicks end = |
81 start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis); | 158 start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis); |
82 base::TimeDelta min_time; | 159 base::TimeDelta min_time; |
83 size_t count = 0; | 160 size_t count = 0; |
84 while (start < end) { | 161 while (start < end) { |
85 for (int i = 0; i < kTimeCheckInterval; ++i) { | 162 for (int i = 0; i < kTimeCheckInterval; ++i) { |
86 mojo::Array<uint8_t> data = mojom::CompositorFrame::Serialize(&frame); | 163 mojo::Array<uint8_t> data = mojom::CompositorFrame::Serialize(&frame); |
87 DCHECK_GT(data.size(), 0u); | 164 DCHECK_GT(data.size(), 0u); |
88 ++count; | 165 ++count; |
89 } | 166 } |
90 | 167 |
91 base::TimeTicks now = base::TimeTicks::Now(); | 168 base::TimeTicks now = base::TimeTicks::Now(); |
92 if (now - start < min_time || min_time.is_zero()) | 169 if (now - start < min_time || min_time.is_zero()) |
93 min_time = now - start; | 170 min_time = now - start; |
94 start = base::TimeTicks::Now(); | 171 start = base::TimeTicks::Now(); |
95 } | 172 } |
96 | 173 |
97 perf_test::PrintResult( | 174 perf_test::PrintResult( |
98 "StructTraits min_frame_serialization_time", "", test_name, | 175 "StructTraits serialization min_frame_serialization_time", "", |
99 min_time.InMillisecondsF() / kTimeCheckInterval * 1000, "us", true); | 176 test_name, min_time.InMillisecondsF() / kTimeCheckInterval * 1000, "us", |
100 perf_test::PrintResult("StructTraits: num runs in 2 seconds", "", test_name, | 177 true); |
101 count, "", true); | 178 perf_test::PrintResult("StructTraits serialization: num runs in 2 seconds", |
| 179 "", test_name, count, "", true); |
102 } | 180 } |
103 | 181 |
104 static void RunTest(const std::string& test_name, CompositorFrame frame) { | 182 static void RunTest(const std::string& test_name, CompositorFrame frame) { |
105 RunTestStructTraits(test_name, frame); | 183 RunSerializationTestStructTraits(test_name, frame); |
106 RunTestParamTraits(test_name, frame); | 184 RunDeserializationTestStructTraits(test_name, frame); |
| 185 RunSerializationTestParamTraits(test_name, frame); |
| 186 RunDeserializationTestParamTraits(test_name, frame); |
107 } | 187 } |
108 }; | 188 }; |
109 | 189 |
110 TEST_F(CCSerializationPerfTest, DelegatedFrame_ManyQuads_1_4000) { | 190 TEST_F(CCSerializationPerfTest, DelegatedFrame_ManyQuads_1_4000) { |
111 CompositorFrame frame; | 191 CompositorFrame frame; |
112 | 192 |
113 std::unique_ptr<RenderPass> render_pass = RenderPass::Create(); | 193 std::unique_ptr<RenderPass> render_pass = RenderPass::Create(); |
114 render_pass->CreateAndAppendSharedQuadState(); | 194 render_pass->CreateAndAppendSharedQuadState(); |
115 for (int i = 0; i < 4000; ++i) { | 195 for (int i = 0; i < 4000; ++i) { |
116 const gfx::Rect bounds(100, 100, 100, 100); | 196 const gfx::Rect bounds(100, 100, 100, 100); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 } | 288 } |
209 frame.delegated_frame_data->render_pass_list.push_back( | 289 frame.delegated_frame_data->render_pass_list.push_back( |
210 std::move(render_pass)); | 290 std::move(render_pass)); |
211 } | 291 } |
212 | 292 |
213 RunTest("DelegatedFrame_ManyRenderPasses_10000_100", std::move(frame)); | 293 RunTest("DelegatedFrame_ManyRenderPasses_10000_100", std::move(frame)); |
214 } | 294 } |
215 | 295 |
216 } // namespace | 296 } // namespace |
217 } // namespace cc | 297 } // namespace cc |
OLD | NEW |