何のために最適化していますか?[閉まっている]


19

一般的に、ソフトウェアを設計するとき、どのような最適化を一般的に好みますか?

あなたのデザインを最適化することを好むタイプですか

  • 開発時間(つまり、書くのが迅速で、保守が簡単)
  • 処理時間
  • ストレージ(RAM、DB、ディスクなど)スペース

もちろん、これは解決される問題のタイプと関係する締め切りに対して非常に主観的であるため、ある形式の最適化を別の形式よりも選択する理由についてお聞きしたいと思います。


上記の3つはすべてですが、一般性(保守に関連する)をスローします。たとえば、ソフトウェアのニーズに幅広く適用できる非常に効率的なデータ構造を設計し、徹底的にテストするために時間をかけると、何年も役立ち、個々の問題を解決するのに非常に適した多くのデータ構造を書く必要がなくなります問題。

回答:


40

メンテナンス

次に、必要に応じてプロファイルを作成し、速度を最適化します。ストレージを必要とすることはほとんどありませんでした-少なくとも過去10年はそうではありませんでした。その前に私はやった。


8
+1、最初から保守性を最適化すると、必要に応じて後で速度やストレージを最適化するのが簡単になります。
Carson63000

処理時間とストレージを少なくとも考慮する必要があるため、極端なアプローチを選択しないでください。

@Thorbjørn、開発者の時間を最適化する場合は、おそらく(おそらく)特定の言語で読み取り/書き込みが容易なアルゴリズムを選択するでしょう。後になって、パフォーマンスが問題になる場合にのみ、(@ Timが言ったように)プロファイラーを選択します。
ジェイソンホワイトホーン

@ジェイソン、私は強く反対します。適切な実装を選択するには、選択したアルゴリズムのパフォーマンス特性に精通している必要があります。つまり、主に郵便番号を検索するために必要なときにArrayListを選択すると、うまくスケーリングされない可能性があります。

1
@Thorbjørn、私はあなたに同意しません。実際、手元のアルゴリズムに注意を払う必要があるという点であなたは正しいと思います。しかし、意見が異なるのは、私の意見では、どのアルゴリズムを選択するかというアイデアは、経験を通じて学習されたものであり、問​​題が発生した場合にのみ修正されるものだと思います。あなたはあなたの点で正しいです、私はコードを実装するために読みにくく/長くなるという犠牲を払って、そのために最適化する必要性を単に見ていません。
ジェイソンホワイトホーン

27

開発時間

処理と保管は安価です。あなたの時間はそうではありません。

ただ注意してください:

これは、すぐに終了するためだけにコードを書くという悪い仕事をするという意味ではありません。それは、迅速な開発を促進する方法でコードを書くことを意味します。また、完全にユースケースに依存します。これが単純な2ページまたは3ページの連絡先フォームのWebサイトである場合、おそらくPHPフレームワークを使用する必要はありません。いくつかのインクルードとメーラースクリプトが開発を加速します。その代わりに、成長して新しい機能を追加する柔軟なプラットフォームを作成することを計画している場合、適切にレイアウトし、それに応じてコーディングするのに時間をかける価値があります。

処理時間とストレージを直接比較すると、開発時間の短縮に傾いています。collectionutils減算関数を使用すると、コレクションを減算する最も高速でメモリ効率の高い方法ですか?いや!しかし、開発時間は短縮されます。パフォーマンスまたはメモリのボトルネックが発生した場合は、後で解決できます。何を最適化する必要があるかを知る前に最適化することはあなたの時間の無駄であり、それが私が主張していることです。


4
ムーアの法則は約2年前に終了しました。並行性について考え、それらの追加のコアを使用する時が来たかもしれません。これが将来的に安価なクロックサイクルを取得する唯一の方法です。
ロバートハーベイ

3
正確には、ムーアの法則は、約2年ごとにチップ上のトランジスタ数が2倍になり、1つのダイに複数のコアを配置できるようになっているため、引き続き強力です。終了したのは、1秒間に増え続けるサイクル数の「無料ランチ」です。
ドミニクマクドネル

1
「処理と保管は安価です。」CPUキャッシュとバス速度は異なります。今日の主なパフォーマンスのボトルネックです。
mojuba

