Как исправить медленное время загрузки при вызове wmi (только процессор) - PullRequest
0 голосов
/ 20 июня 2019

У меня проблема с приложением C #.

Я использую WMI для получения информации о моем процессоре, графическом процессоре и оперативной памяти.
Все работает хорошо и быстро, кроме процессора (Win32_Processor).
У меня есть меню и разные панели для каждого (CPU, RAM, GPU).
Сначала я пытался загрузить всю информацию с запуском приложения, он не работал совсем, потребовалось так много времени для загрузки.
Во-вторых, я попытался загрузить их, когда панель была видна (после нажатия кнопки), и это хорошо работало на панелях ram и gpu.
Я использовал один и тот же код для всех них. Вот оно:
Я пытаюсь сделать так, чтобы информация процессора загружалась настолько быстро, насколько это возможно, но из-за поиска и пробования моих собственных вещей я не могу этого добиться.
Я понимаю, что для того, чтобы собрать всю информацию, требуется некоторое время, просто странно, что для этого нужно столько времени!
PS: время загрузки, когда вы нажимаете кнопку для панели процессора, составляет 3,5 секунды, а когда вы нажимаете кнопку «спецификации», просто чтобы показать maxfreq, количество ядер, ширину данных, количество потоков, текущее напряжение, а также l2, l3 занимает 8 секунд.

private void getinfo(string hwclass, string syntax, string name)
{
    ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + hwclass);
    foreach (ManagementObject mo in mos.Get())
    {
        string valuebro = Convert.ToString(mo[syntax]);
        if (name == "CPUNAME")
        {
            CPUNAME.Text = valuebro;
        }
        else if (name == "CPUMAXFREQ")
        {
            //CPUMAXFREQ.Text = "Clocked at " + valuebro + "Mhz";
            maxfreqbro = Convert.ToInt32(valuebro);
        }
        else if (name == "CPUCURFREQ")
        {
            curfreqbro = Convert.ToInt32(valuebro);
            CPUMAXFREQ.Text = "Frequency: " + valuebro + "Mhz";
        }
        else if (name == "ThreadC")
        {
            THREADC.Text ="Threads: " + valuebro;
        }
        else if (name == "DataW")
        {
            DataW.Text = "Data Width: " +valuebro + " bit";
        }
        else if (name == "L2Size")
        {
            l2size = Convert.ToInt32(valuebro) / 1000;
            L2Size.Text = "L2 Size:  " + l2size.ToString() + " MB";
        }
        else if (name == "L3Size")
        {
            l3size = Convert.ToInt32(valuebro) / 1000;
            L3Size.Text ="L3 Size:  "+ l3size.ToString() + " MB";
        }
        else if (name == "NOC")
        {
            NoOfCores.Text = "Cores: " + valuebro;
        }
        else if (name == "VOLT")
        {
            voltage = Convert.ToDecimal(valuebro) / 10;
            output = voltage.ToString();
            CurrentVolt.Text = "Core Voltage: " + output + " V";
        }
        else if (name == "CPUSTATUS")
        {
            CPUSTATUS.Text = "Status: " + valuebro;
        }
        else if (name == "AVAIL")
        {
            Avail.Text = "Code: " + valuebro;
        }
    }
}

(ОЗУ)

private void raminfo(string hwclass, string syntax, string name)
{
    ManagementObjectSearcher ram = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + hwclass);
    foreach (ManagementObject rm in ram.Get())
    {
        string valueram = Convert.ToString(rm[syntax]);
        if (name == "OED")
        {
            OEDRAM.Text = "" + valueram;
        }
        else if (name == "ERRINFO")
        {
            ErrInfoRam.Text = "Error code: " + valueram;
        }
        else if (name == "ERRDESC")
        {
            ErrDescRAM.Text = "" + valueram;
        }
        else if (name == "CCVOLT")
        {
            volts = Convert.ToDecimal(valueram) / 1000;
            finaloutput = volts.ToString();
            voltageram.Text = "Voltage: " +finaloutput + " V";
        }
        else if (name == "CCSPEED")
        {
            Currentspeed.Text = "Current Frequency: " + valueram + " Mhz";
        }
        else if (name == "SPEED")
        {
            speedram.Text = "Max Frequency: " + valueram + " Mhz";
        }
        else if (name == "CAPA")
        {
            Int64 capa = Convert.ToInt64(valueram) / 1024;
            Int64 final = capa / 1024;
            capacityram.Text = "Total memory: " + final + " MB";
        }
    }
}

