その性質上、抽象化により、プログラマーとシステムの下位層(コンパイラー、ライブラリー、およびランタイムシステム)の両方への情報の伝達が減少します。抽象化を支持して、これは一般に、下位層がプログラマーが指定されていない動作に関与していないと想定できるようにし、指定された動作を提供する際の柔軟性を高めます。
この「ドントケア」の側面からの潜在的な利点の例は、データレイアウトです。C(低抽象化)では、コンパイラーはデータレイアウトの最適化により制約されます。コンパイラーがホット/コールドまたは偽共有回避の最適化が有益であることを(たとえば、プロファイル情報を通じて)識別できたとしても、通常、そのような適用はできません。(「あたかも」のように指定すること、つまり仕様をより抽象的に扱うことにはある程度の自由がありますが、すべての潜在的な副作用を導出すると、コンパイラーに負担がかかります。)
より抽象的な仕様は、トレードオフと用途の変化に対してもより堅牢です。下位層は、新しいシステム特性や新しい用途に合わせてプログラムを再最適化する際の制約が少なくなります。より具体的な仕様は、プログラマーによって書き直されるか、「あたかも」動作を保証するために、下位層によって追加の努力を払わなければなりません。
抽象化を隠す情報のパフォーマンスを妨げる側面は「表現できない」であり、下位層は通常「知らない」として扱います。つまり、下位層は、最適化に役立つ情報を、一般的な一般的な使用、対象を絞った使用、特定のプロファイル情報などの他の手段と区別する必要があります。
情報非表示の影響は、他の方向にも作用します。プログラマは、すべての詳細を考慮して指定する必要がないため、生産性を高めることができますが、より高いレベルの設計選択の影響に関する情報が少なくなる場合があります。
一方、コードがより具体的である(抽象性が低い)場合、システムの下位層は、指示されたとおりに、実行するように指示されたことをより簡単に実行できます。コードがターゲットを絞った用途向けに適切に記述されている場合、ターゲットを絞った用途にうまく適合します。抽象度の低い言語(またはプログラミングパラダイム)を使用すると、プログラマーは、詳細な設計と、特定の言語では下位層に簡単に伝達されない情報を使用して、実装を最適化できます。
前述のように、追加のプログラマーのスキルと労力が価値のある結果を生み出すことができる場合、抽象度の低い言語(またはプログラミング手法)は魅力的です。より多くのプログラマの努力とスキルが適用されると、結果は通常より良くなります。さらに、パフォーマンスが重要なアプリケーションではあまり使用されない言語システム(開発の努力や信頼性を強調する代わりに、境界チェックとガベージコレクションは、プログラマーの生産性だけでなく、抽象化によってプログラマーのメンタルロードを減らすことで信頼性を向上させることができます)パフォーマンスを改善するためのプレッシャーが少なくなります。
最適化は通常、特定の用途に合わせてコードを調整することで可能になるため、特定性は自分自身を繰り返さないという原則にも反します。これは、信頼性とプログラミング作業に明らかな影響を及ぼします。
言語によって提供される抽象化には、あまり重要でない抽象化を選択する手段がない、望ましくない、または不要な作業が含まれる場合もあります。不必要な作業が下位層によって発見および削除される場合があります(たとえば、境界チェックがループの本体から抽出され、場合によっては完全に削除される場合があります)が、有効な最適化であることを確認するには、次のことにより「スキルと労力」が必要です。コンパイラ。
言語の年齢と人気は、熟練したプログラマの可用性とシステムの下位層の品質(成熟したライブラリとコード例を含む)の両方における注目すべき要素でもあります。
そのような比較におけるもう1つの混乱要因は、事前コンパイルとジャストインタイムコンパイルのやや直交する違いです。ジャストインタイムコンパイルは、プロファイル情報(プログラマーにプロファイルの実行を提供する必要がない)とシステム固有の最適化(事前コンパイルはより広範な互換性を対象とする場合があります)をより簡単に活用できますが、積極的な最適化のオーバーヘッドは次のように説明されます。ランタイムパフォーマンスの一部。JITの結果をキャッシュできるため、一般的に使用されるコードのオーバーヘッドを削減できます。(バイナリ再最適化の代替手段はJITコンパイルのいくつかの利点を提供できますが、従来のバイナリ配布形式はほとんどのソースコード情報をドロップし、システムに特定の実装からの意図を識別しようとする可能性があります。)
(より低い抽象化言語は、プログラマー制御に重点を置いているため、事前コンパイルを使用することを支持しています。リンク時の実装の選択はより優れたプログラマー制御を提供しますが、インストール時コンパイルは許容されます。JITコンパイルは重要な制御を犠牲にします。 )
ベンチマーク方法論の問題もあります。同等の努力/スキルを確立することは事実上不可能ですが、それが達成されたとしても、言語の目標が結果にバイアスをかけることになります。短い最大プログラミング時間が必要な場合、抽象度の低い言語のプログラムは、より抽象度の高い言語での単純な慣用的な式と比較して、完全に書かれていなくても失敗する可能性があります。高い最大プログラミング時間/労力が許されれば、抽象度の低い言語が有利になります。ベストエフォートの結果を示すベンチマークは、抽象度の低い言語を優先する傾向があります。
他のプログラミングパラダイムの利点を得るために、言語であまり慣用的ではない方法でプログラミングすることが可能な場合がありますが、表現力が利用できる場合でも、そうすることのトレードオフは好ましくない場合があります。