3
私はこれに完全に同意します。読み取り可能なコードを維持し、タスクに適切なツールを使用し、会社の合意された標準に従うことで、実際にコンピューターにコードを入力する時間を大幅に削減し、会社のコストを大幅に節約できます。入力するよりも、エンジニアリングに費やす方が良いでしょう。
マットディトロリオ

1
@Bill:または、組み込みを行っている場合、ハードリミットがある場合、それを超えると製品コストが大幅に増加します。または、サーバーソフトウェアの場合、場合によっては、誰かがGoogleサーバーの処理を1%改善できれば、かなりの節約になります。
デビッドソーンリー

12

ユーザー体験。

これは、顧客にとって重要な唯一の価値です。

開発時間はそれほど重要ではありません。完全な機能を備えたコマンドラインアプリケーションをGUIよりもはるかに高速に作成できますが、ジェーン夫人が望んでいるレポートを吐き出す方法を理解できない場合、それは役に立ちません。

メンテナンスはそれほど重要ではありません。シーソーをすばやく修復できますが、森の真ん中にある場合、ユーザーは見つけることができません。

処理時間はそれほど重要ではありません。60秒で光速が0になる車を作ると、ユーザーは操縦できません。

美学はそれほど重要ではありません。私はモナリザを描くことができますが、彼女が壁の後ろに隠れていると誰も彼女に会えません。

重要なのはユーザーエクスペリエンスだけです。ユーザーが期待する方法でユーザーが望んでいることを正確に実行するアプリケーションを作成することが、究極の成果です。


申し訳ありませんが、ジョーリ、編集に夢中になりました。
マルフィスト

それは何かのためのコミュニティウィキですよね?;)
ジョーリ・セブレヒト

8

最適化することが1つだけあり、それは次のとおりです。

顧客が望むもの

顧客は可能な限り最速のプログラムを必要としていますか?速度を最適化します。

顧客には絶対的な信頼性が必要ですか?そのために最適化します。

明日納品する必要がありますか、それとも役に立たないでしょうか?開発速度を最適化します。

リソースが限られた非常に小さなデバイスで実行していますか?それらのリソースを最適化します。


唯一の難点は、彼らがしばしば自分が何を望んでいるかを知らない、または何が可能または役立つかについて期待を抱いていないことです。
ティムウィリスクロフト

1
そして、ほとんどの場合、あなたは単に「はい」と聞こえます:-)、複数の選択肢の質問のそのシリーズを尋ねられたとき
ジェイソン・ホワイトホーン

1
簡単だとは言いませんでした。そして、少なくともあなたが尋ねるならば、あなたは役に立つ答えを得る可能性があります。
-DJClayworth

5

処理時間

ユーザーの時間は安くありません。何が起こるかは回ります。


昨年使用したアプリケーションをアップグレードしました。彼らはアプリを完全に書き直しました、そして少年は遅かったです。すぐに実行するには新しいコンピューターを購入する必要がありました。安くはなかったと保証しますが、私の時間はもっと価値があります。


処理時間の傾斜に興味を持っています。開発するアプリケーションの種類を共有するように注意してください。私は興味をそそられます。
ジェイソンホワイトホーン

1
多くのコンピューターで実行する場合、処理時間は重要です。それは余分な2ヶ月費やして最適化する、または新しいハードウェアに万のPCをアップグレードするかの選択だ場合、その場合には、開発者の時間がないではない勝ちます。しかし、もちろん、それは妥協です。半ダースのサーバーでしか実行しない場合、その場合、開発者の時間が勝つ可能性があります。
ディーンハーディング

1
@ Jason、ExcelとVBAを使ってスプレッドシートの集合体で作業しているので、今は簡単です(急速に圧縮されています)。私のユーザーは隣の部屋で働いており、問題があるかどうかを知らせてくれます。私の見方は、30年間コンピューターを使用し、アプリケーションが肥大化し続けるのを見て、アップグレードを補償しすぎることです。開発者はもっとうまくやれることを知っています。彼らは効率的なコードを書く習慣を身につければよいのです。

効率的なコードの場合は+10。特にモジュール式プログラミングでは、見過ごされがちです。すべてのモジュールは妥当な速度で実行されますが、すべてのモジュールの合計は非常に遅くなる可能性があります。
ジョリスメイズ

