現在のダウンロードとアップロードの速度を測定することになっている次のコードがあります。私が直面している問題は、ネットワークおよび/またはインターネット接続が処理できない (帯域幅を超えている) 使用状況が記録されることが多いことです。
public static IStatistics GetNetworkStatistics(string interfaceName) {
var networkStats = _interfaces[interfaceName];
var dataSentCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", interfaceName);
var dataReceivedCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", interfaceName);
float sentSum = 0;
float receiveSum = 0;
var sw = new Stopwatch();
sw.Start();
while (sw.ElapsedMilliseconds < 1000) {
sentSum += dataSentCounter.NextValue();
receiveSum += dataReceivedCounter.NextValue();
}
sw.Stop();
Console.WriteLine("Download:\t{0} KBytes/s", receiveSum / 1024);
Console.WriteLine("Upload:\t\t{0} KBytes/s\n", sentSum / 1024);
networkStats.AddSentData(sentSum);
networkStats.AddReceivedData(receiveSum);
return networkStats;
}
出力例:
ご覧のとおり、これらのエントリのほとんどは、かなり頻繁に使用されているネットワークを示しており、最大で約 160MB/s の過剰な量になっています。1 つのレコードだけでは転送速度を測定できないことはわかっています (これはテスト データであり、実際のアプリケーションでは最新の 3 つの平均を使用します)。どこかで間違いを犯したにちがいないと言っても過言ではありませんが、どこにあるのかわかりません。
私が持っていた 1 つの考えは、ループにカウンターを保持してアクセス回数PerformanceCounter.NextValue()
(通常は 46 から 48 の間) を表示する必要があるというものでしたが、最終的にはこれは問題ではないと考えました。わずか 1 秒間の帯域幅使用量に対して、まだ大きすぎる数値を持っています。パフォーマンスカウンターが原因かもしれないという気持ちは拭えません。
補足: 160MB/秒の数値は、新しい YouTube ビデオをロードした瞬間に記録され、他の (+1000 KB/秒) の記録は通常、タブを更新したときに行われるため、ネットワーク使用量の (相対的な) 表示である必要があります。
私のアプローチで何かを見落としていませんか?
編集:
@Sam のアドバイスに従い、ビルトインと比較して結果を確認すると、perfmon.exe
通常、帯域幅使用量のバーストが Perfmon に表示されるバーストと同時に発生することに気付きましたが、私のバーストははるかに大きいです。同時バーストをリンクして共通点を見つけようとしましたが、かなりランダムに見えます (おそらく、Perfmon がいくつかの結果を組み合わせて現在の速度を取得する可能性がありますが、最新の秒しか使用していないためです)。
低い数値についても同様です。Perfmon は通常 10kbps 未満を示しますが、私は常に約 50kbps です。
編集2:
これは、@Hans のコメントを参照して使用したコードです
var initSent = dataSentCounter.NextValue();
var initReceived = dataReceivedCounter.NextValue();
Thread.Sleep(1000);
sentSum = dataSentCounter.NextValue() - initSent;
receiveSum = dataReceivedCounter.NextValue() - initReceived;