Как я могу приблизительно измерить время, затрачиваемое на переключение контекста процесса?

Есть ли возможность измерить приблизительное время переключения контекста процесса в С#? Если да, то как?

Я задал этот вопрос на основе книги Cracking the Coding Interview: 150 Вопросы и решения по программированию.

Их решение:

Предположим, что есть только 2 процесса, P1 и P2. (Это огромное приближение, я считаю, что есть более точные)

P1 выполняется, а P2 ожидает выполнения. В какой-то момент ОС должна поменять местами P1 и P2 — допустим, это происходит на N-й инструкции P1. Таким образом, время переключения контекста для этого будет:

Time_Stamp(P2_1) - TimeStamp(P2_N)

Одна из проблем заключается в том, что мы не можем записать временную метку каждой инструкции в процессе. И мы не учитываем время, затрачиваемое на переключение контекста между другими процессами.


person Tito    schedule 05.12.2012    source источник
comment
Вы можете с уверенностью предположить, что вас не возьмут на работу, если вы предложите это решение.   -  person Hans Passant    schedule 06.12.2012
comment
@HansPassant Я думаю, что вы правы, и я считаю, что этот вопрос также не является хорошим вопросом для интервью, он довольно сложный, вам нужно предполагать многие вещи, которые довольно далеки от реальности.   -  person Tito    schedule 06.12.2012


Ответы (2)


Вы можете использовать WMI (инструментарий управления Windows)

Пример:

ManagementScope managementScope = new ManagementScope("\\\\.\\ROOT\\cimv2");
ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Thread");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, objectQuery);
ManagementObjectCollection objectCollection = searcher.Get();

foreach (ManagementObject m in objectCollection)
{
    Console.WriteLine("ContextSwitchesPersec : {0}", m["ContextSwitchesPersec"]);
}
person sa_ddam213    schedule 05.12.2012

Переключение контекста процесса выполняется операционной системой и не имеет ничего общего с .NET или C#.

Вы можете отслеживать количество переключений контекста в секунду с помощью монитора производительности Windows, но сам процесс не знает ни о каких переключениях контекста.

Вы также можете использовать Process Explorer, чтобы отслеживать переключения контекста и дельту для отдельных процессы, они не отображаются по умолчанию, но могут быть добавлены на вкладке «Просмотр», «Выбор столбцов», «Производительность».

person Mataniko    schedule 05.12.2012
comment
Возможно, я неправильно понял вопрос как измерение времени, затрачиваемого на программу на С#. - person Mataniko; 05.12.2012