Почему инвертирование порядка вызова методов также инвертирует время выполнения? - PullRequest
0 голосов
/ 06 мая 2020

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

  var sw = new Stopwatch();
  sw.Start();

  var res1 = Method1();

  sw.Stop();
  Console.WriteLine("method 1: " + sw.ElapsedMilliseconds);
  sw.Reset();
  sw.Start();

  var res2 = Method2();

  sw.Stop();
  Console.WriteLine("method 2: " + sw.ElapsedMilliseconds);

Первый метод выполняется примерно за 70 мс, а второй примерно за 10 мс. Оба метода читают одни и те же файлы, но первый использует массивы для обработки, а второй - списки.

Вопрос

Дело в том, что когда я инвертирую порядок вызовов то время, необходимое для запуска каждого метода, становится равным 70 мс для второго метода (выполняется первым) и 10 мс для первого метода (выполняется вторым). Таким образом, реализации эквивалентны, и кажется, что важен именно порядок вызовов, поскольку нет общих объектов, потоков, асинхронной c или параллельной обработки.

Почему это так?

1 Ответ

4 голосов
/ 06 мая 2020

Это из-за способа. NET работает. При первом прогоне кода это JIT-вывод в машинный код, который быстрее выполняется во второй раз. Таким образом, первый метод всегда будет медленнее, даже если он использует тот же путь кода, что и второй.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...