人間をループに入れておけば、コンパイラーは意味論的に同等の厳密な最適化以上のことを行うことができますか?
意味的に同等ではない可能性があるため、コンパイラによって完全に却下される潜在的な最適化がいくつかあります。
ただし、それらも問題ない可能性があるため、それらを検出して提案してみませんか? 検出には、コンパイル時の分析段階と実行時のプロファイリング段階の 2 段階のプロセスが含まれる場合があります。
エラー、警告、および... 提案はありますか?
コンパイラは、各コンパイル中にプールされるという意味で、「警告」と同様のことを既に行っており、コンパイラが満足するように対処するまでリストに永遠に留まります。同様の方法で機能し、アプリケーションのパフォーマンスを向上させる可能性がある「提案」または「提案された最適化」セクションを用意してみませんか?
コンパイラが複雑さ、推定実行時間、個々のオペランドが true と false の可能性などについてブール式を分析する場合、式オペランドのより良い順序などの提案のリストを作成し、提案を提示できます。プログラマへのリストとして。その後、プログラマーはそれらに個別に対処し、それらを無視することを決定するか、コードエディターに提案を実装させることができます。
ブール式のオペランド順序の最適化
「短絡論理式の最適化」を検討してください。オペランドの順序は、どのオペランドが「短絡」されるか (つまり、呼び出されないか) に影響するため、単純なブール式 (つまり、A && B && C) のオペランドの順序は、(私が思うに) コンパイラによって変更されないものです。オペランドに副作用がある場合に未知の副作用が発生するのを避けるため。
このことを考慮:
char c = reader.ReadChar(); //Stream bs; const string NEWLINE;
while (!IsStringPresent( c, bs, NEWLINE ) && c != ',')
文字の比較は (より高速で複雑でない) ため、式の最初に来る必要があります。これにより、ショートサーキット ロジックは、コンマが検出されたときに IsStringPresent の呼び出しを回避できます。この場合、改行シーケンスよりもコンマ (1 行に複数) が頻繁に出現することも事実です。
char c = reader.ReadChar(); //Stream bs; const string NEWLINE;
if (c != ',' && !IsStringPresent( c, bs, NEWLINE )) //faster for short-circuit; plus ',' is encountered more often than newline
概要
客観的には、「A && B」の式について、「短絡をトリガーするために A が false と B である頻度」と「A と B の計算コスト、より多くの短絡を優先する」に基づいて、最適なオペランド順序を決定できます。高価なもの」。コンパイラが、コンパイル時、実行時、またはその両方で、これらのいずれかのおおよその値を決定できる場合、特定の式が最適ではない可能性があると判断し、プログラマが実装するための提案された変更を作成できます。 .
今日、このようなことを行うコンパイラはありますか? そうでない場合、なぜですか?