質問

もし ムーアの法則 が当てはまり、CPU/GPU はますます高速になっていますが、ソフトウェア (そして、それに関連してソフトウェア開発者) は依然としてコードの最適化が必要な範囲まで限界を押し広げるのでしょうか?それとも、コード (など) には単純な階乗解で十分でしょうか?

役に立ちましたか?

解決

悪いコードは常にCPU速度を克服することができます。

は、優れた例では、このコーディングホラーの列とスクロールに行きますブックのプログラミング真珠のを記述するセクションまで。特定のアルゴリズムに対して、TRS-80 4.77MHz 8ビットプロセッサと32ビットのAlphaチップを打つことができる方法を示すグラフである再生

スピードアップでの現在の傾向は、個々のコアが速く行く作ることののは難しいです「原因、複数のコアを追加することです。だから、集計速度が上がるが、リニアのタスクは常にメリットはありません。

「ブルートフォースと無知を克服することができないという問題がない」と言っては必ずしも真実ではありません。

他のヒント

処理能力2倍をあなたのお粗末なN ^ 2検索のawfulnessを改善するために多くを行いません。

速いコンピュータが得る、より多くの我々は彼らが何を期待しています。

競争上の優位性があるかどうそれは金融市場での取引のためのビデオゲームでは複数のポリゴン、またはより高速なアルゴリズムの高速なコードが高速であることに、だかどうかは、最適化がやはり重要になります。あなたは、あなたとあなたの友人を追いかけているライオンをoutraceする必要はありません - あなたは自分の仲間をoutraceする必要があります。

すべてのプログラマは周りの最適なコードを最初に書くまで

は、常に最適化のための場所があるでしょう。一方、本当の問題はこれです:私たちは最初に最適化すべきか。

ムーアの法則は、我々はチップ上でパックすることができますどのように多くのトランジスタについて語って - それは、これらのトランジスタがにつれて、ますます速い速度を切り替えることが可能であることについて何も言うことはありません。実際、ここ数年の時計に速度は、多かれ少なかれ停滞している - 私たちは、チップ当たり(本質的に完全なCPUを、)より多くの「コア」を得続けます。それを利用するには、コードの並列化が必要なので、あなたはそれがために、より現実的に(複数のコアにそれを耕作することができますので、「単純に」未来の魔法のオプティマイザはあなたのコードに隠された並列処理を見つける忙しくなる書いている場合の予見可能なの未来、あなたのコンパイラの多くを助けする必要があります; - )

計算タスクは、大きく 2 つのグループに分類されるようです。

  1. 制限された計算ニーズに関する問題。
  2. 無制限の計算ニーズに関する問題。

ほとんどの問題は最初のカテゴリに当てはまります。たとえば、リアルタイム 3D ラスタライゼーションです。長い間、この問題は一般的な家庭用電化製品では手の届かないものでした。Apple 上でリアルタイムの世界を生成できる説得力のある 3D ゲームやその他のプログラムは存在しませんでした。しかし、最終的にはテクノロジーが追いつき、今ではこの問題は解決できるようになりました。同様の問題はタンパク質の折り畳みのシミュレーションです。ごく最近まで、既知のペプチド配列を結果として得られるタンパク質分子に変換することは不可能でしたが、最新のハードウェアにより、数時間または数分の処理でこれが可能になりました。

ただし、その性質上、利用可能な計算リソースをすべて消費してしまう可能性がある問題がいくつかあります。これらのほとんどは動的物理シミュレーションです。明らかに、たとえば天気の計算モデルを実行することは可能です。コンピューターが登場して以来、私たちはこれを行ってきました。ただし、このような複雑なシステムは精度が向上することで恩恵を受けます。より微細な空間と時間の解像度でのシミュレーションにより、予測が少しずつ改善されます。しかし、特定のシミュレーションがどれほど正確であっても、その後の利点を考慮すると、精度をさらに高める余地があります。

どちらのタイプの問題も、あらゆる種類の最適化に非常に重要な用途があります。2 番目のタイプは非常に明白です。シミュレーションを実行するプログラムが少し改善されると、プログラムの実行が少し速くなり、結果が少し早く、またはもう少し正確に得られます。

ただし、最初のものはもう少し微妙です。一定期間の間は、最適化に十分な速度を持つコンピューターが存在しないため、いくら最適化しても意味がありません。しばらくすると、最適化を実行するハードウェアの速度が必要な速度よりも何倍も高速になるため、最適化は多少無意味になります。ただし、最適なソリューションが現在のハードウェアで問題なく動作する一方で、次善のソリューションが動作しないまでの期間は狭いです。この期間中、慎重に検討された最適化が、初めて市場に投入されて成功する製品と、その後も実行される製品との違いとなる可能性があります。

