Как сократить время выполнения при доступе к данным внутри элемента управления (C# /. NET) - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над приложением Windows форм, которое содержит CheckListBox. У меня также есть что-то вроде следующего фрагмента кода в моем приложении (который выполняется каждые 25 миллисекунд событием «отметка таймера» Windows Forms):

public Stopwatch watch = System.Diagnostics.Stopwatch.StartNew(); //global variable

someMethod()
{
    watch.Restart();

    if (checkedListBox1.GetItemChecked(0)) //executes wether the first item of the checkedListBox1 is checked
    {
        if (something1) {
            doSomething1();

            watch.Stop();
            double elapsedSeconds = watch2.Elapsed.TotalSeconds;
        }
        else {
            if (something2) {
                doSomething2();

                watch.Stop();
                double elapsedSeconds = watch2.Elapsed.TotalSeconds;
            }
            else {
                doSomething3();

                watch.Stop();
                double elapsedSeconds = watch2.Elapsed.TotalSeconds;
            }
        }
    }
    else //executes if not checked
    {
        if (something3) {
            doSomething4();

            watch.Stop();
            double elapsedSeconds = watch2.Elapsed.TotalSeconds;
        }
        else {
            doSomething5();

            watch.Stop();
            double elapsedSeconds = watch2.Elapsed.TotalSeconds;

        }
    }
}

При выполнении кода, когда это так требуется около 1-3 миллисекунд для достижения whatch.Stop() внутри скобок, содержащих doSomething4() или doSomething5(). Тем не менее, когда я выполняю что-то вроде этого:


public Stopwatch watch = System.Diagnostics.Stopwatch.StartNew(); //global variable

someMethod()
{
watch.Restart();

/*if(checkedListBox1.GetItemChecked(0))
                {
                    if (something1)
                    {
                        doSomething1();

                        watch.Stop();
                        double elapsedSeconds = watch2.Elapsed.TotalSeconds;
                    }
                    else
                    {
                        if (something2)
                        {
                            doSomething2();

                            watch.Stop();
                            double elapsedSeconds = watch2.Elapsed.TotalSeconds;
                        }
                        else
                        {    
                            doSomething3();

                            watch.Stop();
                            double elapsedSeconds = watch2.Elapsed.TotalSeconds;
                        }
                    }
                } */ //when everything above and the first "if-else" pair are commented
//                else
//                {
                    if (something3)
                    {
                        doSomething4();

                        watch.Stop();
                        double elapsedSeconds = watch2.Elapsed.TotalSeconds;
                    }
                    else
                    {
                        doSomething5();

                        watch.Stop();
                        double elapsedSeconds = watch2.Elapsed.TotalSeconds;

                    }
//                }
}

... то есть, без учета самого внешнего, если и еще, это занимает примерно от 0,2 до 0,4 миллисекунды! (Важное примечание: элемент внутри checkedListBox всегда не отмечен, и я вставляю точку останова, чтобы проверить прошедшие секунды в «случайное время» во время выполнения кода - вместо того, чтобы начинать выполнение с уже вставленной точкой останова. Я отладил оба кода уже много раз ...).

Я знаю, что есть много кода до достижения doSomething4() или doSomething5() в незакомментированном коде, но факт в том, что, логически, НИЧЕГО выполняется внутри if(checkedListBox1.GetItemChecked(0)) (поскольку флажок всегда снят).

Почему «простая» проверка if () может «испортить» выполнение времени и повысить его почти в 10 раз по сравнению с первоначальным значением ? (Я знаю, что так не должно быть, потому что внутри doSomething4() и doSomething5() есть множество операторов if и else, и они сами по себе не увеличивают количество таймеров так сильно ...)

РЕДАКТИРОВАТЬ (май / 03/2020):

Итак, я обнаружил, что, по-видимому (как вы можете видеть в комментариях ниже), то, что вызывает это повышение времени выполнения, является моим заявлением получая доступ к его элементу CheckListBox и возвращая мне текущее логическое значение.

Это мое приложение должно выполняться максимально быстро ... будет ли способ сократить это истекшее время при сохранении значения checkedListBox1().GetItemChecked() ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...