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を返します
一般的な問題は、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