diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-01-06 20:12:03 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-01-06 20:12:03 +0000 | 
| commit | 9e6d35490a6542f9c97607f93c2ef8ca8e03cbcc (patch) | |
| tree | dd2a1ddf0476664c2b823409c36cbccd52662ca7 /packages/Python/lldbsuite/test/benchmarks/expression | |
| parent | 3bd2e91faeb9eeec1aae82c64a3253afff551cfd (diff) | |
Notes
Diffstat (limited to 'packages/Python/lldbsuite/test/benchmarks/expression')
4 files changed, 258 insertions, 0 deletions
| diff --git a/packages/Python/lldbsuite/test/benchmarks/expression/Makefile b/packages/Python/lldbsuite/test/benchmarks/expression/Makefile new file mode 100644 index 0000000000000..8a7102e347af2 --- /dev/null +++ b/packages/Python/lldbsuite/test/benchmarks/expression/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/benchmarks/expression/TestExpressionCmd.py b/packages/Python/lldbsuite/test/benchmarks/expression/TestExpressionCmd.py new file mode 100644 index 0000000000000..abf45147d6360 --- /dev/null +++ b/packages/Python/lldbsuite/test/benchmarks/expression/TestExpressionCmd.py @@ -0,0 +1,72 @@ +"""Test lldb's expression evaluations and collect statistics.""" + +from __future__ import print_function + + + +import os, sys +import lldb +from lldbsuite.test import configuration +from lldbsuite.test.lldbbench import * + +class ExpressionEvaluationCase(BenchBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        BenchBase.setUp(self) +        self.source = 'main.cpp' +        self.line_to_break = line_number(self.source, '// Set breakpoint here.') +        self.count = 25 + +    @benchmarks_test +    @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") +    def test_expr_cmd(self): +        """Test lldb's expression commands and collect statistics.""" +        self.build() +        self.exe_name = 'a.out' + +        print() +        self.run_lldb_repeated_exprs(self.exe_name, self.count) +        print("lldb expr cmd benchmark:", self.stopwatch) + +    def run_lldb_repeated_exprs(self, exe_name, count): +        import pexpect +        exe = os.path.join(os.getcwd(), exe_name) + +        # Set self.child_prompt, which is "(lldb) ". +        self.child_prompt = '(lldb) ' +        prompt = self.child_prompt + +        # Reset the stopwatch now. +        self.stopwatch.reset() +        for i in range(count): +            # So that the child gets torn down after the test. +            self.child = pexpect.spawn('%s %s %s' % (lldbtest_config.lldbExec, self.lldbOption, exe)) +            child = self.child + +            # Turn on logging for what the child sends back. +            if self.TraceOn(): +                child.logfile_read = sys.stdout + +            child.expect_exact(prompt) +            child.sendline('breakpoint set -f %s -l %d' % (self.source, self.line_to_break)) +            child.expect_exact(prompt) +            child.sendline('run') +            child.expect_exact(prompt) +            expr_cmd1 = 'expr ptr[j]->point.x' +            expr_cmd2 = 'expr ptr[j]->point.y' + +            with self.stopwatch: +                child.sendline(expr_cmd1) +                child.expect_exact(prompt) +                child.sendline(expr_cmd2) +                child.expect_exact(prompt) + +            child.sendline('quit') +            try: +                self.child.expect(pexpect.EOF) +            except: +                pass + +        self.child = None diff --git a/packages/Python/lldbsuite/test/benchmarks/expression/TestRepeatedExprs.py b/packages/Python/lldbsuite/test/benchmarks/expression/TestRepeatedExprs.py new file mode 100644 index 0000000000000..e5cada3563faf --- /dev/null +++ b/packages/Python/lldbsuite/test/benchmarks/expression/TestRepeatedExprs.py @@ -0,0 +1,130 @@ +"""Test evaluating expressions repeatedly comparing lldb against gdb.""" + +from __future__ import print_function + + + +import os, sys +import lldb +from lldbsuite.test import configuration +from lldbsuite.test.lldbbench import * + +class RepeatedExprsCase(BenchBase): + +    mydir = TestBase.compute_mydir(__file__) + +    def setUp(self): +        BenchBase.setUp(self) +        self.source = 'main.cpp' +        self.line_to_break = line_number(self.source, '// Set breakpoint here.') +        self.lldb_avg = None +        self.gdb_avg = None +        self.count = 100 + +    @benchmarks_test +    @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") +    def test_compare_lldb_to_gdb(self): +        """Test repeated expressions with lldb vs. gdb.""" +        self.build() +        self.exe_name = 'a.out' + +        print() +        self.run_lldb_repeated_exprs(self.exe_name, self.count) +        print("lldb benchmark:", self.stopwatch) +        self.run_gdb_repeated_exprs(self.exe_name, self.count) +        print("gdb benchmark:", self.stopwatch) +        print("lldb_avg/gdb_avg: %f" % (self.lldb_avg/self.gdb_avg)) + +    def run_lldb_repeated_exprs(self, exe_name, count): +        import pexpect +        exe = os.path.join(os.getcwd(), exe_name) + +        # Set self.child_prompt, which is "(lldb) ". +        self.child_prompt = '(lldb) ' +        prompt = self.child_prompt + +        # So that the child gets torn down after the test. +        self.child = pexpect.spawn('%s %s %s' % (lldbtest_config.lldbExec, self.lldbOption, exe)) +        child = self.child + +        # Turn on logging for what the child sends back. +        if self.TraceOn(): +            child.logfile_read = sys.stdout + +        child.expect_exact(prompt) +        child.sendline('breakpoint set -f %s -l %d' % (self.source, self.line_to_break)) +        child.expect_exact(prompt) +        child.sendline('run') +        child.expect_exact(prompt) +        expr_cmd1 = 'expr ptr[j]->point.x' +        expr_cmd2 = 'expr ptr[j]->point.y' + +        # Reset the stopwatch now. +        self.stopwatch.reset() +        for i in range(count): +            with self.stopwatch: +                child.sendline(expr_cmd1) +                child.expect_exact(prompt) +                child.sendline(expr_cmd2) +                child.expect_exact(prompt) +            child.sendline('process continue') +            child.expect_exact(prompt)         + +        child.sendline('quit') +        try: +            self.child.expect(pexpect.EOF) +        except: +            pass + +        self.lldb_avg = self.stopwatch.avg() +        if self.TraceOn(): +            print("lldb expression benchmark:", str(self.stopwatch)) +        self.child = None + +    def run_gdb_repeated_exprs(self, exe_name, count): +        import pexpect +        exe = os.path.join(os.getcwd(), exe_name) + +        # Set self.child_prompt, which is "(gdb) ". +        self.child_prompt = '(gdb) ' +        prompt = self.child_prompt + +        # So that the child gets torn down after the test. +        self.child = pexpect.spawn('gdb --nx %s' % exe) +        child = self.child + +        # Turn on logging for what the child sends back. +        if self.TraceOn(): +            child.logfile_read = sys.stdout + +        child.expect_exact(prompt) +        child.sendline('break %s:%d' % (self.source, self.line_to_break)) +        child.expect_exact(prompt) +        child.sendline('run') +        child.expect_exact(prompt) +        expr_cmd1 = 'print ptr[j]->point.x' +        expr_cmd2 = 'print ptr[j]->point.y' + +        # Reset the stopwatch now. +        self.stopwatch.reset() +        for i in range(count): +            with self.stopwatch: +                child.sendline(expr_cmd1) +                child.expect_exact(prompt) +                child.sendline(expr_cmd2) +                child.expect_exact(prompt) +            child.sendline('continue') +            child.expect_exact(prompt)         + +        child.sendline('quit') +        child.expect_exact('The program is running.  Exit anyway?') +        child.sendline('y') +        try: +            self.child.expect(pexpect.EOF) +        except: +            pass + +        self.gdb_avg = self.stopwatch.avg() +        if self.TraceOn(): +            print("gdb expression benchmark:", str(self.stopwatch)) +        self.child = None diff --git a/packages/Python/lldbsuite/test/benchmarks/expression/main.cpp b/packages/Python/lldbsuite/test/benchmarks/expression/main.cpp new file mode 100644 index 0000000000000..8f2706e26388a --- /dev/null +++ b/packages/Python/lldbsuite/test/benchmarks/expression/main.cpp @@ -0,0 +1,51 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include <stdio.h> + +class Point { +public: +    int x; +    int y; +    Point(int a, int b): +        x(a), +        y(b) +    {} +}; + +class Data { +public: +    int id; +    Point point; +    Data(int i): +        id(i), +        point(0, 0) +    {} +}; + +int main(int argc, char const *argv[]) { +    Data *data[1000]; +    Data **ptr = data; +    for (int i = 0; i < 1000; ++i) { +        ptr[i] = new Data(i); +        ptr[i]->point.x = i; +        ptr[i]->point.y = i+1; +    } + +    printf("Finished populating data.\n"); +    for (int j = 0; j < 1000; ++j) { +        bool dump = argc > 1; // Set breakpoint here. +                              // Evaluate a couple of expressions (2*1000 = 2000 exprs): +                              // expr ptr[j]->point.x +                              // expr ptr[j]->point.y +        if (dump) { +            printf("data[%d] = %d (%d, %d)\n", j, ptr[j]->id, ptr[j]->point.x, ptr[j]->point.y); +        } +    } +    return 0; +} | 
