私は主に「いいえ」と言います。
不変性または参照透過性から得られる主な「最適化」の利点は、のようなコードが表示されたときに「共通部分式除去」を実行できることなど...f(x)...f(x)...
です。ただし、このような分析は非常に正確な情報なしでは実行できません。F#は.Netランタイムで実行され、.Netにはメソッドを純粋(効果なし)としてマークする方法がないため、大量の組み込み情報と分析が必要です。これのいずれかを実行しようとさえします。
一方、Haskellのような言語(Haskellのように誰もが聞いたことがある、または使用している言語はほとんどないため、ほとんどの場合「Haskell」を意味します:))は、怠惰で純粋であり、分析はより簡単です(すべてが純粋な、ナッツに行く)。
とは言うものの、そのような「最適化」は、システムの他の有用な側面(パフォーマンスの予測可能性、デバッグなど)とうまく相互作用しないことがよくあります。
「十分に賢いコンパイラがXを実行できる」という話はよくありますが、私の意見では、「十分に賢いコンパイラ」は神話であり、これからもそうなるでしょう。高速コードが必要な場合は、高速コードを記述します。コンパイラはあなたを救うつもりはありません。共通部分式除去が必要な場合は、ローカル変数を作成します(自分で行います)。
これは主に私の意見であり、反対票を投じたり反対したりすることを歓迎します(実際、「最適化が再びセクシーになる可能性がある」という上昇の理由として「マルチコア」が提案されているのを聞いたことがあります。ただし、コンパイラが重要な最適化(ソースコードのアノテーションではサポートされていない)を実行することを期待している場合は、希望が満たされるまで長時間待つ準備をしてください。
誤解しないでください。不変性は優れており、多くの状況で「高速」コードを作成するのに役立つ可能性があります。しかし、コンパイラがそれを最適化するからではなく、コードの記述、デバッグ、修正、並列化、プロファイリングが容易であり、時間を費やす最も重要なボトルネックを決定するためです(おそらくそれらを可変的に書き換えます)。効率的なコードが必要な場合は、開発、テスト、プロファイリングを迅速に行える開発プロセスを使用してください。