Я бы не стал читать слишком много - это не очень хороший код для профилирования по следующим причинам
1. DateTime не предназначен для профилирования. Вы должны использовать QueryPerformanceCounter или StopWatch, которые используют счетчики аппаратного профиля процессора
2. Console.WriteLine - это метод устройства, поэтому могут быть тонкие эффекты, такие как буферизация, для учета
3. Выполнение одной итерации каждого блока кода никогда не даст вам точных результатов, потому что ваш ЦП выполняет много лишних оптимизаций на лету, таких как выполнение вне порядка и планирование команд
4. Скорее всего, код, который получает JITed для обоих кодовых блоков, довольно похож, поэтому, скорее всего, он будет в кеше команд для второго кодового блока
Чтобы получить лучшее представление о сроках, я сделал следующее
- Заменил Console.WriteLine математическим выражением (e ^ num)
- Я использовал QueryPerformanceCounter / QueryPerformanceTimer через P / Invoke
- Я запускал каждый кодовый блок 1 миллион раз, затем усреднял результаты
Когда я это сделал, я получил следующие результаты:
Цикл for занял 0,000676 миллисекунд
Цикл foreach занял 0,000653 миллисекунды
Итак, foreach был немного быстрее, но ненамного
Затем я провел еще несколько экспериментов и сначала запустил блок foreach, а затем блок for
.
Когда я это сделал, я получил следующие результаты:
Цикл foreach занял 0,000702 миллисекунды
Цикл for занял 0,000691 миллисекунд
Наконец я дважды запустил оба цикла, т. Е. Для + foreach, затем для + foreach снова
Когда я это сделал, я получил следующие результаты:
Цикл foreach занял 0,00140 миллисекунд
Цикл for занял 0,001385 миллисекунд
Так что в основном мне кажется, что какой бы код вы ни выполняли вторым, он работает немного быстрее
достаточно, чтобы иметь какое-либо значение.
--Edit -
Вот пара полезных ссылок
Как синхронизировать код с помощью QueryPerformanceCounter
Кеш инструкций
Вне исполнения заказа