Measure cpu time
Dennis
dkorpel at gmail.com
Fri May 7 08:52:13 UTC 2021
On Friday, 7 May 2021 at 08:25:43 UTC, Andre Pany wrote:
> Is there some equivalent function in Phobos to get the cpu time
> on linux?
I don't think so, but you can use `core.sys.posix.sys.resource:
rusage`.
If you want to use it on Windows as well, this is a code snippet
I wrote for that:
```D
/// Describes how much cpu time a process has been getting
struct CpuUsage {
/// Time that the process has executed in kernel mode in
microseconds
ulong kernelTimeUs;
/// Time that the process has executed in user mode in
microseconds
ulong userTimeUs;
}
bool getCpuUsage(out CpuUsage r) {
version(Windows) {
void* currentProcess = GetCurrentProcess();
FILETIME creationTime; // time that process was created
FILETIME exitTime; // undefined if process has not exited
FILETIME kernelTime; // ru_stime
FILETIME userTime; // ru_utime
if (GetProcessTimes(currentProcess, &creationTime, &exitTime,
&kernelTime, &userTime) == 0) {
return false; // GetLastError();
}
ulong toMicroseconds(FILETIME ft) {
return (ft.dwLowDateTime | cast(ulong) ft.dwHighDateTime <<
32) / 10;
}
r.kernelTimeUs = toMicroseconds(kernelTime);
r.userTimeUs = toMicroseconds(userTime);
} else version(Posix) {
rusage rusageStruct;
if (getrusage(RUSAGE_SELF, &rusageStruct) == -1) {
return false; //errno
}
auto toMicroseconds(timeval t) {
return cast(ulong) t.tv_sec * 1_000_000 + t.tv_usec;
}
r.kernelTimeUs = toMicroseconds(rusageStruct.ru_stime);
r.userTimeUs = toMicroseconds(rusageStruct.ru_utime);
}
return true;
}
```
On Windows you need to link to "Psapi.lib", e.g. with
`pragma(lib, "Psapi.lib")` or `libs "Psapi.lib"` in dub.sdl.
More information about the Digitalmars-d-learn
mailing list