Во-первых, вы не должны использовать DateTime.Now
для измерения производительности, это слишком неточно для этого.Вы должны использовать StopWatch
вместо этого.В этом случае измерения сильно отличаются.
Во-вторых, когда вы вызываете метод в первый раз, он должен быть скомпилирован JIT, так что вы, вероятно, должны игнорировать результаты первого раунда.
В-третьих, вы должны запустить его в Release more без отладчика (Ctrl + F5, а не F5), если вы этого еще не сделали.
В-четвертых, не забывайте оGC, это может изменить ваши измерения непредсказуемым образом.
Теперь давайте подумаем о том, что вы собираетесь делать: если вы хотите запустить некоторый код в цикле, то просто запустите его в цикле.Простые циклы чрезвычайно эффективны, будет очень трудно получить что-либо с производительностью, близкой к этой.
А как насчет Task
с?Я думаю, что нереально использовать их для таких простых операций.Если вы хотите многократно выполнять простую операцию быстро, вы должны сделать свой код как можно более простым, не включать в себя замыкания, выделения кучи, синхронизацию потоков и, кто знает, что еще, все это необходимо, если вы используете Task
как вы..
В заключение, если у вас есть простая операция, которую вы хотите выполнять много раз, просто используйте простой цикл.Я не вижу причин использовать что-либо еще.С помощью цикла вы знаете, что компьютер будет выполнять ваш код и (почти) больше ничего.
Task
s и ContinueWith()
действительно имеют свое место, особенно если у вас есть более сложные потоки управления (например,имея какую-то задачу, которая что-то делает, затем две разные задачи, которые начинаются после того, как одна завершена, и затем другая задача, которая запускается после того, как они обе завершены).Или, если вы хотите сделать ваше приложение компонуемым.Но если вы попытаетесь использовать их вместо for
цикла, не удивляйтесь, что результаты будут менее звездными.