4

私は、メモリの消費と割り当てを制限する傾向があります。私はそれが古い学校であることを知っていますが、:

  • 私が書いた非スローアウェイコードのほとんどは、非常に並行しています。これは、過剰なメモリ割り当てとガベージコレクションアクティビティにより、多くの場合並列化可能なコードがシリアル化されることを意味します。また、共有メモリバスの競合が多くなることも意味します。
  • 私の第一言語はDです。これはまだ良い64ビットのサポートを持っていません(ただし、これは修正されています)。
  • 私はかなり大きなデータセットを定期的に使用しています。

ブロートウェアの防止に取り組んでいる場合は+1。メモリを占有するプログラムは悪いプログラムです。

メモリホグプログラムは、一般的に64ビットシステムで実行できます。これは、アプリの1つがメモリの問題に遭遇したときに行ったことです(合法的に大量のメモリを使用します)。パフォーマンスが重要な場合、最初の箇条書きは重要です。
デビッドソーンリー

2

効率は、開発時間、将来の保守性、ユーザーエクスペリエンス、および消費されるリソースの間の妥協として定義され、効率に向けて最適化すると言います。開発者は、これらのすべてを調整して、何らかのバランスを維持する必要があります。

そのバランスをどのように達成しますか?さて、最初に、期限が何であるか、アプリケーションを実行するハードウェア、それを使用する人のタイプなど、いくつかの定数を確立する必要があります。これらを知らないと、正しいバランスを確立し、必要な場所に優先順位を付けることができません。

たとえば、強力なマシンでサーバーアプリケーションを開発している場合は、パフォーマンスの効率性を犠牲にして、期限のない期限を守ることができます。ただし、開発者がユーザーの入力にすばやく応答する必要があるアプリケーション(ビデオゲームを考える)の場合は、入力ルーチンを優先して、遅延がないことを確認する必要があります。


2

私が使用している仮想化テクノロジーは何でも

512 MBを超えるRAMを搭載したシステムが最先端と見なされていた時代を覚えていますか?前のコードを書くのに日々を費やしています。

私は主に、Xen環境の特権ドメインで実行される低レベルのプログラムで働いています。特権ドメインの上限は512 MBであり、残りのRAMはお客様が使用できるように解放されています。また、特権ドメインを1つのCPUコアに制限することも一般的です。

そこで、私は真新しい$ 6kサーバー上で実行するコードを書いています。各プログラムは(理想的には)割り当てられた100kbの範囲内で動作するか、動的メモリ割り当てを完全に避けなければなりません。

簡潔に、私は以下のために最適化します:

  • メモリフットプリント
  • 並べ替え(ほとんどのコードがほとんどの時間を費やす場所)

また、ロックを待機する時間、I / Oを待機する時間、または一般的に待機する時間に関しては、非常に勤勉でなければなりません。私の多くの時間は、既存の非ブロッキングソケットライブラリの改善と、ロックフリープログラミングのより実用的な方法の調査に費やされています。

テクノロジーの進歩により、先月購入したシステムで15年前と同じようにコードを書いているのは毎日少し皮肉なことです。

これは、組み込みプラットフォームで作業する人にとっても一般的ですが、それらの多くでさえ、少なくとも1GBを自由に使用できます。Jasonが指摘しているように、モバイルデバイスで実行するプログラムを作成する場合も一般的です。リストは、キオスク、シンクライアント、画像フレームなどに続きます。

ハードウェアの制限は、実際に消費するものを気にせずに何かを機能させることができる人とプログラマを本当に隔てると考え始めています。さまざまな分野のプログラマーの間で共有されていた(かつては)常識の集合的なプールに対して、型とメモリのチェックを完全に抽象化する言語を心配します(必要であれば、私は反対票を投じます)。


1
メモリフットプリントの角度に対して+1。私は、あなたが扱っていることを特定の制約に対してコーディングされていないが、Xenのについて話最初のセクションを削除し、iPhoneとのことを交換し、私はあなたが:-)から来ている場所を正確に知っている決してきた
ジェイソン・ホワイトホーン

2

調査結果

