Здравствуйте, Андруха, Вы писали:
А>Здравствуйте все! А>...
Я бы посмотрел в сторону Low Fragmentation Heap. Он включён по-умолчанию начиная с Висты, так что сейчас на сервере он выключен, а на Win7 — включён.
To enable the LFH for a heap, use the GetProcessHeap function to obtain a handle to the default heap of the calling process, or use the handle to a private heap created by the HeapCreate function. Then call the HeapSetInformation function with the handle. — http://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx
Здравствуйте, landerhigh, Вы писали:
А>>В C++ программе тормозит выделение памяти по оператору new (malloc соответственно) А>>и происходит это судя по всему изза фрагментации кучи.
L>Как уже сказали, Low Fragmentation Heap, по умолчанию включенный в семерке, объясняет разницу.
Да, так оно и есть, уже LFH работает в программулине.
Написал даже тестовую программулину и на Win XP удалось получить разницу аж почти в 10 раз (LFH/non LFH)
При чем на MSVC 2010 этот эффект пропадает — там crt сама врубает этот флаг по умолчанию.
Эффект достигается в сочетании MSVC 2005 + старые OS (XP, 2003 server).
L>А по-хорошему, нужно бы пересмотреть подход с работе с памятью в программе.
Вы безгранично правы, но светлые идеи не всегда получают воплощение. В принципе оно и сейчас нормально по скорости стало работать. Хотя, как я вижу, там есть где еще оптимизировать. Если руки дойдут — перелопачу несколько мест.
У меня вопрос, может кто сталкивался с довольно странной проблемой:
Установлено следующее:
В C++ программе тормозит выделение памяти по оператору new (malloc соответственно)
и происходит это судя по всему изза фрагментации кучи.
При чем довольно странно. На моей машине работает все нормально,
а на сервере тот же код впадает в ступор (изза фрагментации судя по всему).
Почему изза фрагментации? просто на серваке (где проблемы) програмулина первый раз
отрабытывает влет. впадает в ступор только на следующий раз при обновлении данных (сначала все удаляем,
потом все заново грузим).
То есть я бы не удивлялся если бы симптомы были одинаковые на обоих машинах,
но происходит торможение только на сервере, у меня все OK.
то есть на моей машинке аллокация памяти занимает,
скажем ~5% времени (точно не помню — не суть)
на сервере видел что аллокация занимает ~75% времени исполнения.
То есть где тут что может быть?
Конфигурации машинок:
1). Моя (где все ок — ~5%):
OS Name: Microsoft Windows 7 Enterprise
OS Version: 6.1.7600 N/A Build 7600
OS Manufacturer: Microsoft Corporation
OS Configuration: Member Workstation
OS Build Type: Multiprocessor Free
Registered Owner: Windows User
Original Install Date: 16/09/2011, 19:37:43
System Boot Time: 05/04/2013, 11:58:11
System Model: 7304A58
System Type: x64-based PC
Processor(s): 1 Processor(s) Installed.
[01]: Intel64 Family 6 Model 23 Stepping 10 GenuineIntel ~2642 Mhz
Windows Directory: C:\Windows
System Directory: C:\Windows\system32
Boot Device: \Device\HarddiskVolume2
System Locale: ru;Russian
Input Locale: en-us;English (United States)
Total Physical Memory: 4,061 MB
Available Physical Memory: 872 MB
Virtual Memory: Max Size: 8,121 MB
Virtual Memory: Available: 4,579 MB
Virtual Memory: In Use: 3,542 MB
Page File Location(s): C:\pagefile.sys
2). Сервер (где new может занимать ~75%):
OS Name: Microsoft(R) Windows(R) Server 2003, Enterprise Edition
OS Version: 5.2.3790 Service Pack 2 Build 3790
OS Manufacturer: Microsoft Corporation
OS Configuration: Member Server
OS Build Type: Multiprocessor Free
Original Install Date: 11/12/2008, 01:22:57
System Up Time: 1 Days, 8 Hours, 35 Minutes, 52 Seconds
System Manufacturer: HP
System Model: ProLiant BL685c G5
System Type: X86-based PC
Processor(s): 4 Processor(s) Installed.
[01]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz
[02]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz
[03]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz
[04]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz
Windows Directory: C:\WINNT
System Directory: C:\WINNT\system32
Boot Device: \Device\HarddiskVolume1
Total Physical Memory: 65,534 MB
Available Physical Memory: 61,284 MB
Page File: Max Size: 97,696 MB
Page File: Available: 93,445 MB
Page File: In Use: 4,251 MB
Page File Location(s): C:\pagefile.sys
D:\pagefile1\pagefile.sys
D:\pagefile2\pagefile.sys
D:\pagefile3\pagefile.sys
D:\pagefile4\pagefile.sys
D:\pagefile5\pagefile.sys
D:\pagefile6\pagefile.sys
D:\pagefile7\pagefile.sys
Здравствуйте, MT-Wizard, Вы писали:
MW>Здравствуйте, Андруха, Вы писали:
А>>Здравствуйте все! А>>...
MW>Я бы посмотрел в сторону Low Fragmentation Heap. Он включён по-умолчанию начиная с Висты, так что сейчас на сервере он выключен, а на Win7 — включён.
MW>To enable the LFH for a heap, use the GetProcessHeap function to obtain a handle to the default heap of the calling process, or use the handle to a private heap created by the HeapCreate function. Then call the HeapSetInformation function with the handle. — http://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx
Видимо дельный совет, на stackoverflow примерно тоже самое кто-то ответил.
L>>Как уже сказали, Low Fragmentation Heap, по умолчанию включенный в семерке, объясняет разницу.
А>Да, так оно и есть, уже LFH работает в программулине. А>Написал даже тестовую программулину и на Win XP удалось получить разницу аж почти в 10 раз (LFH/non LFH)
У меня был эпизод в довистовые времена, когда я писал кросс-платформенное приложение. Один и тот же код выгружался на Windows и Linux, компилировался, прогонялись тесты. тесты симулировали серьезную нагрузку, и как следствие огромное количество new/delete.
Linux сборка оказалась почти в 100 раз производительнее виндовой.
L>>А по-хорошему, нужно бы пересмотреть подход с работе с памятью в программе.
А>Вы безгранично правы, но светлые идеи не всегда получают воплощение. В принципе оно и сейчас нормально по скорости стало работать. Хотя, как я вижу, там есть где еще оптимизировать. Если руки дойдут — перелопачу несколько мест.
Лучшее — враг хорошего. Главное — не делать преждевременной пессимизации.