Низкая производительность на x64 бесплатно - PullRequest
6 голосов
/ 01 июля 2011

У меня есть такой класс (предположим, все преемники malloc)

class CMyClass
{
public:
  CMyClass()
  {
  lpData = malloc(128);
  };

  ~CMyClass()
  {
  free(lpData);
  };

public:
  LPVOID lpData;
};

тогда я выполняю это:

CMyClass *lpList = new CMyClass[32768];

delete [] lpList;

Проблема в том, что в x86 код работает нормально и быстро (несколько миллисекунд для завершения в сборках отладки и выпуска), но в x64 вызов delete занимает около 15 секунд, чтобы освободить всю память.

O.S. это Win7 x64.

Подсказки будут оценены.

С уважением, Mauro.

Ответы [ 5 ]

7 голосов
/ 02 июля 2011

Возможно, что если вы запускаете тестовое приложение через отладчик, у вас возникает проблема с производительностью в куче отладки Windows.Добавьте _NO_DEBUG_HEAP=1 в параметры среды для отладчика (в свойствах проекта-> Свойства конфигурации-> Отладка-> Свойство среды в Visual Studio 20xx) и посмотрите, не улучшит ли это ваше освобождение.

1 голос
/ 01 июля 2011

Я только что протестировал это сам, используя gcc 4.6.1-1 в Debian (после добавления typedef void *LPVOID). Нет никакой разницы; оба выполняются мгновенно, даже без какой-либо оптимизации.

Я увеличил длину массива до 1048576, чтобы получить измеримое время выполнения (0,161 с), которое было одинаковым для IA32 и AMD64. Я включил оптимизацию (-O3), и время осталось прежним, но уменьшилось до 0,157 с. -Os (оптимизировать по размеру) имели тот же результат.

Возможно, вы использовали разные варианты сборки, например, у вас на AMD64 включена какая-то отладка доступа к памяти?

1 голос
/ 01 июля 2011

Вы либо неправильно диагностируете проблему, либо у вас включена некоторая проверка кучи. Я ожидал бы такую ​​паршивую производительность, если бы каждый malloc / free назывался VirtualAlloc / VirtualFree, и если это так, вы где-то включили отладку памяти.

0 голосов
/ 02 июля 2011

Я запустил один и тот же код на 64-разрядной версии Windows 7 с пакетом обновления 1 (SP1), x64 Release build, VC10, SP1. X86 и x64 работают точно так же.

Может, вы что-то упустили.

0 голосов
/ 01 июля 2011

Вы пробовали профилировать обе версии, чтобы увидеть, есть ли что-нибудь очевидное? Являются ли размеры в примере реальными размерами? Мое первоначальное предположение состоит в том, что 64-битной версии требуется (много) больше памяти и происходит перегруз ОС, что резко снижает производительность.

...