Должен ли я предпочесть переменные или множественные косвенные обращения к массивам в C # в критически важном коде? - PullRequest
1 голос
/ 21 февраля 2012

в некоторой программе для критических перфорированных программ (однопотоковой), если у меня есть массивы примитивных типов, и мне нужно обращаться к одному и тому же индексу из более чем одного раза в циклах.

Должен ли я использовать переменные tmp или просто постоянная косвенность в массиве будет лучше / быстрее?

Я мог бы также представить, что возможно, что либо одно и то же / прозрачно оптимизировано во время компиляции.

Ответы [ 3 ]

4 голосов
/ 21 февраля 2012

Давайте проверим это:

  int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
  int t = arr[3];
  int a = 0;
  var start = DateTime.UtcNow;
  for (int i = 0; i < 1000000000; i++)
  {
    a += t;
  }
  Console.WriteLine(a);
  Console.WriteLine(DateTime.UtcNow-start);
  a = 0;
  start = DateTime.UtcNow;
  for (int i = 0; i < 1000000000; i++)
  {
    a += arr[3];
  }
  Console.WriteLine(a);
  Console.WriteLine(DateTime.UtcNow - start);

Выход:

-294967296
00:00:02.1925000
-294967296
00:00:03.4250000

Да, он медленнее обращается к массиву несколько раз.

3 голосов
/ 21 февраля 2012

In general доступ к массиву медленнее, чем временный, потому что он имеет 2 дополнительных фрагмента служебных данных

  • Уровень косвенности
  • Проверка границ

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

2 голосов
/ 21 февраля 2012

Доступ к массиву всегда включает косвенное обращение, поэтому при частом доступе переменная, скорее всего, будет быстрее.

Тем не менее, я считаю невероятным, что вы сможете измерить разницу. Это пример микрооптимизации.

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