Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen? (https://www.delphipraxis.net/200494-tmonitor-klassenmethoden-benutzen-oder-neue-instanz-erstellen.html)

uups 25. Apr 2019 19:48

TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?
 
Hallo!

Immer wieder lese ich von spürbaren Performance-Steigerungen durch den Einsatz von TMonitor anstelle von TCriticalSection. Es werden sogar per default die TMonitor-Klassenmetoden aufgerufen, wenn man die TCriticalSection in den plattformübergreifenden Anwendungen einsetzt. Dabei verstehe ich nicht ganz, wie der Schutzmechanismus von TMonitor funktioniert. Ich meine, im Fall der TCriticalSection erstelle ich für jeden zu schützenden Bereich eine eigene Instanz davon und betrete diese bei jedem Zugriff auf den "Schützling". Bei TMonitor werden immer nur die Klassenmethoden wie Enter und Exit aufgerufen (zumindest habe ich kein einziges Beispiel gefunden, wo es nicht der Fall wäre). Was passiert wenn ich mehrere zu schützende Variablen habe? Wie ekennt TMonitor, was zu schützen ist?

Auch erwarten die Enter() und Exit() von TMonitor einen TObject als Parameter. In allen Beispielen wird hier eine einfache, nur für diesen Zweck erstellte Instanz von TObject übergeben. Das verstehe ich auch nicht ganz.

Daniel 25. Apr 2019 19:55

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?
 
Genau diese Objekt-Instanz ist es, die den Schutzmechanismus ausmacht.
Am Ende liegt jedes Objekt an seiner eindeutigen Speicheradresse. Und diese ist quasi der Schlüssel, anhand dessen die Klassenmethoden das Enter und Exit steuern. Daher ist es auch egal, ob Du ein TObject oder einen TButton als Nutzobjekt nutzt. Meist nimmt man da kleinste verfügbare - in Delphi eben das TObject.

uups 25. Apr 2019 20:33

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?
 
@Daniel
Danke für die schnelle Reaktion!
Tur mir leid wenn meine Frage für einen Experten wie Dich jetzt etwas blöd klingt, aber wie trägt ein leeres, gerade erstelltes TObject zum Schutz einer Variable bei, die ihre eindeutige Speicheradresse ganz woanders hat? Z.B. hier ist ein Ausschnitt aus System.SyncObjs, diese Methoden werden aufgerufen, wenn man aus einer plattformübergreifenden Anwendung auf eine Instanz von TCriticalSection zufreift:

Delphi-Quellcode:
{ TCriticalSection.TCritSec }

procedure TCriticalSection.TCritSec.Initialize;
begin
  FSync := TObject.Create;
end;

procedure TCriticalSection.TCritSec.Free;
begin
  FSync.Free;
end;

procedure TCriticalSection.TCritSec.Enter;
begin
  TMonitor.Enter(FSync);
end;

procedure TCriticalSection.TCritSec.Leave;
begin
  TMonitor.Exit(FSync);
end;

function TCriticalSection.TCritSec.TryEnter: Boolean;
begin
  Result := TMonitor.TryEnter(FSync);
end;

edit: Die Frage oben war wirklich blöd. Ich glaube, ich habe es kapiert. Anstelle von TCriticalSection erstellt mann einen globales TObject, das zu schützenden Bereich markiert. Habe ich richtig verstanden?

Rollo62 26. Apr 2019 08:50

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?
 
Ja, ich verstehe die großen Unterschiede auch nicht so ganz.
CS ruft ja intern Montitor auf, wie Du unten zeigst.

Ich lege mir in manchen Klassen eine CS an, die dann wärend der ganzen LiveTimes der Klasse bestehen bleit.

Das ist womöglich ein kleines bischen mehr Overhead, aber woher die großen Performance-Unterschiede kommen sollen ist mir auch nicht klar.
Evtl. wenn man CS nur lokal benutzt, und immer wieder erzeugt und destroyed ?
Das wäre dann aber genauso schlecht bei dem Monitor.

Schokohase 26. Apr 2019 09:09

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?
 
Delphi-Quellcode:
  TCriticalSection = class(TSynchroObject)
{$IFDEF POSIX}
  private type
    TCritSec = record

Rollo62 26. Apr 2019 09:30

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?
 
Ja OK, ich mache wohl mittlerweile zuviel auf anderen Plattformen als Windows :stupid:

Trotzdem könnte man doch auch hier einfach das gleiche Prinzip unter Windows verwenden,
oder was spricht dagegen ?

Wenn TMonitor soviel schneller ist, warum dann "TRTLCriticalSection = _RTL_CRITICAL_SECTION;" benutzen ?
Hat wohl historische Gründe.

Ich brauche in meinen Anwendungen selten das letzte Quentchen Performance, zum Glück.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf