2017-02-17 2 views
-2

In C++ verwende ich ReadProcessMemory, um die Werte einiger Zahlen zu erhalten. Jede der Nummern ist im Tandem, und es gibt fünf verschiedene Zahlen. Ist es schneller, fünf einzelne RPM-Aufrufe auszuführen, um jede Zahl einzeln zu lesen, oder ist es schneller, einen einzelnen RPM-Aufruf auszuführen, der eine ganze Struktur liest, die so aufgebaut ist, dass sie diese fünf Zahlen enthält? Zum BeispielWas ist schneller: Mehrere kleine RPMs oder Einzelstruktur RPM

Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 

oder

struct numbers{ 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
    }; 
Mem.Read<numbers>(DWORD64 L1) 

Dank!

+0

Wenn Sie 5 Packungen Milch im Geschäft abholen müssen, wäre es dann schneller, 5 Mal herunterzufahren und jeweils ein Heim zu transportieren oder alle 5 aufzuheben und nur einmal zu reisen? Wenn Sie fragen müssen, sollten Sie zu Beginn nicht 'ReadProcessMemory' aufrufen. – IInspectable

+0

seltsame Frage. natürlich wird in diesem Fall ein einzelner Aufruf von 'ReadProcessMemory' in 5 mal schneller als 5 Aufrufe sein – RbMm

+0

Die Frage wurde schlecht formuliert. Ich wollte sagen, ist es besser, ein sehr großes Lesen einer Struktur oder einzelner RPM-Aufrufe zu machen? Zum Beispiel, was, wenn meine Struktur einige tausend Bits groß war .... – anon6588

Antwort

0

Die Verwendung von ReadProcessMemory zum Lesen von Speicher ist "langsam", so dass eine große Operation schneller ist als viele kleine Lesevorgänge.

Wenn wir die Tatsache ignorieren, dass ReadProcessMemory wahrscheinlich ein Systemaufruf ist, der einen Kontextwechsel in den Kernelmodus durchführen und auf die Seiten eines anderen Prozesses zugreifen muss (der ausgelagert werden könnte usw.), können Sie dennoch Annahmen treffen Geschwindigkeit von einem großen vs viele kleine liest.

Stellen Sie sich vor, Sie lesen von Ihrem eigenen Prozess. Viele Aufrufe von memcpy mit einem kleinen Puffer sind langsamer als eine große Kopieroperation. Das Aufrufen einer Funktion hat einen gewissen Overhead. eine Aufrufanweisung, Einrichten des Stapels, Durchführen der eigentlichen Arbeit und dann Wiederherstellen des Stapels und Zurückgeben. Eine typische memcpy Implementierung ist oft für größere Lesevorgänge optimiert und wird ein wenig mehr Arbeit im Voraus tun, um die Quelladresse so auszurichten, dass sie den Großteil des Speichers in 4 oder 8 Byte Chunks lesen kann (vielleicht sogar größer auf neueren CPUs).

Ich würde normalerweise sagen, dass Sie mit einem Timer messen müssen, wenn Sie nicht sicher über die Leistung sind, aber in diesem Fall ist es ein Kinderspiel, tun Sie einfach den einzelnen lesen.