From 7a2421095c730b4c09242643e1fdd56ca4d45e08 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Thu, 22 Jan 2015 19:33:53 +0000 Subject: [PATCH] Add a benchmark test case that shows how much slower repeat 'continue' commands are than going through the SB API directly llvm-svn: 226852 --- lldb/test/benchmarks/continue/Makefile | 5 ++ .../benchmarks/continue/TestBenchmarkContinue.py | 79 ++++++++++++++++++++++ lldb/test/benchmarks/continue/main.cpp | 36 ++++++++++ 3 files changed, 120 insertions(+) create mode 100644 lldb/test/benchmarks/continue/Makefile create mode 100644 lldb/test/benchmarks/continue/TestBenchmarkContinue.py create mode 100644 lldb/test/benchmarks/continue/main.cpp diff --git a/lldb/test/benchmarks/continue/Makefile b/lldb/test/benchmarks/continue/Makefile new file mode 100644 index 0000000..8a7102e --- /dev/null +++ b/lldb/test/benchmarks/continue/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules diff --git a/lldb/test/benchmarks/continue/TestBenchmarkContinue.py b/lldb/test/benchmarks/continue/TestBenchmarkContinue.py new file mode 100644 index 0000000..40e9c6d --- /dev/null +++ b/lldb/test/benchmarks/continue/TestBenchmarkContinue.py @@ -0,0 +1,79 @@ +""" +Test lldb data formatter subsystem. +""" + +import os, time +import unittest2 +import lldb +from lldbbench import * +import lldbutil + +class TestBenchmarkContinue(BenchBase): + + mydir = TestBase.compute_mydir(__file__) + + @benchmarks_test + @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") + @dsym_test + def test_with_dsym_and_run_command(self): + """Benchmark different ways to continue a process""" + self.buildDsym() + self.data_formatter_commands() + + @benchmarks_test + @skipIfLinux # No standard locations for libc++ on Linux, so skip for now + @dwarf_test + def test_with_dwarf_and_run_command(self): + """Benchmark different ways to continue a process""" + self.buildDwarf() + self.data_formatter_commands() + + def setUp(self): + # Call super's setUp(). + BenchBase.setUp(self) + + def data_formatter_commands(self): + """Benchmark different ways to continue a process""" + self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + + bkpt = self.target().FindBreakpointByID(lldbutil.run_break_set_by_source_regexp (self, "// break here")) + + self.runCmd("run", RUN_SUCCEEDED) + + # The stop reason of the thread should be breakpoint. + self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, + substrs = ['stopped', + 'stop reason = breakpoint']) + + # This is the function to remove the custom formats in order to have a + # clean slate for the next test case. + def cleanup(): + self.runCmd('type format clear', check=False) + self.runCmd('type summary clear', check=False) + self.runCmd('type filter clear', check=False) + self.runCmd('type synth clear', check=False) + self.runCmd("settings set target.max-children-count 256", check=False) + + # Execute the cleanup function during test case tear down. + self.addTearDownHook(cleanup) + + runCmd_sw = Stopwatch() + lldbutil_sw = Stopwatch() + + for i in range(0,15): + runCmd_sw.start() + self.runCmd("continue") + runCmd_sw.stop() + + for i in range(0,15): + lldbutil_sw.start() + lldbutil.continue_to_breakpoint(self.process(), bkpt) + lldbutil_sw.stop() + + print "runCmd: %s\nlldbutil: %s" % (runCmd_sw,lldbutil_sw) + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() diff --git a/lldb/test/benchmarks/continue/main.cpp b/lldb/test/benchmarks/continue/main.cpp new file mode 100644 index 0000000..d715a11 --- /dev/null +++ b/lldb/test/benchmarks/continue/main.cpp @@ -0,0 +1,36 @@ +#include + +#define intint_map std::map + +int g_the_foo = 0; + +int thefoo_rw(int arg = 1) +{ + if (arg < 0) + arg = 0; + if (!arg) + arg = 1; + g_the_foo += arg; + return g_the_foo; +} + +int main() +{ + intint_map ii; + + for (int i = 0; i < 15; i++) + { + ii[i] = i + 1; + thefoo_rw(i); // break here + } + + ii.clear(); + + for (int j = 0; j < 15; j++) + { + ii[j] = j + 1; + thefoo_rw(j); // break here + } + + return 0; +} -- 2.7.4