2009-02-02 10 views
5

Windows HeapFree, msvcrt free: verursachen sie das Freigeben des Speichers, um ausgelagert zu werden? Ich versuche abzuschätzen, ob das Freigeben von Speicher beim Beenden das Herunterfahren der Anwendung erheblich beschleunigen würde.Berühren Speicherdeallokationsroutinen den Block, der freigegeben wird?

HINWEIS: Dies ist eine sehr spezifische technische Frage. Es geht nicht darum, ob Anwendungen am Ausgang free aufrufen sollen oder nicht.

+0

Sehr interessante Frage. Ich hoffe, dass jemand es beantworten kann. BTW, haben Sie versucht, in MSDN-Foren zu fragen? –

+0

Ich denke, du solltest den Schnitt als Antwort gepostet haben. Gute Arbeit! –

Antwort

1

Ich habe einen Test für HeapFree ausgeführt. Das folgende Programm hat Zugriffsverletzung innerhalb HeapFree bei i = 31999:

#include <windows.h> 

int main() { 

    HANDLE heap = GetProcessHeap(); 
    void * bufs[64000]; 

    // populate heap 
    for (unsigned i = 0; i < _countof(bufs); ++i) { 
     bufs[i] = HeapAlloc(heap, 0, 4000); 
    } 

    // protect a block in the "middle" 
    DWORD dwOldProtect; 
    VirtualProtect(
     bufs[_countof(bufs)/2], 4000, PAGE_NOACCESS, 
     &dwOldProtect); 

    // free blocks 
    for (unsigned i = 0; i < _countof(bufs); ++i) { 
     HeapFree(heap, 0, bufs[i]); 
    } 
} 

Der Stapel ist

[email protected]() + 0x12b9 bytes 
[email protected]() + 0x91f bytes 
shutfree.exe!main() Line 19 C++ 

So sieht es aus wie die Antwort „Ja“ ist (dies gilt für free als auch, da es verwendet HeapFree intern)

0

Ich bin fast sicher, dass die Antwort auf die Frage der Geschwindigkeitsverbesserung "ja" wäre. Das Freigeben eines Blocks kann den fraglichen Block berühren oder nicht, aber er muss auf jeden Fall andere Buchhaltungsinformationen aktualisieren. Wenn Sie zig Millionen kleiner Objekte zugewiesen haben (das passiert), könnte der Aufwand, der erforderlich ist, um sie alle freizugeben, erhebliche Auswirkungen haben.

Wenn Sie es arrangieren können, könnten Sie versuchen, Ihre Anwendung so einzurichten, dass, wenn sie weiß, dass sie beendet wird, alle ausstehenden Arbeiten (Konfiguration, Dokumente, was auch immer) gespeichert und problemlos beendet werden.

+0

Sicher, nicht eine Funktion aufrufen ist schneller als das Aufrufen :) Aber die Frage war nicht, sondern Heap-Manager-Besonderheiten. Das Herunterfahren zu beschleunigen ist nur ein Kontext. – Constantin

4

Wenn Sie nicht alle Ressourcen beim Beenden der Anwendung sauber freigeben, wird es nahezu unmöglich, zu erkennen, ob Sie ernsthafte Probleme - wie Speicherlecks - haben, die eher ein Problem als ein langsames Herunterfahren sind . Wenn die Benutzeroberfläche schnell verschwindet, wird der Benutzer denken, dass er schnell heruntergefahren ist, auch wenn es noch viel zu tun gibt. Bei UI ist die Wahrnehmung der Geschwindigkeit wichtiger als die tatsächliche Geschwindigkeit. Wenn der Benutzer die Option 'Anwendung beenden' auswählt, sollte das Hauptanwendungsfenster sofort verschwinden. Es spielt keine Rolle, wenn die Anwendung ein paar Sekunden danach braucht, um alles freizugeben, ein Ausgang würde der Benutzer nicht bemerken.

+0

Zuerst habe ich keine Benutzeroberfläche erwähnt. Die Frage ist allgemein. Zweitens beeinflussen Seitenfehler das gesamte System und nicht nur die Anwendung, die sie verursacht. So wird das wahrgenommene Bild sein, dass die Anwendung vom Bildschirm verschwindet und dann beginnt die Festplatte zu schleifen, während das Betriebssystem unnötige Seitenfehler beseitigt. – Constantin

Verwandte Themen