Moving performance timer to AGG GUI

Putting in some performance monitoring for startup.
This commit is contained in:
larsbrubaker 2015-10-25 19:40:17 -07:00
parent 6d0dc37bab
commit ed2d36f25a
7 changed files with 35 additions and 222 deletions

View file

@ -1,48 +0,0 @@
/*
Copyright (c) 2015, Lars Brubaker
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
#if __ANDROID__
#else
#define USE_SYSTEM_WINDOW
#endif
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace MatterHackers.MatterControl
{
internal interface IPerformanceResults
{
void SetTime(string name, double elapsedSeconds, int recursionCount);
}
}

View file

@ -41,9 +41,14 @@ using System.Text;
namespace MatterHackers.MatterControl
{
internal class PerformanceResultsMCOverlay : FlowLayoutWidget, IPerformanceResults
public class PerformanceResultsMCOverlay : FlowLayoutWidget, IPerformanceResults
{
internal class PannelsWidget : FlowLayoutWidget
public static IPerformanceResults CreateResultsSystemWindow(string name)
{
return new PerformanceResultsMCOverlay(name);
}
private class PannelsWidget : FlowLayoutWidget
{
public override void AddChild(GuiWidget childToAdd, int indexInChildrenList = -1)
{
@ -67,7 +72,7 @@ namespace MatterHackers.MatterControl
FlowLayoutWidget bottomToTop = new FlowLayoutWidget(FlowDirection.BottomToTop);
internal PerformanceResultsMCOverlay(string name)
private PerformanceResultsMCOverlay(string name)
: base(FlowDirection.TopToBottom)
{
Margin = new BorderDouble(5);
@ -80,16 +85,19 @@ namespace MatterHackers.MatterControl
pannels.Selectable = false;
pannels.HAnchor |= HAnchor.ParentLeft;
pannels.VAnchor |= VAnchor.ParentTop;
MatterControlApplication.Instance.AddChild(pannels);
UiThread.RunOnIdle(() => MatterControlApplication.Instance.AddChild(pannels));
}
TextWidget titleWidget = new TextWidget(name,pointSize:14)
{
BackgroundColor = new RGBA_Bytes(),
TextColor = new RGBA_Bytes(20, 120, 20),
};
titleWidget.Printer.DrawFromHintedCache = true;
AddChild(titleWidget);
// add in the column title
{
TextWidget titleWidget = new TextWidget(name, pointSize: 14)
{
BackgroundColor = new RGBA_Bytes(),
TextColor = new RGBA_Bytes(20, 120, 20),
};
titleWidget.Printer.DrawFromHintedCache = true;
AddChild(titleWidget);
}
AddChild(bottomToTop);
@ -141,6 +149,9 @@ namespace MatterHackers.MatterControl
outputText = new string(' ', recursionCount-1) + "|_" + outputText;
}
}
// TODO: put this is a pre-draw variable to set next time we are going to draw
// Doing it here causes an invalidate and endlelss drawing.
timers[name].Text = outputText;
}
}

View file

@ -1,81 +0,0 @@
/*
Copyright (c) 2015, Lars Brubaker
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
#if __ANDROID__
#else
#define USE_SYSTEM_WINDOW
#endif
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace MatterHackers.MatterControl
{
internal class PerformanceResultsSystemWindow : SystemWindow, IPerformanceResults
{
Dictionary<string, TextWidget> timers = new Dictionary<string,TextWidget>();
FlowLayoutWidget topToBottom;
internal PerformanceResultsSystemWindow(string name)
: base(350, 200)
{
Title = name;
BackgroundColor = RGBA_Bytes.White;
topToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom)
{
HAnchor = HAnchor.ParentLeftRight,
VAnchor = VAnchor.ParentBottomTop,
};
AddChild(topToBottom);
ShowAsSystemWindow();
}
public void SetTime(string name, double elapsedSeconds, int recursionCount)
{
if (!timers.ContainsKey(name))
{
TextWidget newTimeWidget = new TextWidget("waiting")
{
AutoExpandBoundsToText = true,
};
newTimeWidget.Printer.DrawFromHintedCache = true;
timers.Add(name, newTimeWidget);
topToBottom.AddChild(newTimeWidget);
}
timers[name].Text = "{0:0.00} ms - {1}".FormatWith(elapsedSeconds * 1000, name);
}
}
}

View file

@ -1,74 +0,0 @@
/*
Copyright (c) 2015, Lars Brubaker
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace MatterHackers.MatterControl
{
public class PerformanceTimer : IDisposable
{
static int recursionCount = 0;
static Dictionary<string, IPerformanceResults> resultsWindows = new Dictionary<string, IPerformanceResults>();
private IPerformanceResults timingWindowToReportTo;
private string name;
Stopwatch timer;
public PerformanceTimer(string windowName, string name)
{
if(!resultsWindows.ContainsKey(windowName))
{
#if __ANDROID__
IPerformanceResults timingWindowToReportTo = new PerformanceResultsMCOverlay(windowName);
#else
IPerformanceResults timingWindowToReportTo = new PerformanceResultsMCOverlay(windowName);
//IPerformanceResults timingWindowToReportTo = new PerformanceResultsSystemWindow(windowName);
#endif
resultsWindows.Add(windowName, timingWindowToReportTo);
}
this.timingWindowToReportTo = resultsWindows[windowName];
this.name = name;
timer = Stopwatch.StartNew();
recursionCount++;
}
public void Dispose()
{
timer.Stop();
recursionCount--;
timingWindowToReportTo.SetTime(name, timer.Elapsed.TotalSeconds, recursionCount);
}
}
}