время, видимое изнутри функции, удивительно меньше, чем время, видимое из вызывающего кода - PullRequest
3 голосов
/ 10 ноября 2011

У меня проблема с измерением времени, которая действительно беспокоит меня. Я выполняю что-то вроде следующего кода (в C #):

Stopwatch sw = Stopwatch.StartNew();
Foo(args);
sw.Stop();
//log time

public void Foo(var args)
{
    Stopwatch sw = Stopwatch.StartNew();
    //do stuff
    sw.Stop();
    //log time
}

И результат большой разницы между обоими разами, мой код дает мне: 15535 мс изнутри функции и 15668 мс снаружи ... 133 мс кажется мне очень много для вызова функции (даже с 10 параметры, которые я даю своим), или для указания точности секундомера (которая должна быть сверхточной).

Как бы вы объяснили эту разницу во времени?

note 1 : То же самое происходит при нескольких последовательных вызовах: я получаю разницу в 133, 81, 72, 75, 75 миллисекунд для 5 вызовов

примечание 2 : фактические параметры моей функции:

  • 6 объектов класса
  • один массив структуры (массив передается как ссылка, верно?)
  • 2 ref int
  • 1 байт []
  • 1 класс
  • 1 структура небольшого размера (<25 байт) </li>

Обновление : В Release различие для первого вызова еще больше (является ли JIT-компиляция более дорогой в релизе, что могло бы объяснить это?), И следующие шаги имеют те же издержки (~ 75 мс) Я попытался инициализировать секундомеры снаружи, передать один как параметр и войти за пределы функции, разница все еще там.

Я также забыл, что я даю некоторые свойства в качестве параметров, которые должны создаваться в первый раз, поэтому разница в 50 мс для первого вызова может быть объяснена инициализацией свойств и компиляцией JIT.

1 Ответ

0 голосов
/ 16 ноября 2011

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

Мораль такова: свойства не должны иметь побочных эффектов. Если вы создаете свойство, которое не делает что-то очевидное, вместо этого закодируйте функцию или, по крайней мере, предупредите следующего разработчика о том, что вы делаете в документации к свойству!

И мораль морали такова: если что-то выглядит подозрительно, всегда смотрите на дерево вызовов на самый глубокий уровень!

...