Можно ли спать определенное количество циклов?
Мне было интересно, если бы была возможность дать потоку спать в течение определенного количества циклов ЦП?
Я думал о том, чтобы просто вставить "nop", но я не уверен, что они будут оптимизированы, и я надеялся на решение высокого уровня.
Есть что-нибудь хорошее, что вы могли бы мне порекомендовать? Если не могу я предотвратить, что вручную вставленный nop оптимизируется без отключения всех оптимизаций? С уважением
Лукас Хефлигер
РЕДАКТИРОВАТЬ: как еще один вопрос: можно ли измерить количество циклов, необходимых во время выполнения для определенного фрагмента кода?
1 ответ
Короче говоря, нет, потому что между циклами и инструкциями нет отображения 1:1 (действительно, многие инструкции выполняются за цикл), и когда у вас есть такие вещи, как конвейеризация инструкций, прогнозирование ветвлений и умозрительное выполнение, это ясно становится непредсказуемым.
Другая причина заключается в том, что нет прерывания, основанного на циклах (или инструкциях) ЦП, вместо этого потоки спят на основе аппаратного прерывания таймера или планировщика операционной системы, опрашивающего текущую очередь потоков с учетом текущего времени.
Наконец, даже если бы это было возможно на аппаратном уровне, Windows API (который используется внутри.NET) не предоставляет никаких других спящих параметров, кроме промежутка времени в миллисекундах (а миллисекунда в любом случае потенциально составляет десятки тысяч циклов ЦП).
В C# вопрос довольно бессмысленный, потому что код будет JIT-скомпилирован на основе текущей платформы, что означает, что вы не можете предсказать аппаратные инструкции, используемые для данного блока кода, и даже тогда существует вероятность того, что ваш CIL может быть выполненным интерпретатором вместо JIT'd, чтобы уменьшить задержку запуска, и это сбрасывает счетчик инструкций ЦП.