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