2017-02-03 5 views
0

У меня есть цикл for, который слишком длинный, и я не знаю почему.проблемы с диагностированием времени, проведенного в цикле for C#

Stopwatch proctime = new Stopwatch(); 
Stopwatch innerlooptime = new Stopwatch(); 
Stopwatch outerlooptime = new Stopwatch(); 

proctime.Start(); 
int length = inbtable.Rows.Count; 
outerlooptime.Start(); 
for (int i = 0; i < length; i++) 
{ 
    outerlooptime.Stop(); 
    DataRow newrow = graphdata.NewRow(); 
    innerlooptime.Start(); 
    for (int j = 0; j < graphdata.Columns.Count; j++) 
    { 
     colname = graphdata.Columns[j].ColumnName; 
     newrow[j] = inbtable.Rows[i][colname]; 
    } 
    innerlooptime.Stop(); 
    outerlooptime.Start(); 
    graphdata.Rows.Add(newrow); 
} 
proctime.Stop(); 

если вы время все это, время, затраченное на просто «внутренний цикл» или J-петли как 1/10 секунды.

Время, проведенное внутри цикла i, но не j-loop, равно 1/10 секунды.

Время, затраченное на общий цикл, составляет около 1 секунды. поэтому Time-iloop + Time-jloop - это 1/5-е из общего времени. где остальное время тратится? взгляните на изображение, сравнивая время обработки (proctime в коде), время наружного времени и время внутренней паузы. почему они не подходят к чему-то гораздо ближе друг к другу?

enter image description here

+2

вы начинаете наружное закрытие за пределами первого цикла, но останавливаете его, как только начинается цикл? –

+2

Если вы используете визуальную студию, попробуйте запустить профилировщик производительности с включенными символами Microsoft (параметры -> отладка -> символы). «Горячий путь», созданный профилем cpu, должен указывать, какие вызовы занимают больше всего времени. –

+0

Джеймс, это похоже на то, что мне нужно. Благодаря! Я собираюсь попробовать его прямо сейчас – metinoheat

ответ

1

Вы не показывать объявления ваших таймеров, но имена переменных означает, что вы смотрите на время процессора, а не фактическое количество времени потратить. Время процессора - это время, затрачиваемое процессорным ядром на выполнение ваших вычислений. Процессор является общим для всех процессов, запущенных на вашем компьютере, поэтому через 1 секунду вполне разумно получить 0,2 секунды процессорного времени.

Попробуйте использовать класс Секундомер вместо:

// using System.Diagnostics; 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 

DoThings(); // run your code 

sw.Stop(); 
Debug.WriteLine("Actual time elapsed: " + sw.Elapsed.ToString()); 
+0

Они фактически секундомеры, я обозначил proctime как время обработки цикла. – metinoheat

+1

Извините, плохое допущение с моей стороны. Может быть, 'DataRow newrow = graphdata.NewRow();' занимает много времени - он, похоже, не считается в любом цикле. Время, затрачиваемое на создание объектов, не является незначительным ... –

0

Я понял ответ. это было действительно глупо. У меня в секундах были отключены секундомеры в моей заявке на сообщение в конце функции, поэтому один секундомер сообщался как еще один. все время проводится где-то в другом месте, вне кода, который я опубликовал. Спасибо за всю твою помощь.

Смежные вопросы