0

すべてのネットワーク インターフェイスを通過する帯域幅を監視するために、このクラスを作成しています。このすべてがうまく機能しますが、クエリ中の CPU 使用率を減らしたいと思います。その理由は、これを数秒ごとに実行すると、毎回プロセスの CPU 使用率が約 7 ~ 8% 増加するためです。CPUサイクルの量を減らす方法はありますか?

PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");
        String[] instancename = category.GetInstanceNames();

        foreach (string name in instancename)
        {
            String networkCard = name;

            const int numberOfIterations = 10;

            PerformanceCounter bandwidthCounter = new PerformanceCounter("Network Interface", "Current Bandwidth", networkCard);

            float bandwidth = bandwidthCounter.NextValue();

            PerformanceCounter dataSentCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", networkCard);

            PerformanceCounter dataReceivedCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", networkCard);

            float sendSum = 0;
            float receiveSum = 0;

            for (int index = 0; index < numberOfIterations; index++)
            {
                sendSum += dataSentCounter.NextValue();
                receiveSum += dataReceivedCounter.NextValue();
            }
            float dataSent = sendSum;
            float dataReceived = receiveSum;


            double dout = (((8 * (dataSent)) / (bandwidth * numberOfIterations) * 100) * 1024) / 100;
            double din = (((8 * (dataReceived)) / (bandwidth * numberOfIterations) * 100) * 1024) / 100;

            dout = Math.Round(dout, 2);
            din = Math.Round(din, 2);

            string doutround = Convert.ToString(dout);
            string dinround = Convert.ToString(din);



            String output = dinround + "/" + doutround;


                GlobalsWMI.NetIOs.Add(output);



        }
        String tooutput = String.Join("AND", GlobalsWMI.NetIOs);
        GlobalsWMI.NetIOs.Clear();
        return tooutput;
4

2 に答える 2

0

You could reduce CPU usage over the time with a System.Threading.Thread.Sleep(x) at some points - Your check would last longer but with less average CPU usage.

于 2013-06-05T13:18:51.293 に答える
0

わかりました私はさまざまなことを試しましたが、このバージョンははるかに高速だと思います:

private string GetNetworkUsage(System.Net.NetworkInformation.NetworkInterface[] nis)
{

foreach (NetworkInterface ni in nis)
            {
                float bandwidth = ni.Speed;
                const int numberOfIterations = 10;

                float sendSum = 0;
                float receiveSum = 0;

                float lastRec = ni.GetIPv4Statistics().BytesReceived;
                float lastSent = ni.GetIPv4Statistics().BytesSent;

                for (int index = 0; index < numberOfIterations; index++)
                {
                    System.Threading.Thread.Sleep(10);
                    float br = ni.GetIPv4Statistics().BytesReceived;
                    float bs = ni.GetIPv4Statistics().BytesSent;
                    receiveSum += br - lastRec;
                    sendSum += bs - lastSent;

                    lastRec = br;
                    lastSent = bs;

                }

                float dataSent = sendSum;
                float dataReceived = receiveSum;

                double dout = (((8 * (dataSent)) / (bandwidth) * 100) * 1024) / 100;
                double din = (((8 * (dataReceived)) / (bandwidth) * 100) * 1024) / 100;

                dout = Math.Round(dout, 2);
                din = Math.Round(din, 2);

                string doutround = Convert.ToString(dout);
                string dinround = Convert.ToString(din);

                String output = dinround + "/" + doutround;


                GlobalsWMI.NetIOs.Add(output);
            }

            String tooutput = String.Join("AND", GlobalsWMI.NetIOs);
            GlobalsWMI.NetIOs.Clear();
            return tooutput;
}

次のように呼び出します。

    System.Net.NetworkInformation.NetworkInterface[] nis = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

    // this is you for loop add you sleep or however you do it here
    for (int i = 0; i < int.MaxValue; i++)
    {
        Console.WriteLine(test(nis));
    }

私のシステムでこれを試してみたところ、使用する CPU が少なくなり、高速になりましたが、数値が期待どおりであることを再確認します。

于 2013-06-05T14:18:35.693 に答える