我有一个相对较大的系统(到目前为止约 25000 行)用于监控与无线电相关的设备。它使用最新版本的 ZedGraph 显示图表等。该程序在 VS2010 和 Win7 上使用 C# 编码。问题是:
- 当我从 VS 中运行程序时,它运行缓慢
- 当我从内置的 EXE 运行程序时,它运行缓慢
- 当我通过性能向导/CPU Profiler 运行程序时,它运行得非常快。
- 当我从构建的 EXE 运行程序,然后启动 VS 并将分析器附加到任何其他进程时,我的程序加速了!
我希望程序总是运行得那么快!
解决方案中的每个项目都设置为 RELEASE,禁用调试非托管代码,禁用定义调试和跟踪常量,优化代码 - 我尝试过,警告级别 - 我尝试过,抑制 JIT - 我尝试过,总之我尝试了所有StackOverflow 上已经提出的解决方案 - 没有一个有效。程序在探查器外慢,在探查器中快。我不认为问题出在我的代码中,因为如果我将分析器也附加到其他不相关的进程,它会变得很快!
请帮忙!我真的需要它在任何地方都那么快,因为它是一个关键业务应用程序,并且不能容忍性能问题......
更新 1 - 8 跟随
--------------------更新1:--------
这个问题似乎与 ZedGraph 无关,因为在我用自己的基本绘图替换 ZedGraph 后它仍然出现。
--------------------更新2:--------
在虚拟机中运行程序,程序仍然运行缓慢,并且从主机运行分析器并不能使其快速。
--------------------更新3:--------
开始截屏到视频也加快了程序的速度!
--------------------更新4:--------
如果我打开英特尔图形驱动程序设置窗口(这个东西: http: //www.intel.com/support/graphics/sb/img/resolution_new.jpg),只是不断地将光标悬停在按钮上,所以它们会发光,等等,我的程序加速了!如果我运行 GPUz 或 Kombustor,它不会加速,所以 GPU 上没有降频 - 它保持稳定的 850Mhz。
--------------------更新5:--------
不同机器上的测试:
- 在配备 Intel HD2000 的 Core i5-2400S 上,UI 运行缓慢,CPU 使用率约为 15%。
- 在同事的 Core 2 Duo 和 Intel G41 Express 上,UI 运行速度很快,但 CPU 使用率约为 90%(这也不正常)
- 在配备专用 Radeon X1650 的 Core i5-2400S 上,UI 运行速度极快,CPU 使用率约为 50%。
--------------------更新6:--------
一段代码显示了我如何更新单个图表(为了便于使用,对其进行graphFFT
了封装):ZedGraphControl
public void LoopDataRefresh() //executes in a new thread
{
while (true)
{
while (!d.Connected)
Thread.Sleep(1000);
if (IsDisposed)
return;
//... other graphs update here
if (signalNewFFT && PanelFFT.Visible)
{
signalNewFFT = false;
#region FFT
bool newRange = false;
if (graphFFT.MaxY != d.fftRangeYMax)
{
graphFFT.MaxY = d.fftRangeYMax;
newRange = true;
}
if (graphFFT.MinY != d.fftRangeYMin)
{
graphFFT.MinY = d.fftRangeYMin;
newRange = true;
}
List<PointF> points = new List<PointF>(2048);
int tempLength = 0;
short[] tempData = new short[2048];
int i = 0;
lock (d.fftDataLock)
{
tempLength = d.fftLength;
tempData = (short[])d.fftData.Clone();
}
foreach (short s in tempData)
points.Add(new PointF(i++, s));
graphFFT.SetLine("FFT", points);
if (newRange)
graphFFT.RefreshGraphComplete();
else if (PanelFFT.Visible)
graphFFT.RefreshGraph();
#endregion
}
//... other graphs update here
Thread.Sleep(5);
}
}
SetLine
是:
public void SetLine(String lineTitle, List<PointF> values)
{
IPointListEdit ip = zgcGraph.GraphPane.CurveList[lineTitle].Points as IPointListEdit;
int tmp = Math.Min(ip.Count, values.Count);
int i = 0;
while(i < tmp)
{
if (values[i].X > peakX)
peakX = values[i].X;
if (values[i].Y > peakY)
peakY = values[i].Y;
ip[i].X = values[i].X;
ip[i].Y = values[i].Y;
i++;
}
while(ip.Count < values.Count)
{
if (values[i].X > peakX)
peakX = values[i].X;
if (values[i].Y > peakY)
peakY = values[i].Y;
ip.Add(values[i].X, values[i].Y);
i++;
}
while(values.Count > ip.Count)
{
ip.RemoveAt(ip.Count - 1);
}
}
RefreshGraph
是:
public void RefreshGraph()
{
if (!explicidX && autoScrollFlag)
{
zgcGraph.GraphPane.XAxis.Scale.Max = Math.Max(peakX + grace.X, rangeX);
zgcGraph.GraphPane.XAxis.Scale.Min = zgcGraph.GraphPane.XAxis.Scale.Max - rangeX;
}
if (!explicidY)
{
zgcGraph.GraphPane.YAxis.Scale.Max = Math.Max(peakY + grace.Y, maxY);
zgcGraph.GraphPane.YAxis.Scale.Min = minY;
}
zgcGraph.Refresh();
}
.
--------------------更新7:--------
只需通过 ANTS 分析器运行它。它告诉我,ZedGraph
程序快速时的刷新计数是慢速时的两倍。以下是截图:
我觉得很奇怪,考虑到部分长度的微小差异,性能在数学精度上却相差两倍。
另外,我更新了 GPU 驱动程序,但没有帮助。
--------------------更新8:--------
不幸的是,几天来,我无法重现这个问题......我得到了恒定的可接受速度(这仍然比我两周前在分析器中的速度慢一些),这不受两周前曾经影响它的任何因素 - 分析器、视频捕获或 GPU 驱动程序窗口。我仍然没有解释是什么原因造成的......