почему сумма «функций с большей частью индивидуальной работы» не может превышать 100%? - PullRequest
0 голосов
/ 22 июля 2011

Я использую встроенный профилировщик VS2010. Мое приложение содержит три потока.Один из потоков действительно прост:

while (true)
    if (something) {
        // blah blah, very fast and rarely occuring thing
    }
    Thread.sleep(1000);
}

Visual Studio сообщает, что Thread.sleep занимает 36% времени программы.Вопрос "почему бы не ~ 100% времени?"Почему Main методы занимают 40% времени, я определенно был внутри этого метода во время выполнения приложения от начала и до конца.

enter image description here

Профилировщик делит результат на числотемы?

В другой моей ветке я заметил, что этот метод занимает 34% времени.Что это значит?Означает ли это, что он работает только 34% времени или почти все время?

По моему мнению, если у меня три потока, которые работают параллельно, и если я суммирую время методов, я должен получить 300%(если приложение работает, например, в течение 10 секунд, это означает, что каждый поток выполняется в течение 10 секунд, а если имеется 3 потока - всего 30 секунд)

1 Ответ

1 голос
/ 24 июля 2011

Вопрос в том, что вы измеряете, а как вы это делаете.Из вашего вопроса я не могу повторить ваш опыт на самом деле ...

Thread.Sleep() звонок занимает очень небольшое количество времени само по себе.Его задача - вызвать нативную функцию из WinAPI, которая будет командовать планировщиком (отвечающему за деление процессорного времени между потоками), из которого пользовательский поток, из которого он был вызван, вообще не должен планироваться на следующую секунду.После этого этот поток не получает процессорного времени до тех пор, пока эта секунда не закончится.

Но поток не занимает никакого процессорного времени в этом состоянии.Я не уверен, как профилировщик сообщает об этой ситуации.


Вот код, с которым я экспериментировал:

internal class Program
{
    private static int x = 0;

    private static void A()
    {
        // Just to have something in the profiler here
        Console.WriteLine("A");
    }

    private static void Main(string[] args)
    {
        var t = new Thread(() => { while (x == 0) Thread.MemoryBarrier(); });
        t.Start();

        while (true)
        {
            if (DateTime.Now.Millisecond%3 == 0)
                A();

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