2013-09-24 5 views
5

Ich arbeite an einem Multithread-Plugin. Wenn ich eine freie() auf ziemlich großen Speicherblöcken (> 10 MB) mache, verlangsamt sich die Anwendung mit meinem Plugin vorübergehend zu sehr. (Es ist eine Audio-App, der Audio-Thread bekommt zu wenig Zeit). Ich bin mir nicht sicher, ob das free() viel CPU benutzt oder andere Threads viel zu lange blockiert. Es scheint, dass ein Anruf bei madvice() viel Arbeit macht. Ich bin es gewohnt frei zu sein() brauche nicht viel Zeit (; nicht wenn ich im 32 Bit Modus laufe).free() blockiert andere Threads, Systemverlangsamung

einige Infos: OSX 10.8 64 Bit-Plugin & Programm C++

Irgendwelche Vorschläge, wie es weitergeht sind sehr willkommen.

+0

Vielleicht dauert es zu lange, weil es den Speicher für Debugging-Zwecke freigibt. Holen Sie sich eine kostenlose Version, die das nicht tut. –

+0

Können Sie das Programm instrumentieren - auf OS X ist es sehr einfach, Instrumente zu verwenden. Das sagt Ihnen, wo genau Ihr Programm die meiste Zeit verbringt. – parry

+0

Sie sollten die Speicherreservierung oder Freigabe von Echtzeit-Priorität-Audio-Callback-Threads vermeiden. Lesen Sie die Empfehlungen in [Technisches Q & A QA1467: CoreAudio Overload Warnings] (https://developer.apple.com/library/mac/qa/qa1467/_index.html). Die malloc-Implementierung verwendet Sperren für die Thread-Sicherheit. –

Antwort

2

Ein naheliegender Vorschlag wäre natürlich, die free() zu beenden (die übrigens eine Form von delete in C++ sein sollte).

Den Speicher nicht freigeben, solange das Plugin noch geladen und aktiv ist (oder "läuft"), die Ressourcen freigeben, wenn das Plugin nicht mehr benötigt wird.

Wenn Sie einen neuen Puffer nach Freigeben der alten reservieren müssen, finden Sie eine Möglichkeit, den bereits zugewiesenen Speicher stattdessen zu verwenden.

+0

+1 So habe ich das in einem synchronisierten Echtzeit-Video-Player gemacht. –

+0

Ich wünschte, ich könnte das tun, meine Speicheranforderungen sind sehr abhängig von der gewählten Voreinstellung. – jankoen

0

Wenn Sie den Speicher wiederverwenden, vielleicht mit der Platzierung new, dann können Sie den Anruf zu free/delete insgesamt loswerden.

0

Wenn der Puffer die gleiche Größe oder fast die gleiche Größe hat, können Sie davon profitieren, das freie Objekt zu verzögern und stattdessen realloc() zu verwenden. Das kann kniffliger sein.

0

Für große Zuordnungen verwende ich jetzt vm_allocate(), das scheint nicht eine lange madvice() zu nennen.

Da ich vm_allocate() und sein Gegenstück vm_deallocate() verwenden, sind alle Speicher freigebenden Aufrufe wieder schnell.