Я бы сказал, в основном, «нет».
Основными «оптимизационными» преимуществами, которые вы получаете от неизменяемости или ссылочной прозрачности, являются такие вещи, как возможность «общего устранения подвыражений», когда вы видите код типа ...f(x)...f(x)...
. Но такой анализ трудно обойтись без очень точной информации, и, поскольку F # работает во время выполнения .Net, а .Net не имеет возможности помечать методы как чистые (безэффектные), требуется тонна встроенной информации и анализа для даже попробуйте сделать что-нибудь из этого.
С другой стороны, в языке, подобном Haskell (который в основном означает «Haskell», поскольку есть несколько языков, таких как Haskell, о которых кто-либо слышал или использует :)), который ленив и чист, анализ проще. (все чисто, сходи с ума).
При этом такие «оптимизации» часто могут плохо взаимодействовать с другими полезными аспектами системы (предсказуемость производительности, отладка, ...).
Часто бывают истории о том, что «достаточно умный компилятор может сделать X», но я считаю, что «достаточно умный компилятор» является и всегда будет мифом. Если вы хотите быстрый код, то пишите быстрый код; компилятор не собирается вас спасать. Если вы хотите исключить общее подвыражение, создайте локальную переменную (сделайте это самостоятельно).
Это в основном мое мнение, и вы можете понизить или не согласиться (на самом деле, я слышал, что «многоядерность» выдвигается в качестве растущей причины, по которой «оптимизация может снова стать сексуальной»), что на первый взгляд кажется правдоподобным. ). Но если вы когда-нибудь надеетесь, что какой-либо компилятор выполнит какую-либо нетривиальную оптимизацию (которая не поддерживается аннотациями в исходном коде), будьте готовы долго ждать, пока ваши надежды не будут выполнены.
Не поймите меня неправильно - неизменность хороша и, вероятно, поможет вам написать «быстрый» код во многих ситуациях. Но не потому, что компилятор оптимизирует его, а потому, что код легко написать, отладить, исправить, распараллелить, профилировать и решить, какие из них являются наиболее важными узкими местами, на которые нужно тратить время (возможно, переписывая их изменчиво). Если вам нужен эффективный код, используйте процесс разработки, который позволит вам быстро разрабатывать, тестировать и профилировать.