Почему указатель на большую структуру медленнее? - PullRequest
0 голосов
/ 17 апреля 2011

Интересно, в чем может быть причина, что доступ к указателю на большую структуру медленнее.

Например. W добрался до структуры:

Во-первых:

typedef struct TAL {
   struct TAL *next;
  int v;
  int a;
  int b;
  int c;
 } LAL;

И второе:

typedef struct TAL {
   struct TAL *next;
  int v;
 } LAL;

И просто изучите список

LAL *tmp;
tmp = AL;

while(tmp != 0)
{
     tmp = tmp -> next;
}

Время выполнения меньшей структуры (секунды) меньше первого. В чем может быть причина?

Ответы [ 4 ]

1 голос
/ 17 апреля 2011

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

0 голосов
/ 17 апреля 2011

Два предложения:

  • Отсутствие кэша приведет к снижению производительности. Большая структура приводит к большему количеству промахов в кеше.
  • Возможно, ваш подход к измерению времени ошибочен. Можете ли вы показать нам код?
0 голосов
/ 17 апреля 2011

Структуры, вероятно, все находятся рядом друг с другом в памяти, поэтому аппаратное кэширование работает лучше для меньшей структуры.

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

0 голосов
/ 17 апреля 2011

Вы не дали нам полную картину; распределение списков имеет решающее значение для производительности, и легко ошибиться в измерениях производительности.

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

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