(GPU)

private void gpuinfo(string hwclass, string syntax, string name)
{
    ManagementObjectSearcher gpu = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + hwclass);
    foreach (ManagementObject gp in gpu.Get())
    {
        string valuegpu = Convert.ToString(gp[syntax]);
        if (name == "GPUNAME")
        {
            NameGPU.Text = valuegpu;
        }
        else if (name == "Availability")
        {
            AvailGPU.Text = "Status code: " + valuegpu;
        }
        else if (name == "CONFMEC")
        {
            CMEC.Text = "Error code: " + valuegpu;
        }
        else if (name == "DVer")
        {
            DriverVers.Text = "Driver Version: " + valuegpu;
        }
        else if (name == "ERDESC")
        {
            ErrDescr.Text = valuegpu;
        }
        else if (name == "ERRCLR")
        {
            ErrorClear.Text = valuegpu;
        }
        else if (name == "STAT")
        {
            StatusGPU.Text = "Status: " + valuegpu;
        }
    }
}

1 Ответ

0 голосов
/ 20 июня 2019

Простое изменение, отфильтровывающее запрос WMI к запрашиваемому полю, ускорило мои запросы более чем в 100 раз:

ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", $"SELECT {syntax} FROM " + hwclass);

Тем не менее, оно по-прежнему выполняет несколько запросов без причины.Можно написать более эффективную версию, которая запрашивает все необходимые поля за один раз, и в 3 раза быстрее.Эта версия включает в себя другие предлагаемые улучшения:

private void cpuinfos(List<string> dataElements) {
    ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", $"SELECT {String.Join(",", dataElements)} FROM Win32_Processor");
    foreach (ManagementObject cpuInfo in mos.Get()) {
        foreach (var anElementName in dataElements) {
            string valuebro = Convert.ToString(cpuInfo[anElementName]);
            switch (anElementName) {
                case "Name":
                    CPUNAME.Text = valuebro;
                    break;
                case "MaxClockSpeed":
                    //CPUMAXFREQ.Text = "Clocked at " + valuebro + "Mhz";
                    maxfreqbro = Convert.ToInt32(valuebro);
                    break;
                case "CurrentClockSpeed":
                    curfreqbro = Convert.ToInt32(valuebro);
                    CPUMAXFREQ.Text = "Frequency: " + valuebro + "Mhz";
                    break;
                case "ThreadCount":
                    THREADC.Text = "Threads: " + valuebro;
                    break;
                case "DataWidth":
                    DataW.Text = "Data Width: " + valuebro + " bit";
                    break;
                case "L2CacheSize":
                    l2size = Convert.ToInt32(valuebro) / 1000;
                    L2Size.Text = "L2 Size:  " + l2size.ToString() + " MB";
                    break;
                case "L3CacheSize":
                    l3size = Convert.ToInt32(valuebro) / 1000;
                    L3Size.Text = "L3 Size:  " + l3size.ToString() + " MB";
                    break;
                case "NumberOfCores":
                    NoOfCores.Text = "Cores: " + valuebro;
                    break;
                case "CurrentVoltage":
                    voltage = Convert.ToDecimal(valuebro) / 10.0m;
                    output = voltage.ToString();
                    CurrentVolt.Text = "Core Voltage: " + output + " V";
                    break;
                case "Status":
                    CPUSTATUS.Text = "Status: " + valuebro;
                    break;
                case "Availability":
                    Avail.Text = "Code: " + valuebro;
                    break;
            }
        }
    }
}

Вы используете его, передавая значения, которые хотите собрать:

cpuinfos(new List<string>() { "Name", "MaxClockSpeed", "ThreadCount" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...