速度よりも最適化に多くのがあります。ムーアの法則は、コンピュータのメモリには適用されません。また、最適化は、多くの場合、CPU固有の命令を利用するようにコードをコンパイルするプロセスです。これらは、ちょうど私がそのことを考えることができる最適化のいくつかは、より高速のCPUによって解決されることはありませんされています。

ムーアの法則に緩和する要素は、ブロートウェアにあるので、

最適化は常に、必要になります。

他の回答には、問題の高速側に集中しているようです。それはいいです。私が見ることができる本当の問題は、あなたのコードを最適化した場合、それを実行するために、より少ないエネルギーを取るだろうということです。あなたのデータセンターは、お使いの携帯電話が充電で一日以上のために行く、あなたのラップトップが長く続く、クーラー実行されます。市場のこの最後の本当の選択圧があります。

最適化は、特に次のような多くの状況で今後も必要となります。

  • CPU 時間が非常に重要なリアルタイム システム

  • 組み込みシステムではメモリが重要視されます

  • 多くのプロセスが同時に注意を必要とするサーバー

  • ゲーム: 3D レイ トレーシング、オーディオ、AI、ネットワーキングにより非常に要求の厳しいプログラムが作成される場合があります。

世界が変化し、そして我々はそれを変更する必要があります。私が最初に始めたとき、優秀なプログラマーであることは、すべてあなたがCでポインタを操作することにより、ルーチンの外に別の0.2%を絞るために行うことができ、ほとんどのマイクロ最適化のすべて、およびそのような他の事を知っている程度でした。今、私は長い目で見れば、それはより多くの貴重なので、アルゴリズムがより理解しやすい作りに取り組んで私の時間の多くを費やしています。しかし - 常に最適化するためのもので、常にボトルネックがあります。より多くのリソースは、人々が自分のシステムからより多くを期待し、そのずさんであることが、プロへの有効なオプションではないことを意味します。

あなたがが、で動作するように、よりスピード/メモリ/リソースを追加すると

最適化戦略が変化します。

いくつかの最適化がスピードとは何の関係もありません。マルチスレッド・アルゴリズムを最適化する場合、例えば、あなたが共有ロックの総数の減少を最適化することができます。あなたの現在の処理能力がロックを待機に費やされた場合の速度(または悪化し、プロセッサ)の形でより多くの処理能力を追加すると、あなたは間違って物事をやっている場合は、プロセッサを追加することも、あなたの全体的なパフォーマンスの低下を行うことができます....どんな効果を持っていないかもしれません。この場合、最適化ではなく、命令の数を削減しようとしているの罰金できるだけきめとしてロックの数を減らすこと、およびそれらを維持しようとしていることを意味します。

限り、一部の人々は過度のリソースを使用して遅いコードを書くように、他の人がより速く、それらのリソースを提供し、バックスピードを得るために自分のコードを最適化する必要があります。

私は見つけることは、いくつかの開発者は次善のコードを書いてもらうことができますどのように創造的な素晴らしいです。私の前の仕事で、一人の男は、たとえば、1つの日付をインクリメントするcontinuningと比較することにより、2つの日付の間の時間を計算する関数を書いています。

コンピュータの速度が人的ミスを常に克服できるわけではありません。質問は次のように表現されるかもしれません。」CPUは十分に高速になるでしょうか コンパイラには時間がかかることがあります 実装上の問題を発見(そして修正)するため」 明らかに、これを修正するにはコードの最適化が (近い将来に) 必要になります。 画家シュレミエル-タイプの問題。

ソフトウェア開発は依然としてコンピュータに指示することです その通り 何をするか。「ますます高速化する」CPU が私たちにもたらすのは、 ますます抽象的で自然なプログラミング言語を設計する, 、最終的には、コンピューターが私たちの意図を受け取り、すべての低レベルの詳細を実装するところまで...いつか。

楽しむ、

ロバート C.カルタイノ

コンピュータは、ティーンエイジャーの部屋のようなものです。

これは、すべての迷惑メールを保持するのに十分な大きさではありません。

私はこのすべての結果は、プログラマが与えられたタスクを達成するために、より少ない時間を過ごすことができるようにコンピューティングパワーが安くなっているということだと思います。たとえば、JavaやPythonのような高レベルの言語は、ほとんど常に議会のような低水準言語よりも遅いです。しかし、それはそんなに簡単に新しいものが可能であり、プログラマのためです。私は最終目的地は、コンピュータが直接人間と通信できるようになるということ、およびバイトコードに人間の音声をコンパイルすると思います。その後、プログラマは存在しなくなります。 (そして、コンピュータが世界を引き継ぐかもしれません)。

右または間違っている、それは私の意見では、すでに起こっている、それは必ずしも悪いことではありません。より良いハードウェアは、開発者がメモリ使用率の余分な10%を心配するよりも、手で問題を解決する上でより多くのエネルギーを集中するために現在の機会を行います。

