2

SIGARを迅速に実行して、多数のハードウェアメトリックサンプルを取得しようとすると、次の動作が見られます。

val sig: Sigar = new Sigar()
val steady_cpu: Double = (for (i <- 1 to 100) yield sig.getCpuPerc().getUser()).sum / 100.0 

ここで、steady_cpuはNaNになります。生成されたリストを見ると、NaNはgetUser()呼び出しから来てNaNを返します

4

1 に答える 1

3

一般的な問題は、SIGAR呼び出しが潜在的にステートフルであり、関数の呼び出しが速すぎてもSIGARが内部状態を再構築する時間がないことです。彼らはCPUサイクルなどを数えていると思いますが、これは通常、おおよその科学であり、関数の呼び出しが速すぎると、内部ライブラリがゼロ除算になってしまいます。修正は、呼び出しの間に短いスリープを追加することです。

val sig: Sigar = new Sigar()
val steady_cpu: Double = (for (i <- 1 to 100) yield {
  Thread.sleep(10); 
  sig.getCpuPerc().getUser()
}).sum / 100.0 
于 2013-02-10T07:50:59.287 に答える