1 //===-- formatters.cpp ------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include <CoreFoundation/CoreFoundation.h>
12 #include "lldb-perf/lib/Measurement.h"
13 #include "lldb-perf/lib/Metric.h"
14 #include "lldb-perf/lib/TestCase.h"
15 #include "lldb-perf/lib/Timer.h"
16 #include "lldb-perf/lib/Xcode.h"
22 using namespace lldb_perf;
24 class FormattersTest : public TestCase {
26 FormattersTest() : TestCase() {
27 m_dump_std_vector_measurement = CreateTimeMeasurement(
28 [](SBValue value) -> void {
29 lldb_perf::Xcode::FetchVariable(value, 1, false);
31 "std-vector", "time to dump an std::vector");
32 m_dump_std_list_measurement = CreateTimeMeasurement(
33 [](SBValue value) -> void {
34 lldb_perf::Xcode::FetchVariable(value, 1, false);
36 "std-list", "time to dump an std::list");
37 m_dump_std_map_measurement = CreateTimeMeasurement(
38 [](SBValue value) -> void {
39 lldb_perf::Xcode::FetchVariable(value, 1, false);
41 "std-map", "time to dump an std::map");
43 // use this in manual mode
44 m_dump_std_string_measurement = CreateTimeMeasurement(
45 []() -> void {}, "std-string", "time to dump an std::string");
47 m_dump_nsstring_measurement = CreateTimeMeasurement(
48 [](SBValue value) -> void {
49 lldb_perf::Xcode::FetchVariable(value, 0, false);
51 "ns-string", "time to dump an NSString");
53 m_dump_nsarray_measurement = CreateTimeMeasurement(
54 [](SBValue value) -> void {
55 lldb_perf::Xcode::FetchVariable(value, 1, false);
57 "ns-array", "time to dump an NSArray");
59 m_dump_nsdictionary_measurement = CreateTimeMeasurement(
60 [](SBValue value) -> void {
61 lldb_perf::Xcode::FetchVariable(value, 1, false);
63 "ns-dictionary", "time to dump an NSDictionary");
65 m_dump_nsset_measurement = CreateTimeMeasurement(
66 [](SBValue value) -> void {
67 lldb_perf::Xcode::FetchVariable(value, 1, false);
69 "ns-set", "time to dump an NSSet");
71 m_dump_nsbundle_measurement = CreateTimeMeasurement(
72 [](SBValue value) -> void {
73 lldb_perf::Xcode::FetchVariable(value, 1, false);
75 "ns-bundle", "time to dump an NSBundle");
77 m_dump_nsdate_measurement = CreateTimeMeasurement(
78 [](SBValue value) -> void {
79 lldb_perf::Xcode::FetchVariable(value, 0, false);
81 "ns-date", "time to dump an NSDate");
84 virtual ~FormattersTest() {}
86 virtual bool Setup(int &argc, const char **&argv) {
87 m_app_path.assign(argv[1]);
88 m_out_path.assign(argv[2]);
89 m_target = m_debugger.CreateTarget(m_app_path.c_str());
90 m_target.BreakpointCreateByName("main");
91 SBLaunchInfo launch_info(argv);
92 return Launch(launch_info);
96 SBFrame frame_zero(m_thread.GetFrameAtIndex(0));
98 m_dump_nsarray_measurement(
99 frame_zero.FindVariable("nsarray", lldb::eDynamicCanRunTarget));
100 m_dump_nsarray_measurement(
101 frame_zero.FindVariable("nsmutablearray", lldb::eDynamicCanRunTarget));
103 m_dump_nsdictionary_measurement(
104 frame_zero.FindVariable("nsdictionary", lldb::eDynamicCanRunTarget));
105 m_dump_nsdictionary_measurement(frame_zero.FindVariable(
106 "nsmutabledictionary", lldb::eDynamicCanRunTarget));
108 m_dump_nsstring_measurement(
109 frame_zero.FindVariable("str0", lldb::eDynamicCanRunTarget));
110 m_dump_nsstring_measurement(
111 frame_zero.FindVariable("str1", lldb::eDynamicCanRunTarget));
112 m_dump_nsstring_measurement(
113 frame_zero.FindVariable("str2", lldb::eDynamicCanRunTarget));
114 m_dump_nsstring_measurement(
115 frame_zero.FindVariable("str3", lldb::eDynamicCanRunTarget));
116 m_dump_nsstring_measurement(
117 frame_zero.FindVariable("str4", lldb::eDynamicCanRunTarget));
119 m_dump_nsdate_measurement(
120 frame_zero.FindVariable("me", lldb::eDynamicCanRunTarget));
121 m_dump_nsdate_measurement(
122 frame_zero.FindVariable("cutie", lldb::eDynamicCanRunTarget));
123 m_dump_nsdate_measurement(
124 frame_zero.FindVariable("mom", lldb::eDynamicCanRunTarget));
125 m_dump_nsdate_measurement(
126 frame_zero.FindVariable("dad", lldb::eDynamicCanRunTarget));
127 m_dump_nsdate_measurement(
128 frame_zero.FindVariable("today", lldb::eDynamicCanRunTarget));
130 m_dump_nsbundle_measurement(
131 frame_zero.FindVariable("bundles", lldb::eDynamicCanRunTarget));
132 m_dump_nsbundle_measurement(
133 frame_zero.FindVariable("frameworks", lldb::eDynamicCanRunTarget));
135 m_dump_nsset_measurement(
136 frame_zero.FindVariable("nsset", lldb::eDynamicCanRunTarget));
137 m_dump_nsset_measurement(
138 frame_zero.FindVariable("nsmutableset", lldb::eDynamicCanRunTarget));
140 m_dump_std_vector_measurement(
141 frame_zero.FindVariable("vector", lldb::eDynamicCanRunTarget));
142 m_dump_std_list_measurement(
143 frame_zero.FindVariable("list", lldb::eDynamicCanRunTarget));
144 m_dump_std_map_measurement(
145 frame_zero.FindVariable("map", lldb::eDynamicCanRunTarget));
147 auto sstr0 = frame_zero.FindVariable("sstr0", lldb::eDynamicCanRunTarget);
148 auto sstr1 = frame_zero.FindVariable("sstr1", lldb::eDynamicCanRunTarget);
149 auto sstr2 = frame_zero.FindVariable("sstr2", lldb::eDynamicCanRunTarget);
150 auto sstr3 = frame_zero.FindVariable("sstr3", lldb::eDynamicCanRunTarget);
151 auto sstr4 = frame_zero.FindVariable("sstr4", lldb::eDynamicCanRunTarget);
153 m_dump_std_string_measurement.Start();
154 Xcode::FetchVariable(sstr0, 0, false);
155 m_dump_std_string_measurement.Stop();
157 m_dump_std_string_measurement.Start();
158 Xcode::FetchVariable(sstr1, 0, false);
159 m_dump_std_string_measurement.Stop();
161 m_dump_std_string_measurement.Start();
162 Xcode::FetchVariable(sstr2, 0, false);
163 m_dump_std_string_measurement.Stop();
165 m_dump_std_string_measurement.Start();
166 Xcode::FetchVariable(sstr3, 0, false);
167 m_dump_std_string_measurement.Stop();
169 m_dump_std_string_measurement.Start();
170 Xcode::FetchVariable(sstr4, 0, false);
171 m_dump_std_string_measurement.Stop();
174 virtual void TestStep(int counter, ActionWanted &next_action) {
177 m_target.BreakpointCreateByLocation("fmts_tester.mm", 78);
178 next_action.Continue();
182 next_action.Continue();
186 next_action.Continue();
190 next_action.Continue();
194 next_action.Continue();
198 next_action.Continue();
202 next_action.Continue();
206 next_action.Continue();
210 next_action.Continue();
214 next_action.Continue();
218 next_action.Continue();
226 virtual void WriteResults(Results &results) {
227 m_dump_std_vector_measurement.WriteAverageAndStandardDeviation(results);
228 m_dump_std_list_measurement.WriteAverageAndStandardDeviation(results);
229 m_dump_std_map_measurement.WriteAverageAndStandardDeviation(results);
230 m_dump_std_string_measurement.WriteAverageAndStandardDeviation(results);
232 m_dump_nsstring_measurement.WriteAverageAndStandardDeviation(results);
233 m_dump_nsarray_measurement.WriteAverageAndStandardDeviation(results);
234 m_dump_nsdictionary_measurement.WriteAverageAndStandardDeviation(results);
235 m_dump_nsset_measurement.WriteAverageAndStandardDeviation(results);
236 m_dump_nsbundle_measurement.WriteAverageAndStandardDeviation(results);
237 m_dump_nsdate_measurement.WriteAverageAndStandardDeviation(results);
238 results.Write(m_out_path.c_str());
243 TimeMeasurement<std::function<void(SBValue)>> m_dump_std_vector_measurement;
244 TimeMeasurement<std::function<void(SBValue)>> m_dump_std_list_measurement;
245 TimeMeasurement<std::function<void(SBValue)>> m_dump_std_map_measurement;
246 TimeMeasurement<std::function<void()>> m_dump_std_string_measurement;
249 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsstring_measurement;
250 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsarray_measurement;
251 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdictionary_measurement;
252 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsset_measurement;
253 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsbundle_measurement;
254 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdate_measurement;
257 std::string m_app_path;
258 std::string m_out_path;
261 // argv[1] == path to app
262 // argv[2] == path to result
263 int main(int argc, const char *argv[]) {
264 FormattersTest frmtest;
265 frmtest.SetVerbose(true);
266 TestCase::Run(frmtest, argc, argv);