最適化がinarguableですが、それが必要なの場合のみです。私は、追加のハードウェアの電源は、単にそれが本当に必要とされているインスタンスが減少していると思います。しかし、誰がより良い自分のコードが最適化されている月にスペースシャトルを起動するためのソフトウェアを書いている:)

コンピュータが速く、彼らは数十年前に比べ約1000倍ですが、一般的にはるかに高速に表示されていない、私たちは、最適化の心配を停止する前に、我々は長い道のりを持っていることを言うと思います。ということを考えると問題は、コンピュータがより強力になるよう、私たちは抽象度の高いレベルで作業できるように、コンピュータが私たちのために、より多くの仕事を持っているということです。抽象化の各レベルでの最適化は依然として重要である。

はい、コンピュータが非常に速く、多くのことを行う:あなたは、コンピュータの時間の日数を必要とするために使用分でマンデルブロを描くことができます。 GIF負荷がほぼ瞬時に、むしろ目に見える秒を取るよりも、画面上に描画します。多くのものが速くなります。しかし、ブラウジングは、例えば、そのはるかに高速ではありません。ワープロはそのはるかに高速ではありません。コンピュータがより強力になるにつれ、私たちはもっと期待して、私たちはコンピュータがを作るの複数の操作を行います。

最適化が予見、将来のために重要になります。しかし、のミクロの最適化は、ははるかに少ない重要な彼らがために使用よりも、です。最も重要な最適化は、これらの日は、アルゴリズムの選択かもしれません。あなたは、など.... O(nはn個のログ)またはO(N ^ 2)を選択してくださいます。

最適化のコストが非常に低いので、私はそれはそれをドロップすることが必要になります疑います。本当の問題はそこだ、すべてのコンピューティングパワーを利用するタスクを見つけることである - そうではなく、最適化をドロップし、我々は<のhref = "http://msdn.microsoft.com/en-で物事を行う当社の能力を最適化します私たち/同時実行/ default.aspxを」のrel = "nofollowをnoreferrer">並列するます。

あなたは3GHzのマルチコアプロセッサの下で、新しいを参照してください理由

最終的に我々はより速く得ることができるように文句を言わない、最終的に我々はそうです最適化はまだneccessity ..ですので、スペースによって制限されます。

の最適化コードは、常にある程度必要になりますし、単に実行速度と低メモリ使用量をスピードアップすることはありません。情報を処理するのに最適なエネルギー効率の良い方法を見つけることは、例えば、データ・センターにおける主要な要件であろう。プロファイリングスキルがたくさんより重要になるとしている!

はい、私たちは最適化が重要な段階に来ており、近い将来には最適化が重要になるでしょう。なぜなら:

  • RAM の速度は、CPU の速度よりも遅いペースで増加します。したがって、CPU と RAM との間のパフォーマンスの差は依然として拡大しており、プログラムが RAM に頻繁にアクセスする場合は、キャッシュを効率的に活用するためにアクセス パターンを最適化する必要があります。そうしないと、超高速 CPU は 90% の時間アイドル状態になり、データの到着を待つだけになります。
  • コアの数はどんどん増えていきます。コードは追加された各コアから恩恵を受けますか? それとも単一のコアで実行されますか?ここでの最適化とは並列化を意味しますが、実行中のタスクによっては、それが難しい場合があります。
  • CPU の速度は、指数関数的なアルゴリズムやその他の強引な種類のものには決して追いつきません。これでうまく説明されているように 答え.

レッツ希望のネットワーク速度はCPUが追いつくために私たちは、ワイヤ上で十分なデータをシャベルでき追いつく...

で述べたように、常にボトルネックが存在します。

あなたのCPUは、宇宙の素粒子の数と同じくらい多くのトランジスタを持ち、そのクロックはハード宇宙線の周波数で動作し、あなたはまだそれを打つことができると仮定します。

あなたが先に最新のCPUクロックの滞在したい場合は、

、ちょうどあなたのループ内のネストの別のレベルを追加したり、サブルーチンコールにネストの別のレベルを追加します。

それとも、本当にプロになりたい場合は、抽象化の別の層を追加します。

それは難しいことではありません: - )

CPU がどんどん高速化しても、常に最適化することができます。

  • ネットワークスループット、
  • ディスクシーク、
  • ディスクの使用状況、
  • メモリ使用量、
  • データベーストランザクション、
  • システムコールの数、
  • スケジュールとロックの粒度、
  • ゴミ収集。

(これは私がこの半年の間に見た実際の例です)。

複雑なコンピュータ システムのさまざまな部分は、コンピューティングの歴史のさまざまな時点で高価であると考えられています。ボトルネックを測定し、どこに力を注ぐべきかを判断する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top