diff --git a/tests/benchmarks/graphics.cpp b/tests/benchmarks/graphics.cpp new file mode 100644 index 0000000000..e70c6a281b --- /dev/null +++ b/tests/benchmarks/graphics.cpp @@ -0,0 +1,142 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: graphics.cpp +// Purpose: Some benchmarks for measuring graphics operations performance +// Author: Vadim Zeitlin +// Created: 2008-04-13 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +#include "wx/app.h" +#include "wx/frame.h" +#include "wx/cmdline.h" +#include "wx/dcclient.h" +#include "wx/dcmemory.h" +#include "wx/stopwatch.h" + +struct GraphicsBenchmarkOptions +{ + GraphicsBenchmarkOptions() + { + mapMode = 0; + penWidth = 0; + + width = 800; + height = 600; + + numLines = 10000; + } + + long mapMode, + penWidth, + width, + height, + numLines; +} opts; + +class GraphicsBenchmarkFrame : public wxFrame +{ +public: + GraphicsBenchmarkFrame() + : wxFrame(NULL, wxID_ANY, "wxWidgets Graphics Benchmark") + { + Connect(wxEVT_PAINT, + wxPaintEventHandler(GraphicsBenchmarkFrame::OnPaint)); + + Show(); + SetClientSize(opts.width, opts.height); + wxClientDC dc(this); + BenchmarkLines("client", dc); + + wxBitmap bmp(opts.width, opts.height); + wxMemoryDC dc2(bmp); + BenchmarkLines("memory", dc2); + } + +protected: + void OnPaint(wxPaintEvent& WXUNUSED(event)) + { + wxPaintDC dc(this); + + BenchmarkLines(" paint", dc); + + wxTheApp->ExitMainLoop(); + } + + void BenchmarkLines(const char *msg, wxDC& dc) + { + if ( opts.mapMode != 0 ) + dc.SetMapMode(opts.mapMode); + if ( opts.penWidth != 0 ) + dc.SetPen(wxPen(*wxWHITE, opts.penWidth)); + + wxPrintf("Benchmarking %s DC: ", msg); + + wxStopWatch sw; + int x = 0, + y = 0; + for ( int n = 0; n < opts.numLines; n++ ) + { + int x1 = rand() % opts.width, + y1 = rand() % opts.height; + + dc.DrawLine(x, y, x1, y1); + + x = x1; + y = y1; + } + + const long t = sw.Time(); + + wxPrintf("%d lines done in %lums = %gus/line\n", + opts.numLines, t, (1000. * t)/opts.numLines); + } +}; + +class GraphicsBenchmarkApp : public wxApp +{ +public: + virtual void OnInitCmdLine(wxCmdLineParser& parser) + { + static const wxCmdLineEntryDesc desc[] = + { + { wxCMD_LINE_OPTION, "m", "map-mode", "", wxCMD_LINE_VAL_NUMBER }, + { wxCMD_LINE_OPTION, "p", "pen-width", "", wxCMD_LINE_VAL_NUMBER }, + { wxCMD_LINE_OPTION, "w", "width", "", wxCMD_LINE_VAL_NUMBER }, + { wxCMD_LINE_OPTION, "h", "height", "", wxCMD_LINE_VAL_NUMBER }, + { wxCMD_LINE_OPTION, "L", "lines", "", wxCMD_LINE_VAL_NUMBER }, + }; + + parser.SetDesc(desc); + } + + virtual bool OnCmdLineParsed(wxCmdLineParser& parser) + { + if ( parser.Found("m", &opts.mapMode) && + (opts.mapMode < 1 || opts.mapMode > wxMM_METRIC) ) + return false; + if ( parser.Found("p", &opts.penWidth) && opts.penWidth < 1 ) + return false; + if ( parser.Found("w", &opts.width) && opts.width < 1 ) + return false; + if ( parser.Found("h", &opts.height) && opts.height < 1 ) + return false; + if ( parser.Found("L", &opts.numLines) && opts.numLines < 1 ) + return false; + + return true; + } + + virtual bool OnInit() + { + if ( !wxApp::OnInit() ) + return false; + + new GraphicsBenchmarkFrame; + + return true; + } +}; + +IMPLEMENT_APP_CONSOLE(GraphicsBenchmarkApp)