4

人間をループに入れておけば、コンパイラーは意味論的に同等の厳密な最適化以上のことを行うことができますか?

意味的に同等でない可能性があるため、コンパイラによって完全に却下される潜在的な最適化がいくつかあります。

ただし、それらも問題ない可能性があるため、それらを検出して提案してみませんか? 検出には、コンパイル時の分析段階と実行時のプロファイリング段階の 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 の計算コスト、より多くの短絡を優先する」に基づいて、最適なオペランド順序を決定できます。高価なもの」。コンパイラが、コンパイル時、実行時、またはその両方で、これらのいずれかのおおよその値を決定できる場合、特定の式が最適ではない可能性があると判断し、プログラマが実装するための提案された変更を作成できます。 .

今日、このようなことを行うコンパイラはありますか? そうでない場合、なぜですか?

4

3 に答える 3

0

私の意見では、プログラマーが大丈夫だと思ったからといって、オプティマイザーが関数呼び出しを短絡できるようにすることは、追跡不可能なバグのレシピです。コンパイルのたびに質問しますか?私は知らないよ; このようなものには多くの問題があるように思えます。

于 2011-12-01T20:23:44.143 に答える
0

私の答えは「おそらく」ですが、「これが本当にやりたいことなのですか?」

おそらく、コンパイラーが同型であることが確実ではない可能性のある同型を検出することを示唆しているため、プログラマーに「これは同型であるか」と尋ねますが、いずれにせよ「そうであれば、それを適用すると、結果は次のようになります。より速いコードだと思いますか?」

ただし、私の考えは次のようなものです。「プログラマーさん、これができればコードはずっと高速になりますが、セマンティクスが異なります! この最適化を行うには、この関数の前提条件を強化する必要があります。 。 それは大丈夫ですか?"

前提条件を強化することは問題ないかもしれません。おそらく、プログラマーは前提条件さえ書いていないでしょう。プログラマーが「もちろん、大丈夫です」と言って、プログラマーが間違っている場合、運が良ければ、「前提条件の失敗」で問題が明らかになります。

于 2011-12-17T10:23:11.503 に答える