Home | History | Annotate | Download | only in formatters
      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