Kaydet (Commit) 54d9755a authored tarafından László Németh's avatar László Németh

add profiling to vcldemo

usage (5 test runs): vcldemo --test 5

Change-Id: Ib8c3db1e74f4a05f16a5359fe8645ffc61e891d5
üst cccf054a
...@@ -33,9 +33,24 @@ ...@@ -33,9 +33,24 @@
#include <vcldemo-debug.hxx> #include <vcldemo-debug.hxx>
#include <rtl/math.hxx>
#define FIXME_SELF_INTERSECTING_WORKING 0 #define FIXME_SELF_INTERSECTING_WORKING 0
#define FIXME_BOUNCE_BUTTON 0 #define FIXME_BOUNCE_BUTTON 0
using namespace com::sun::star;
namespace {
double getTimeNow()
{
TimeValue aValue;
osl_getSystemTime(&aValue);
return (double)aValue.Seconds * 1000 +
(double)aValue.Nanosec / (1000*1000);
}
}
using namespace css; using namespace css;
enum RenderStyle { enum RenderStyle {
...@@ -69,10 +84,14 @@ class DemoRenderer ...@@ -69,10 +84,14 @@ class DemoRenderer
{ return OUString(SAL_STRINGIFY(name)); } \ { return OUString(SAL_STRINGIFY(name)); } \
virtual sal_uInt16 getAccelerator() SAL_OVERRIDE \ virtual sal_uInt16 getAccelerator() SAL_OVERRIDE \
{ return key; } { return key; }
double sumTime = 0;
int countTime = 0;
}; };
std::vector< RegionRenderer * > maRenderers; std::vector< RegionRenderer * > maRenderers;
sal_Int32 mnSelectedRenderer; sal_Int32 mnSelectedRenderer;
sal_Int32 iterCount = 0;
void InitRenderers(); void InitRenderers();
...@@ -97,7 +116,12 @@ public: ...@@ -97,7 +116,12 @@ public:
} }
OUString getRendererList(); OUString getRendererList();
double getAndResetBenchmark(const char * st);
void selectRenderer(const OUString &rName); void selectRenderer(const OUString &rName);
int selectNextRenderer();
void setIterCount(sal_Int32 iterCount);
sal_Int32 getIterCount();
void addTime(int i, double t);
Size maSize; Size maSize;
void SetSizePixel(const Size &rSize) { maSize = rSize; } void SetSizePixel(const Size &rSize) { maSize = rSize; }
...@@ -883,10 +907,10 @@ public: ...@@ -883,10 +907,10 @@ public:
void drawToDevice(OutputDevice &rDev, Size aSize, bool bVDev) void drawToDevice(OutputDevice &rDev, Size aSize, bool bVDev)
{ {
RenderContext aCtx; RenderContext aCtx;
double mnStartTime;
aCtx.mbVDev = bVDev; aCtx.mbVDev = bVDev;
aCtx.mpDemoRenderer = this; aCtx.mpDemoRenderer = this;
aCtx.maSize = aSize; aCtx.maSize = aSize;
Rectangle aWholeWin(Point(0,0), rDev.GetOutputSizePixel()); Rectangle aWholeWin(Point(0,0), rDev.GetOutputSizePixel());
drawBackground(rDev, aWholeWin); drawBackground(rDev, aWholeWin);
...@@ -895,7 +919,9 @@ public: ...@@ -895,7 +919,9 @@ public:
mnSelectedRenderer >= 0) mnSelectedRenderer >= 0)
{ {
aCtx.meStyle = RENDER_EXPANDED; aCtx.meStyle = RENDER_EXPANDED;
mnStartTime = getTimeNow();
maRenderers[mnSelectedRenderer]->RenderRegion(rDev, aWholeWin, aCtx); maRenderers[mnSelectedRenderer]->RenderRegion(rDev, aWholeWin, aCtx);
addTime(mnSelectedRenderer, getTimeNow() - mnStartTime);
} }
else else
{ {
...@@ -903,7 +929,11 @@ public: ...@@ -903,7 +929,11 @@ public:
std::vector<Rectangle> aRegions(partition(aSize, mnSegmentsX, mnSegmentsY)); std::vector<Rectangle> aRegions(partition(aSize, mnSegmentsX, mnSegmentsY));
DemoRenderer::clearRects(rDev, aRegions); DemoRenderer::clearRects(rDev, aRegions);
for (size_t i = 0; i < maRenderers.size(); i++) for (size_t i = 0; i < maRenderers.size(); i++)
{
mnStartTime = getTimeNow();
maRenderers[i]->RenderRegion(rDev, aRegions[i], aCtx); maRenderers[i]->RenderRegion(rDev, aRegions[i], aCtx);
if (!bVDev) addTime(i, getTimeNow() - mnStartTime);
}
} }
} }
std::vector<vcl::Window *> maInvalidates; std::vector<vcl::Window *> maInvalidates;
...@@ -1055,6 +1085,41 @@ OUString DemoRenderer::getRendererList() ...@@ -1055,6 +1085,41 @@ OUString DemoRenderer::getRendererList()
return aBuf.makeStringAndClear(); return aBuf.makeStringAndClear();
} }
double DemoRenderer::getAndResetBenchmark(const char * st)
{
double geomean = 1.0;
fprintf(stderr, "Rendering: %s, Times (ms):\n", st);
for (size_t i = 0; i < maRenderers.size(); i++)
{
double avgtime = maRenderers[i]->sumTime / maRenderers[i]->countTime;
geomean *= avgtime;
fprintf(stderr, "%s: %f (IterCount: %d)\n",
rtl::OUStringToOString(maRenderers[i]->getName(),
RTL_TEXTENCODING_UTF8).getStr(), avgtime, maRenderers[i]->countTime);
maRenderers[i]->sumTime = 0;
maRenderers[i]->countTime = 0;
}
geomean = pow(geomean, static_cast<double>(1.0)/maRenderers.size());
fprintf(stderr, "GEOMEAN_%s: %f\n", st, geomean);
return geomean;
}
void DemoRenderer::setIterCount(sal_Int32 i)
{
iterCount = i;
}
sal_Int32 DemoRenderer::getIterCount()
{
return iterCount;
}
void DemoRenderer::addTime(int i, double t)
{
maRenderers[i]->sumTime += t;
maRenderers[i]->countTime++;
}
void DemoRenderer::selectRenderer(const OUString &rName) void DemoRenderer::selectRenderer(const OUString &rName)
{ {
for (size_t i = 0; i < maRenderers.size(); i++) for (size_t i = 0; i < maRenderers.size(); i++)
...@@ -1068,6 +1133,15 @@ void DemoRenderer::selectRenderer(const OUString &rName) ...@@ -1068,6 +1133,15 @@ void DemoRenderer::selectRenderer(const OUString &rName)
} }
} }
int DemoRenderer::selectNextRenderer()
{
mnSelectedRenderer++;
if (mnSelectedRenderer == (signed) maRenderers.size())
mnSelectedRenderer = -1;
Invalidate();
return mnSelectedRenderer;
}
class DemoWin : public WorkWindow class DemoWin : public WorkWindow
{ {
DemoRenderer &mrRenderer; DemoRenderer &mrRenderer;
...@@ -1101,7 +1175,27 @@ public: ...@@ -1101,7 +1175,27 @@ public:
{ {
mrRenderer.SetSizePixel(GetSizePixel()); mrRenderer.SetSizePixel(GetSizePixel());
fprintf(stderr, "DemoWin::Paint(%ld,%ld,%ld,%ld)\n", rRect.getX(), rRect.getY(), rRect.getWidth(), rRect.getHeight()); fprintf(stderr, "DemoWin::Paint(%ld,%ld,%ld,%ld)\n", rRect.getX(), rRect.getY(), rRect.getWidth(), rRect.getHeight());
mrRenderer.drawToDevice(*this, GetSizePixel(), false); if (mrRenderer.getIterCount() == 0)
mrRenderer.drawToDevice(*this, GetSizePixel(), false);
else
TestAndQuit();
}
virtual void TestAndQuit()
{
for (sal_Int32 i = 0; i < mrRenderer.getIterCount(); i++)
while (mrRenderer.selectNextRenderer() > -1)
mrRenderer.drawToDevice(*this, GetSizePixel(), false);
double expandedGEOMEAN = mrRenderer.getAndResetBenchmark("EXPANDED");
for (sal_Int32 i = 0; i < mrRenderer.getIterCount(); i++)
mrRenderer.drawToDevice(*this, GetSizePixel(), false);
double thumbGEOMEAN = mrRenderer.getAndResetBenchmark("THUMB");
fprintf(stderr, "GEOMEAN_TOTAL: %f\n", pow(thumbGEOMEAN * expandedGEOMEAN, static_cast<double>(0.5)));
Application::Quit();
} }
}; };
...@@ -1111,11 +1205,12 @@ class DemoApp : public Application ...@@ -1111,11 +1205,12 @@ class DemoApp : public Application
int showHelp(DemoRenderer &rRenderer) int showHelp(DemoRenderer &rRenderer)
{ {
fprintf(stderr,"vcldemo - a VCL test app\n"); fprintf(stderr,"vcldemo - a VCL test app\n");
fprintf(stderr," --help - print this text\n"); fprintf(stderr," --help - print this text\n");
fprintf(stderr," --show <renderer> - start with a given renderer, options are:\n"); fprintf(stderr," --show <renderer> - start with a given renderer, options are:\n");
OUString aRenderers(rRenderer.getRendererList()); OUString aRenderers(rRenderer.getRendererList());
fprintf(stderr," %s\n\n", fprintf(stderr," %s\n",
rtl::OUStringToOString(aRenderers, RTL_TEXTENCODING_UTF8).getStr()); rtl::OUStringToOString(aRenderers, RTL_TEXTENCODING_UTF8).getStr());
fprintf(stderr," --test <iterCount> - create benchmark data\n\n");
return 0; return 0;
} }
...@@ -1141,6 +1236,13 @@ public: ...@@ -1141,6 +1236,13 @@ public:
else else
aRenderer.selectRenderer(GetCommandLineParam(++i)); aRenderer.selectRenderer(GetCommandLineParam(++i));
} }
if (aArg == "--test")
{
if (bLast)
return showHelp(aRenderer);
else
aRenderer.setIterCount(GetCommandLineParam(++i).toInt32());
}
} }
DemoWin aMainWin(aRenderer); DemoWin aMainWin(aRenderer);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment