私が理解しているように、オブジェクトを不変のスタイルで記述すると、コンパイラはコードを内部で単一の静的割り当て形式で書き換える傾向があるため、コンパイルされた言語のプログラムのパフォーマンスを向上させることができます。
PythonまたはPHPのようなインタプリタ言語で不変オブジェクトを使用することには、パフォーマンス上の利点がありますか?
不変性による読みやすさやコード品質のメリットがあることを理解していますが、特にパフォーマンスについて質問しています。
CPythonでは、タプル(基本的に不変のリスト)の割り当ては、同じ項目を持つ同等の変更可能な型の割り当てよりもわずかに速くなります。私は不変のセットに関する同様の噂を漠然と覚えていますが、timeit
はそれを確認しませんでした。タプルは、数バイトから50%まで、リストよりも小さくすることもできます(リストのサイズを変更する必要があり、将来の成長を加速するために容量を2倍にした場合)。さらに、タプルとセットは、一部のコンテキストでは、オブジェクトを一度作成して毎回再構築するのではなく、オブジェクトを再利用できるのぞき穴最適化の対象になります。
しかし、それは主にピーナッツです。少なくとも通常は、これらのタイプを使用する理由ではありません。たとえあったとしても、これらの違いは真剣に最適化したときにのみ引き起こされます。これは、どちらかを決定するときに私が通常検討する側面ではありません。特に、意味論上の大きな影響は言うまでもなく、他の利点もあるためです。
不変変数の主な利点は、分散してデータを複数のコンピューターに分散させた瞬間です。ミュータブルデータは、データが更新されると、さまざまなキャッシュ内のすべてのコピーも更新されるようにするための精巧なメカニズムが必要です。精巧であることに加えて、timeもかかります。
不変データは、必要なだけコピーしてキャッシュできます。データが変更されないことが保証されます。
Jythonがマルチスレッドをサポートしているかどうかはわかりませんが、サポートしている場合は、マルチスレッドが多いマルチコアアプリケーションで有利になります。
PythonとPHP=の利点はほとんどありません。ほとんどの場合、変更可能な機能をサポートする必要がないため、不変の構造はより単純で小さいためです。
OTOH、最新のJIT( LuaJIT または任意の最新のJavaScriptなど)は、あらゆる機会を利用して可能性を制限し、より厳密なコードを生成します(コンパイラーの動作と同様ですが、より積極的です)。
Pythonでは、言語自体にはオブジェクトを不変としてマークするものがないため、最適化のためにインタプリタにヒントを与えることはできません。
プロセスがスレッド化され、オブジェクトに「保護された」プロパティがある場合、プログラマーはそのオブジェクトを使用するときに同期について心配する必要がないため、パフォーマンスが向上します。