2013-04-05 9 views
9

Qualcuno potrebbe dirmi perché seguenti cose potrebbero accadere:strano rallentamento del Allocati C++

Ho 2 computer:

  1. mio comp lavoro
  2. Server

io sostengo Programma C++ (msvc 2005 C++ compilato) che funziona troppo lentamente solo sul server, ma non sul mio comp.

ho condotto misurazioni (GetThreadTimes e così via) e potrebbe sicuramente dire che il posto stretta - la sua allocazione di memoria (nuovo/malloc). E succede solo sul server!

potrei affermare che accade a causa di frammentazione di memoria a causa di prima istanza del server ora del programma funziona bene, il suo inizio tempo perdere le allocazioni solo dopo che i dati ricaricare di nuovo nella memoria (1-1,5 milioni di Allocati/frees).

mi fosse scadente così sorpreso se vedo lo stesso comportamento a causa di memoria frammentazione su entrambi i computer (il mio comp e server) ma quello che vedo è: 1). sulle mie allocazioni di compendi prendi ~ 5% di tempo (non è esatto ma qualcosa del genere) 2). sul server questi allocamenti richiedono ~ 75% di tempo

come questo potrebbe accadere? Cosa potrebbe rallentare le allocazioni C++ sul computer Server, nel frattempo è OK per la mia workstation. Dove potrebbe esserci differenza? Probabilmente è qualcosa connesso con le funzioni di gestione della memoria a livello di sistema operativo? perché il gestore di livello C++ lo stesso in entrambi i casi.

Ecco entrambe le configurazioni:

1). Il mio computer (dove gli stanziamenti prendono ~ 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). Server (dove gli stanziamenti prendono ~ 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 

Sarà grato per chiarire questo problema.

+0

Si sta utilizzando lo stesso set di dati su entrambe le macchine? – nneonneo

+0

no, ma comparabile. La mia comp ha circa 260.000 oggetti funzionanti in modo fluente, il server compista con difficoltà a ~ 350 000 e più oggetti inizia persino a lavorare sodo anche durante il carico 1o 100 000 articoli. –

risposta

4

Il problema potrebbe essere che le funzioni di memoria utilizzano solo un mutex per bloccare la memoria per l'allocazione e la liberazione.

+2

MSVC++ 2005 non è esattamente la versione più recente, né è Server 2003. Il computer Windows 7 ha l'heap di frammentazione basso abilitato per impostazione predefinita. Questa è quindi una risposta abbastanza credibile. Mi aspetto che le versioni più recenti funzionino molto meglio con le macchine 4x4 core. Per ovviare al problema, prova un altro allocatore come ad es. [jemalloc] (http://www.canonware.com/jemalloc) – MSalters

+3

Interessante. E citando da questo thread (http://stackoverflow.com/questions/4859263/can-multithreading-speed-up-memory-allocation)- "... le funzioni di heap del SO funzioneranno piuttosto bene se l'heap a bassa frammentazione è abilitato , che per impostazione predefinita è Windows Vista (su Windows XP può essere abilitato dall'applicazione con una semplice chiamata a HeapSetInformation()).E con LFH abilitato, le prestazioni dell'heap di Windows sono paragonabili agli altri allocatori più veloci disponibili " – SChepurin

+0

grazie, considererò jemalloc, probabilmente aiuterà, ma non sono sicuro che sarà accettato dal mio capo :) –