我正在努力将CPU监控添加到我的Xamarin窗体应用程序的Android部分。我遵循此页上的说明,目前编写了以下代码:
var self = new Java.IO.RandomAccessFile("/proc/self/stat", "r");
string[] info = self.ReadLine().Split(" ");
int clockSpeedHz = Android.Systems.OsConstants.ScClkTck;
int numCores = Android.Systems.OsConstants.ScNprocessorsConf;
double uptimeSec = SystemClock.ElapsedRealtime() / 1000.0;
long startTime = long.Parse(info[21]);
double cpuTimeSeconds = (long.Parse(info[13]) + long.Parse(info[14]) + long.Parse(info[15]) + long.Parse(info[16])) / (double)clockSpeedHz;
double processTimeSeconds = uptimeSec - (startTime / clockSpeedHz);
double avgUsagePercent = (100 * cpuTimeSeconds / processTimeSeconds) / numCores;
return avgUsagePercent;运行此操作后,avgUsagePercent值就没有意义了(例如。平均CPU使用率为(-2*10^-8)%。从数字上看,问题似乎在于对Android.Systems.OsConstants的调用。根据这些值,我的CPU有96个核心,时钟速度为6赫兹。将这些数字设置为我的设备的期望值(8核,100 Hz)提供了更真实的值(2-10%的CPU使用率)。但是,我不能依赖这些数字,因为这个应用程序将被加载到可能没有这些值的不同设备上。
有谁知道获得Android.Systems.OsConstants值的正确方法是什么吗?看看这个名称空间中的其他常量,这些似乎只是列表中的索引,因为它们都是唯一的,并且大致遵循数字顺序。我想知道这个名称空间的.NET实现是否需要一些函数来将索引转换为值,而我只是不知道。否则,如果有不同的实现来访问这些值,我也愿意使用这些方法。
发布于 2022-07-10 01:07:52
这些常量在sysconf中用于返回设备硬件的实际值(如果需要查看sysconf特性,请参见Linux手册页):
不正确:
int numCores = Android.Systems.OsConstants.ScNprocessorsConf;正确:
long numCores = Android.Systems.Os.Sysconf(Android.Systems.OsConstants.ScNprocessorsConf)https://stackoverflow.com/questions/72916846
复制相似问题