Wie erhalte ich die Größe gemeinsam nutzbarer und gemeinsam genutzter Arbeitssätze für einen Prozess?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Wie erhalte ich die Größe gemeinsam nutzbarer und gemeinsam genutzter Arbeitssätze für einen Prozess?

Post by Guest »

Ich versuche, die Größe der gemeinsam nutzbaren und gemeinsam genutzten Arbeitssätze eines Prozesses zu ermitteln.
Dies ist der Code, den ich verwende:
< pre class="lang-cs Prettyprint-override">

Code: Select all

internal static unsafe WorkingSetInfo? GetWorkingSetInfo(SafeProcessHandle processHandle)
{
Settings.Log.Info("Called method: GetWorkingSetInfo");
uint size = 16;
void* pointer = Alloc(size);
int error;
Settings.Log.Debug("Retrieving info on working set...");
bool result = QueryWorkingSet(processHandle, pointer, size);
while (!result)
{
error = GetLastPInvokeError();
if (error is ERROR_BAD_LENGTH)
{
size *= 2;
pointer = Realloc(pointer, size);
result = QueryWorkingSet(processHandle, pointer, size);
}
else
{
Settings.Log.DebugFormat("Failed to retrieve info on working set: {0} ({1})", GetLastPInvokeErrorMessage(), error);
Free(pointer);
return null;
}
}
PSAPI_WORKING_SET_INFORMATION info = new();
ulong* dataPointer = (ulong*)pointer;
info.NumberOfEntries = new(*dataPointer);
dataPointer += 1;
info.WorkingSetInfo = new nuint[info.NumberOfEntries];
for (var i = 0; i < info.NumberOfEntries.ToUInt32(); i++)
{
info.WorkingSetInfo[i] = new(*dataPointer);
dataPointer += 1;
}
Free(pointer);
uint pageSize = GetMemoryPageSize();
return new(info, pageSize);
}
Dieser Code funktioniert korrekt, ist aber auch ineffizient. Immer wenn es ausgeführt wird, steigt die CPU-Auslastung meines Prozesses auf etwa 30 % (der Durchschnitt liegt bei 10 %, wenn es nicht ausgeführt wird).
Gibt es eine Möglichkeit, es zu optimieren, oder eine Alternative? Wie erhalte ich die Daten (ich verwende die Funktion QueryWorkingSet)?
Ich kann die native API verwenden, wenn es keine Alternative gibt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post