1 //===-- formatters.cpp ------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include <CoreFoundation/CoreFoundation.h> 11 12 #include "lldb-perf/lib/Timer.h" 13 #include "lldb-perf/lib/Metric.h" 14 #include "lldb-perf/lib/Measurement.h" 15 #include "lldb-perf/lib/TestCase.h" 16 #include "lldb-perf/lib/Xcode.h" 17 18 #include <iostream> 19 #include <unistd.h> 20 #include <fstream> 21 22 using namespace lldb_perf; 23 24 class FormattersTest : public TestCase 25 { 26 public: 27 FormattersTest () : TestCase() 28 { 29 m_dump_std_vector_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 30 lldb_perf::Xcode::FetchVariable (value,1,false); 31 }, "std-vector", "time to dump an std::vector"); 32 m_dump_std_list_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 33 lldb_perf::Xcode::FetchVariable (value,1,false); 34 }, "std-list", "time to dump an std::list"); 35 m_dump_std_map_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 36 lldb_perf::Xcode::FetchVariable (value,1,false); 37 }, "std-map", "time to dump an std::map"); 38 39 // use this in manual mode 40 m_dump_std_string_measurement = CreateTimeMeasurement([] () -> void { 41 }, "std-string", "time to dump an std::string"); 42 43 m_dump_nsstring_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 44 lldb_perf::Xcode::FetchVariable (value,0,false); 45 }, "ns-string", "time to dump an NSString"); 46 47 m_dump_nsarray_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 48 lldb_perf::Xcode::FetchVariable (value,1,false); 49 }, "ns-array", "time to dump an NSArray"); 50 51 m_dump_nsdictionary_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 52 lldb_perf::Xcode::FetchVariable (value,1,false); 53 }, "ns-dictionary", "time to dump an NSDictionary"); 54 55 m_dump_nsset_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 56 lldb_perf::Xcode::FetchVariable (value,1,false); 57 }, "ns-set", "time to dump an NSSet"); 58 59 m_dump_nsbundle_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 60 lldb_perf::Xcode::FetchVariable (value,1,false); 61 }, "ns-bundle", "time to dump an NSBundle"); 62 63 m_dump_nsdate_measurement = CreateTimeMeasurement([] (SBValue value) -> void { 64 lldb_perf::Xcode::FetchVariable (value,0,false); 65 }, "ns-date", "time to dump an NSDate"); 66 } 67 68 virtual 69 ~FormattersTest () 70 { 71 } 72 73 virtual bool 74 Setup (int& argc, const char**& argv) 75 { 76 m_app_path.assign(argv[1]); 77 m_out_path.assign(argv[2]); 78 m_target = m_debugger.CreateTarget(m_app_path.c_str()); 79 m_target.BreakpointCreateByName("main"); 80 SBLaunchInfo launch_info(argv); 81 return Launch (launch_info); 82 } 83 84 void 85 DoTest () 86 { 87 SBFrame frame_zero(m_thread.GetFrameAtIndex(0)); 88 89 m_dump_nsarray_measurement(frame_zero.FindVariable("nsarray", lldb::eDynamicCanRunTarget)); 90 m_dump_nsarray_measurement(frame_zero.FindVariable("nsmutablearray", lldb::eDynamicCanRunTarget)); 91 92 m_dump_nsdictionary_measurement(frame_zero.FindVariable("nsdictionary", lldb::eDynamicCanRunTarget)); 93 m_dump_nsdictionary_measurement(frame_zero.FindVariable("nsmutabledictionary", lldb::eDynamicCanRunTarget)); 94 95 m_dump_nsstring_measurement(frame_zero.FindVariable("str0", lldb::eDynamicCanRunTarget)); 96 m_dump_nsstring_measurement(frame_zero.FindVariable("str1", lldb::eDynamicCanRunTarget)); 97 m_dump_nsstring_measurement(frame_zero.FindVariable("str2", lldb::eDynamicCanRunTarget)); 98 m_dump_nsstring_measurement(frame_zero.FindVariable("str3", lldb::eDynamicCanRunTarget)); 99 m_dump_nsstring_measurement(frame_zero.FindVariable("str4", lldb::eDynamicCanRunTarget)); 100 101 m_dump_nsdate_measurement(frame_zero.FindVariable("me", lldb::eDynamicCanRunTarget)); 102 m_dump_nsdate_measurement(frame_zero.FindVariable("cutie", lldb::eDynamicCanRunTarget)); 103 m_dump_nsdate_measurement(frame_zero.FindVariable("mom", lldb::eDynamicCanRunTarget)); 104 m_dump_nsdate_measurement(frame_zero.FindVariable("dad", lldb::eDynamicCanRunTarget)); 105 m_dump_nsdate_measurement(frame_zero.FindVariable("today", lldb::eDynamicCanRunTarget)); 106 107 m_dump_nsbundle_measurement(frame_zero.FindVariable("bundles", lldb::eDynamicCanRunTarget)); 108 m_dump_nsbundle_measurement(frame_zero.FindVariable("frameworks", lldb::eDynamicCanRunTarget)); 109 110 m_dump_nsset_measurement(frame_zero.FindVariable("nsset", lldb::eDynamicCanRunTarget)); 111 m_dump_nsset_measurement(frame_zero.FindVariable("nsmutableset", lldb::eDynamicCanRunTarget)); 112 113 m_dump_std_vector_measurement(frame_zero.FindVariable("vector", lldb::eDynamicCanRunTarget)); 114 m_dump_std_list_measurement(frame_zero.FindVariable("list", lldb::eDynamicCanRunTarget)); 115 m_dump_std_map_measurement(frame_zero.FindVariable("map", lldb::eDynamicCanRunTarget)); 116 117 auto sstr0 = frame_zero.FindVariable("sstr0", lldb::eDynamicCanRunTarget); 118 auto sstr1 = frame_zero.FindVariable("sstr1", lldb::eDynamicCanRunTarget); 119 auto sstr2 = frame_zero.FindVariable("sstr2", lldb::eDynamicCanRunTarget); 120 auto sstr3 = frame_zero.FindVariable("sstr3", lldb::eDynamicCanRunTarget); 121 auto sstr4 = frame_zero.FindVariable("sstr4", lldb::eDynamicCanRunTarget); 122 123 m_dump_std_string_measurement.Start(); 124 Xcode::FetchVariable(sstr0,0,false); 125 m_dump_std_string_measurement.Stop(); 126 127 m_dump_std_string_measurement.Start(); 128 Xcode::FetchVariable(sstr1,0,false); 129 m_dump_std_string_measurement.Stop(); 130 131 m_dump_std_string_measurement.Start(); 132 Xcode::FetchVariable(sstr2,0,false); 133 m_dump_std_string_measurement.Stop(); 134 135 m_dump_std_string_measurement.Start(); 136 Xcode::FetchVariable(sstr3,0,false); 137 m_dump_std_string_measurement.Stop(); 138 139 m_dump_std_string_measurement.Start(); 140 Xcode::FetchVariable(sstr4,0,false); 141 m_dump_std_string_measurement.Stop(); 142 143 } 144 145 virtual void 146 TestStep (int counter, ActionWanted &next_action) 147 { 148 switch (counter) 149 { 150 case 0: 151 m_target.BreakpointCreateByLocation("fmts_tester.mm", 78); 152 next_action.Continue(); 153 break; 154 case 1: 155 DoTest (); 156 next_action.Continue(); 157 break; 158 case 2: 159 DoTest (); 160 next_action.Continue(); 161 break; 162 case 3: 163 DoTest (); 164 next_action.Continue(); 165 break; 166 case 4: 167 DoTest (); 168 next_action.Continue(); 169 break; 170 case 5: 171 DoTest (); 172 next_action.Continue(); 173 break; 174 case 6: 175 DoTest (); 176 next_action.Continue(); 177 break; 178 case 7: 179 DoTest (); 180 next_action.Continue(); 181 break; 182 case 8: 183 DoTest (); 184 next_action.Continue(); 185 break; 186 case 9: 187 DoTest (); 188 next_action.Continue(); 189 break; 190 case 10: 191 DoTest (); 192 next_action.Continue(); 193 break; 194 default: 195 next_action.Kill(); 196 break; 197 } 198 } 199 200 virtual void 201 WriteResults (Results &results) 202 { 203 m_dump_std_vector_measurement.WriteAverageAndStandardDeviation(results); 204 m_dump_std_list_measurement.WriteAverageAndStandardDeviation(results); 205 m_dump_std_map_measurement.WriteAverageAndStandardDeviation(results); 206 m_dump_std_string_measurement.WriteAverageAndStandardDeviation(results); 207 208 m_dump_nsstring_measurement.WriteAverageAndStandardDeviation(results); 209 m_dump_nsarray_measurement.WriteAverageAndStandardDeviation(results); 210 m_dump_nsdictionary_measurement.WriteAverageAndStandardDeviation(results); 211 m_dump_nsset_measurement.WriteAverageAndStandardDeviation(results); 212 m_dump_nsbundle_measurement.WriteAverageAndStandardDeviation(results); 213 m_dump_nsdate_measurement.WriteAverageAndStandardDeviation(results); 214 results.Write(m_out_path.c_str()); 215 } 216 217 private: 218 // C++ formatters 219 TimeMeasurement<std::function<void(SBValue)>> m_dump_std_vector_measurement; 220 TimeMeasurement<std::function<void(SBValue)>> m_dump_std_list_measurement; 221 TimeMeasurement<std::function<void(SBValue)>> m_dump_std_map_measurement; 222 TimeMeasurement<std::function<void()>> m_dump_std_string_measurement; 223 224 // Cocoa formatters 225 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsstring_measurement; 226 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsarray_measurement; 227 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdictionary_measurement; 228 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsset_measurement; 229 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsbundle_measurement; 230 TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdate_measurement; 231 232 // useful files 233 std::string m_app_path; 234 std::string m_out_path; 235 }; 236 237 // argv[1] == path to app 238 // argv[2] == path to result 239 int main(int argc, const char * argv[]) 240 { 241 FormattersTest frmtest; 242 frmtest.SetVerbose(true); 243 TestCase::Run(frmtest,argc,argv); 244 return 0; 245 } 246 247