У меня есть относительно большая система (до 25000 строк) для мониторинга устройств, связанных с радио. Он показывает графики и такие, используя последнюю версию ZedGraph. Программа кодируется с использованием С# на VS2010 с Win7. Проблема заключается в следующем:
- Когда я запускаю программу из VS, она работает медленно
- Когда я запускаю программу из встроенного EXE, она работает медленно
- когда я запускаю программу, хотя Performance Wizard/CPU Profiler, он запускает Blazing Fast.
- когда я запускаю программу из встроенного EXE, а затем запускаю VS и прикрепляю профилировщик к любому другому процессу, моя программа ускоряется!
Я хочу, чтобы программа всегда выполнялась так быстро!
Каждый проект в решении установлен в RELEASE, Debug неуправляемый код отключен, Define DEBUG и TRACE константы отключены, оптимизировать код - я тоже пытался, уровень предупреждения - я тоже пытался, подавить JIT - я пробовал либо, Короче, я пробовал все решения, уже предлагаемые в StackOverflow - ни один не работал. Программа медленна вне профилировщика, быстро в профилировщике. Я не думаю, что проблема в моем коде, потому что он становится быстрым, если я присоединяю профилировщик к другому, не связанному с ним процессу!
Пожалуйста, помогите! Мне действительно нужно, чтобы это было так быстро повсюду, потому что это критическое приложение для бизнеса и производительность не переносятся...
ОБНОВЛЕНИЯ 1 - 8 следуйте
-------------------- Update1: --------------------
Проблема кажется не связанной с ZedGraph, потому что она все еще проявляется после того, как я заменил ZedGraph своим собственным основным рисунком.
-------------------- Update2: --------------------
Запуск программы на виртуальной машине, программа все еще работает медленно, а запуск профайлера с хост-компьютера не ускоряется.
-------------------- Update3: --------------------
Запуск начального экрана на видео также ускоряет программу up!
-------------------- Update4: --------------------
Если я открою окно настроек графического драйвера Intel (эта вещь: http://www.intel.com/support/graphics/sb/img/resolution_new.jpg) и просто постоянно наведите курсор на кнопки, чтобы они светились и т.д., моя программа ускоряется!. Он не ускоряется, если я запускаю GPUz или Kombustor, но без разгона на GPU - он остается постоянным 850 МГц.
-------------------- Update5: --------------------
Тесты на разных машинах:
- На моем Core i5-2400S с Intel HD2000 пользовательский интерфейс работает медленно, а загрузка процессора составляет ~ 15%.
- На коллеге Core 2 Duo с Intel G41 Express пользовательский интерфейс работает быстро, но загрузка процессора составляет ~ 90% (что тоже не нормально)
- На Core i5-2400S с выделенным Radeon X1650 пользовательский интерфейс работает быстро, загрузка процессора составляет ~ 50%.
-------------------- Update6: --------------------
Отладка кода, показывающая, как я обновляю один граф (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();
}
.
-------------------- Update7: --------------------
Просто запустил его через профилировщик ANTS. Он говорит мне, что обновление ZedGraph
подсчитывается, когда программа выполняется быстро, в точности в два раза выше по сравнению с тем, когда она замедляется.
Вот скриншоты:
Мне очень странно, что, учитывая небольшую разницу в длине разделов, производительность отличается в два раза с математической точностью.
Кроме того, я обновил драйвер GPU, который не помог.
-------------------- Update8: --------------------
К сожалению, в течение нескольких дней я не могу воспроизвести проблему... Я получаю постоянную приемлемую скорость (которая по-прежнему выглядит немного медленнее, чем то, что у меня было в профилировщике две недели назад) t повлиял на любой из факторов, которые повлияли на него две недели назад - профайлер, видеозахват или окно драйвера графического процессора. У меня до сих пор нет объяснений, что вызывало это...