ist es in C++ möglich, die aktuelle RAM- und CPU-Auslastung zu erhalten? Gibt es einen plattformunabhängigen Funktionsaufruf?Wie erhält man die aktuelle CPU- und RAM-Auslastung in C++?
Antwort
Es ist ein Open-Source-Bibliothek, die diese (und weitere Systeminformationen Sachen) über viele Plattformen gibt: SIGAR API
Ich habe es in ziemlich großen Projekten eingesetzt und es funktioniert gut (mit Ausnahme bestimmte corner cases unter OS X etc.)
Nein, gibt es nicht, nicht im Standard.
Wenn Sie diese Informationen wirklich benötigen, müssen Sie plattformspezifische #ifdefs oder eine Verknüpfung mit einer Bibliothek erstellen, die diese Informationen bereitstellt.
Leider hängen diese Dinge stark von dem zugrunde liegenden Betriebssystem ab, so dass es keine plattformunabhängigen Aufrufe gibt. (Vielleicht gibt es einige Wrapper Frameworks, aber ich kenne keine.)
Unter Linux können Sie einen Blick auf die getrusage() Funktionsaufruf, unter Windows können Sie GetProcessMemoryInfo() für RAM-Nutzung verwenden. Sehen Sie sich auch die anderen Funktionen in der Process Status API von Windows an.
Es gibt keine plattformunabhängige Funktion für die ich weiß. Wenn Sie beabsichtigen, mehrere Windows-Versionen zu targeten, sollten Sie beachten, dass die Implementierung in einigen Versionen unterschiedlich ist. Ich habe dieses Problem beim Testen einer App unter NT 3.51 zum Beispiel ... (archaisch, ich weiß).
Hier ist ein Code, den ich für die Speicherseite der Dinge verwendet habe. Dies funktioniert nicht über andere Plattformen als Windows und gibt nur 0 zurück, wenn es ohne die WIN32-Definition kompiliert wird:
EDIT: Ich habe vergessen zu erwähnen, dieser Code teilt und rundet auf den nächsten MB ab, daher der >> 20 überall.
// get memory info...
int getTotalRAM()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullTotalPhys>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwTotalPhys>>20);
}
#endif
return ret;
}
int getAvailRAM()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullAvailPhys>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwAvailPhys>>20);
}
#endif
return ret;
}
int getTotalMemory()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20);
}
#endif
return ret;
}
int getAvailMemory()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20);
}
#endif
return ret;
}
Nicht direkt.
Sie können jedoch eine Bibliothek verwenden, die das Betriebssystem abstrahiert (z. B. ACE).
Obwohl dies ein bisschen schwer, wenn Sie nur CPU und Arbeitsspeicher wollen.
Es gibt keinen plattformunabhängigen Weg, dies zu tun. Für Windows können Sie die Werte für CPU-Auslastung und Leistung ermitteln, indem Sie PDH.dll (Performance Data Helper) und die zugehörigen APIs in Ihrem Code verwenden.
Unter Linux wird dies/proc/self/status verwenden. Es ist mehr Arbeit erforderlich, um dies zu einer Nummer zu machen. Ich finde das nützlich, wie es ist, nur um die Speichernutzung direkt auf dem Bildschirm als String zu drucken.
static string memory_usage() {
ostringstream mem;
PP("hi");
ifstream proc("/proc/self/status");
string s;
while(getline(proc, s), !proc.fail()) {
if(s.substr(0, 6) == "VmSize") {
mem << s;
return mem.str();
}
}
return mem.str();
}
Wenn dies immer noch der Fall überprüfen Sie bitte:
http://sourceforge.net/projects/cpp-cpu-monitor/
Es gibt Ihnen ein Beispiel, wie die CPU und RAM-Auslastung eines Linux (getestet auf Debian und CentOS) zu erhalten und ein ganz einfache Anleitung zur Installation.
Bitte zögern Sie nicht zu fragen, wenn Sie Fragen zu diesem kleinen Projekt haben.
- 1. Wie erhält man die aktuelle CPU-Auslastung und den verfügbaren Speicher in der Batch-Datei?
- 2. Aktuelle CPU-, RAM- und Festplattenlaufwerke in C#
- 3. Wie erhält man CPU-Auslastung?
- 4. Wie erhält man die aktuelle Datei- und Zeilennummer in Ruby?
- 5. Wie erhält man die aktuelle Zellensignalstärke?
- 6. Ziel C - Wie erhält man die aktuelle Bildschirmauflösung?
- 7. Wie erhält man CPU-Temperatur und Lüftergeschwindigkeit auf OS X?
- 8. erhalten aktuelle CPU-Auslastung in C#
- 9. Wie erhält man die aktuelle Ansichtsposition eines Canvas?
- 10. Wie erhält man das aktuelle URL-Routenmuster in Schienen?
- 11. Wie erhält man fortlaufende Zeichen in C#?
- 12. Holen Sie sich aktuelle Prozess der CPU-Auslastung in C
- 13. Wie erhält man sichtbare Eigenschaften in C#
- 14. Wie erhält man die aktuelle Größe einer Unteransicht, wenn sich die Gerätegröße in swift ändert?
- 15. CPU-Auslastung und CPU-Geschwindigkeit
- 16. Wie erhält man die Geolokalisierung des Benutzers?
- 17. Samsung SmartTV erhält aktuelle Uhrzeit
- 18. Wie erhält man die Cache-Zeilengröße auf kommerziellen UNIX-Betriebssystemen aus einem C/C++ - Programm?
- 19. Wie erhält man die aktuelle Ausrichtung des iPhone Views oder die letzte Ausrichtung des Geräts?
- 20. Wie erhält man den Quelldateinamen und die Zeilennummer eines Typmembers?
- 21. Wie erhält man die Länge des C-Pointer-Arrays?
- 22. Wie erhält 'printk' die aktuelle Uhrzeit mit hoher Auflösung?
- 23. Wie erhält man die vorherige URL in JSF mit FacesContext?
- 24. Wie erhält man die aktuelle Zeilennummer in einer SQL Server 2000-Abfrage?
- 25. Wie erhält man die Signalstärke von Zellenservices in Android?
- 26. Zeige Speicher und CPU in C
- 27. Wie erhält man die Zeichenposition in Python 3.4?
- 28. Wie bekomme ich die aktuelle Systemzeit in C++
- 29. Wie erhält man Klassen- und Laufzeitinformationen?
- 30. Wie ermittelt man die aktuelle Eingabesprache?
Warum ist das traurig? Die schiere Vielfalt an CPU/RAM/NUMA/(hier ein oder mehrere Akronyme einfügen) macht einen plattformunabhängigen Berichtmechanismus etwas eingeschränkt. – MSN
Die meisten Felder werden nicht durch getrusage festgelegt, da die RAM-Nutzung derzeit nicht entsprechend Ihrer Verknüpfung festgelegt ist –