コードが「手動で最適化される」とはどういう意味ですか?これは本当にヌービーの質問かもしれませんし、これが質問するのに適切なフォーラムであるかどうかはわかりませんが、そうでない場合は私に耐えて正しい方向にナッジしてください。この用語が放り出されるのをいつも聞いたことがありますが、それが何を意味しているのかまだよくわかりません。コードが手動で最適化されるとはどういう意味ですか?オンラインで検索しましたが、stackexchangeなどの正式な定義を見つけることができませんでした。一部のコンテキストでは、たとえばプログラム最適化に関するウィキペディアの記事からの抜粋をご覧ください。language.コンテキストに沿って説明すると、「アルゴリズムを最適化するために手動でマシンコードを編集する」か、それらの行に沿った何かを意味すると推測しました。++やJavaなどの非アセンブリ言語のコンテキストでこの用語が使用されていることを聞いたので、私はまだかなり混乱しています。++、Javaなどの高レベル言語を取り、アセンブリ言語にリストされているものに似たものにコンパイルします。舞台裏で、通常、あなたのためにアセンブラーを呼び出します。表示されるのは、高レベルで、出力としてオブジェクトまたは最終バイナリのいずれかです。-save-tempsを指定してgccを実行し、gccがオブジェクトまたはバイナリへの途中で生成するさまざまなプログラム間で実行されるいくつかの目に見える手順を確認します。コンパイラは、人間によって書かれており、疲れることはなく、一般的には優れていますが、完璧ではありません。私のコンピューターはあなたのものよりも速いメモリーと遅いプロセッサーを持っているかもしれないので、完璧なものは何もありません。Linuxマシンと言っても、1つの完全なバイナリがあることを意味しません。同時に、コンパイラは、大きなファイルを与えたり、複雑なアルゴリズムを投影したり、組み立てられるアセンブリを生成する単純なアルゴリズムを与えたりするのに疲れません。これは、手の最適化が行われる場所であり、基本的にはすでに質問に対する回答を引用しています。マシンコードを台無しにする理由はありません。コンパイラはツールチェーンの一部であると考えて生成し、そこにファイルを取得します)。優れたスキルを持っている、または持っていると思う人間として、そのタスクのコードを作成するすべての仕事をする必要はありませんが、コンパイラの出力を調べたり、見逃した最適化を見つけたり、システムのコードを調整したりできます理由、彼らが選択した「より良い」の定義に。別の質問で幸運に思ったことがありますが、この典型的な最適化を行ってください。5で除算する代わりに1/5で乗算します。除算よりも乗算のあるプロセッサを見つける可能性が高く、乗算は除算よりも論理が少なく、より速く落ち着きますが、多くのプロセッサは「1クロックサイクル」は、1分間に1台の自動車が要因の側面から来るようなもので、自動車の製造に1分かかるという意味ではありません。乗算および定数に対するシフトは、コンパイル時に既知の除数を持つ除算では非典型的ではありません。この場合の除算はすぐに移動し、除算と多分行われます。2つの命令はメモリサイクルを追加しません。したがって、除算と移動に、たとえばCPUのクロックレートの少なくとも半分であるマイクロコントローラーのフラッシュに対する負荷よりもはるかに高速であるはずのクロックがかかる場合、設定に応じて待機状態が増えない場合、コンパイラが知らない何か。その負荷がキラーになる可能性があり、余分な命令フェッチがキラーになる可能性があります。同時に、この場合のIPベンダーには、チップベンダーが2つ以上のクロックで乗算をコンパイルすることを選択できるコアがあり、その1種類のパフォーマンスを少し犠牲にして、チップの面積を大幅に節約できます。そのようなことを分析する能力がある場合、コンパイラーがこれを示す設定もないかもしれません。これは手で最適化するようなコードではありませんが、より大きな関数出力でこれらの行が表示され、実験することを選択する場合があります。lrそしてそれはリンクされた出力であり、このコアが8ワードにアラインされた(そしてサイズされた)フェッチを持っていることを知りました。これらのループは本当に下に移動したいので、2つではなくループごとに1つのフェッチしか必要ありません。したがって、アセンブリ出力を取得し、ループの前に関数の先頭のどこかにnopを追加して、アライメントを移動できます。これはプロジェクトのコードを作成するのに手間がかかり、アライメントを変更する可能性があり、再調整する必要があります。この調整により、アドレス空間のさらに下にある他の調整が移動し、再調整が必要になります。重要だと思われる知識を持っているほんの一例であり、手作業でコンパイラの出力をいじることにつながります。ツールチェーンやコードを変更するたびに再タッチする手間をかけずに、このようなループを調整する簡単な方法があります。0xCCCD)>>18が表示されますか?いや、さらに多くのコード。32ビットが最適化されているか、またはマスクできないことがわからない場合。return((x&0xFFFF)/(5&0xFFFF));}次は、数学の理解を台無しにしていないことを確認するための実験を行います(この場合は、1倍の除算と複数の除算が組み込まれたマシンに対して、すべての組み合わせに対してすべての組み合わせを試します5つのことと一致することを確認してください)。それが成功した場合、ライブラリの呼び出しを回避するためにコードを手動で最適化します。return(0);}テストに合格しました。