アカデミックとして、私は自分が最適化するものを共有すべきだと考えました。これは、開発時間を短縮するための最適化とまったく同じではないことに注意してください。多くの場合、この作業は何らかの研究上の疑問をサポートする可能性があるが、成果物で洗練された製品ではないことを意味します。これは品質の問題と見なされる可能性があり、多くの人が(学術)コンピューター科学者には「現実世界」の経験がないと言う理由を説明できます。(たとえば、「そうでなければ、彼らは成果物を開発する方法を知らないだろうか?」

それは素晴らしいラインです。インパクトという点では、作品を他の人が使用して引用したいと考えています。JoelのIceberg Effectが登場します。ちょっとした磨きと輝きが大いに役立ちます。しかし、他のプロジェクトを基盤とする基盤を作っていない場合、成果物の作成に費やした時間を正当化できないかもしれません。


1
  1. 設計
    • 低結合、モジュラー
    • 簡潔で明確に定義された機能領域
    • よく文書化されている
    • クラフトを継続的にリファクタリングする
  2. メンテナンス
    • 再現可能なビルドとデバッグ
    • 単体テスト
    • 回帰テスト
    • ソース管理

...その後、他のすべて

...最後に、パフォーマンスを最適化します;-)


1

品質/テスト

開発スケジュールにテスト(ユニットテストと機能/フェーズ後のテストの両方)の時間を確保するなど、品質に向けて最適化します。


1

プログラムの必要性に依存します。

私がしていることのほとんどは、処理能力とメモリに大きく制約されていますが、平均的な年に大きな変化があったとしても非常に多くありません。

私は過去にコードを頻繁に変更するプロジェクトに取り組んできたため、そのような場合には保守性がより重要になります。

また、過去にデータの量が最も重要な問題であり、ストレージ用のディスクでもシステムに取り組んでいましたが、より一般的には、データを大量に、または低速で移動する必要がある場合、サイズが問題になりますリンク。


1

エレガンス

コードが適切に設計されている場合、いくつかの効果があります。

  1. 保守が容易になります(顧客のコスト削減)
  2. 最適化が容易になります(JITまたは完全なコンパイラーの場合)
  3. 交換が簡単になります(より良い解決策を考えるとき)


0

IBMメインフレームからPCに至るまで、複数のタイプのシステムにインストールするため、最初に互換性、次にサイズ、速度の最適化を行います。


0

場合によります

リアルタイムの組み込みビデオ処理システムで作業している場合、処理速度を最適化します。ワープロで作業している場合は、開発時間を最適化します。

ただし、すべての場合において、コードは機能し、保守可能でなければなりません。


0

私の意図の表現力。

コードを読んでいる人に、ドメインで実行しようとした操作を簡単に確認できるようにしたいのです。同様に、スキャンを容易にするために、意味のないジャンク(中括弧、jsの「関数」キーワードなど)を最小限に抑えるようにします。

もちろん、保守性によってバランスを取る必要があります。私は関数とあらゆる種類の高度な技術を返す関数を書くのが大好きであり、それらは私の目標をさらに進めますが、利益がわずかであれば、私は堅実なjrプログラマーが精通している技術に固執する側で失敗します。


-6

それらのすべて

処理時間

今日のコンピューターは高速ですが、それだけでは不十分です。ストリーミングメディアサーバーを使用している場合、パフォーマンスが重要となる多くの状況があります。

ストレージ

あなたの顧客は大きなディスクを持っているかもしれません、例えば、1TB。1000のHDムービーでどれを取り上げることができますか。それをサービスにしたい場合、それは十分ではありませんか?

開発時間

これが「最適化」としてカウントされるかどうかはわかりませんが、私がしているのはC ++の代わりにJavaを使用し、開発が10倍速くなることです。前進し、完全にロック!

ところで、開発プロセスの開発をスピードアップするには、Javaを選択する必要があります。Pythonのようなごみを決して試さないでください。開発時間を短縮できると主張しています。


これを読むと面白いかもしれません:paulgraham.com/avg.html-プログラミング言語の強さについて説明しています。

3
限られた時間と予算では、それらすべてに時間を費やすことはできません-何らかの優先順位が必要です。
JBRウィルキンソン

@JRBWilkinsonまあ、ケースバイケースでなければなりません
tactoth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.