一般的に、ソフトウェアを設計するとき、どのような最適化を一般的に好みますか?
あなたのデザインを最適化することを好むタイプですか
- 開発時間(つまり、書くのが迅速で、保守が簡単)
- 処理時間
- ストレージ(RAM、DB、ディスクなど)スペース
もちろん、これは解決される問題のタイプと関係する締め切りに対して非常に主観的であるため、ある形式の最適化を別の形式よりも選択する理由についてお聞きしたいと思います。
一般的に、ソフトウェアを設計するとき、どのような最適化を一般的に好みますか?
あなたのデザインを最適化することを好むタイプですか
もちろん、これは解決される問題のタイプと関係する締め切りに対して非常に主観的であるため、ある形式の最適化を別の形式よりも選択する理由についてお聞きしたいと思います。
回答:
次に、必要に応じてプロファイルを作成し、速度を最適化します。ストレージを必要とすることはほとんどありませんでした-少なくとも過去10年はそうではありませんでした。その前に私はやった。
処理と保管は安価です。あなたの時間はそうではありません。
ただ注意してください:
これは、すぐに終了するためだけにコードを書くという悪い仕事をするという意味ではありません。それは、迅速な開発を促進する方法でコードを書くことを意味します。また、完全にユースケースに依存します。これが単純な2ページまたは3ページの連絡先フォームのWebサイトである場合、おそらくPHPフレームワークを使用する必要はありません。いくつかのインクルードとメーラースクリプトが開発を加速します。その代わりに、成長して新しい機能を追加する柔軟なプラットフォームを作成することを計画している場合、適切にレイアウトし、それに応じてコーディングするのに時間をかける価値があります。
処理時間とストレージを直接比較すると、開発時間の短縮に傾いています。collectionutils減算関数を使用すると、コレクションを減算する最も高速でメモリ効率の高い方法ですか?いや!しかし、開発時間は短縮されます。パフォーマンスまたはメモリのボトルネックが発生した場合は、後で解決できます。何を最適化する必要があるかを知る前に最適化することはあなたの時間の無駄であり、それが私が主張していることです。
これは、顧客にとって重要な唯一の価値です。
開発時間はそれほど重要ではありません。完全な機能を備えたコマンドラインアプリケーションをGUIよりもはるかに高速に作成できますが、ジェーン夫人が望んでいるレポートを吐き出す方法を理解できない場合、それは役に立ちません。
メンテナンスはそれほど重要ではありません。シーソーをすばやく修復できますが、森の真ん中にある場合、ユーザーは見つけることができません。
処理時間はそれほど重要ではありません。60秒で光速が0になる車を作ると、ユーザーは操縦できません。
美学はそれほど重要ではありません。私はモナリザを描くことができますが、彼女が壁の後ろに隠れていると誰も彼女に会えません。
重要なのはユーザーエクスペリエンスだけです。ユーザーが期待する方法でユーザーが望んでいることを正確に実行するアプリケーションを作成することが、究極の成果です。
最適化することが1つだけあり、それは次のとおりです。
顧客は可能な限り最速のプログラムを必要としていますか?速度を最適化します。
顧客には絶対的な信頼性が必要ですか?そのために最適化します。
明日納品する必要がありますか、それとも役に立たないでしょうか?開発速度を最適化します。
リソースが限られた非常に小さなデバイスで実行していますか?それらのリソースを最適化します。
昨年使用したアプリケーションをアップグレードしました。彼らはアプリを完全に書き直しました、そして少年は遅かったです。すぐに実行するには新しいコンピューターを購入する必要がありました。安くはなかったと保証しますが、私の時間はもっと価値があります。
私は、メモリの消費と割り当てを制限する傾向があります。私はそれが古い学校であることを知っていますが、:
効率は、開発時間、将来の保守性、ユーザーエクスペリエンス、および消費されるリソースの間の妥協として定義され、効率に向けて最適化すると言います。開発者は、これらのすべてを調整して、何らかのバランスを維持する必要があります。
そのバランスをどのように達成しますか?さて、最初に、期限が何であるか、アプリケーションを実行するハードウェア、それを使用する人のタイプなど、いくつかの定数を確立する必要があります。これらを知らないと、正しいバランスを確立し、必要な場所に優先順位を付けることができません。
たとえば、強力なマシンでサーバーアプリケーションを開発している場合は、パフォーマンスの効率性を犠牲にして、期限のない期限を守ることができます。ただし、開発者がユーザーの入力にすばやく応答する必要があるアプリケーション(ビデオゲームを考える)の場合は、入力ルーチンを優先して、遅延がないことを確認する必要があります。
512 MBを超えるRAMを搭載したシステムが最先端と見なされていた時代を覚えていますか?前のコードを書くのに日々を費やしています。
私は主に、Xen環境の特権ドメインで実行される低レベルのプログラムで働いています。特権ドメインの上限は512 MBであり、残りのRAMはお客様が使用できるように解放されています。また、特権ドメインを1つのCPUコアに制限することも一般的です。
そこで、私は真新しい$ 6kサーバー上で実行するコードを書いています。各プログラムは(理想的には)割り当てられた100kbの範囲内で動作するか、動的メモリ割り当てを完全に避けなければなりません。
簡潔に、私は以下のために最適化します:
また、ロックを待機する時間、I / Oを待機する時間、または一般的に待機する時間に関しては、非常に勤勉でなければなりません。私の多くの時間は、既存の非ブロッキングソケットライブラリの改善と、ロックフリープログラミングのより実用的な方法の調査に費やされています。
テクノロジーの進歩により、先月購入したシステムで15年前と同じようにコードを書いているのは毎日少し皮肉なことです。
これは、組み込みプラットフォームで作業する人にとっても一般的ですが、それらの多くでさえ、少なくとも1GBを自由に使用できます。Jasonが指摘しているように、モバイルデバイスで実行するプログラムを作成する場合も一般的です。リストは、キオスク、シンクライアント、画像フレームなどに続きます。
ハードウェアの制限は、実際に消費するものを気にせずに何かを機能させることができる人とプログラマを本当に隔てると考え始めています。さまざまな分野のプログラマーの間で共有されていた(かつては)常識の集合的なプールに対して、型とメモリのチェックを完全に抽象化する言語を心配します(必要であれば、私は反対票を投じます)。
アカデミックとして、私は自分が最適化するものを共有すべきだと考えました。これは、開発時間を短縮するための最適化とまったく同じではないことに注意してください。多くの場合、この作業は何らかの研究上の疑問をサポートする可能性があるが、成果物で洗練された製品ではないことを意味します。これは品質の問題と見なされる可能性があり、多くの人が(学術)コンピューター科学者には「現実世界」の経験がないと言う理由を説明できます。(たとえば、「そうでなければ、彼らは成果物を開発する方法を知らないだろうか?」)
それは素晴らしいラインです。インパクトという点では、作品を他の人が使用して引用したいと考えています。JoelのIceberg Effectが登場します。ちょっとした磨きと輝きが大いに役立ちます。しかし、他のプロジェクトを基盤とする基盤を作っていない場合、成果物の作成に費やした時間を正当化できないかもしれません。
エレガンス。
コードが適切に設計されている場合、いくつかの効果があります。
開発時間、絶対に。帯域幅も最適化しますが、バイナリには行きません。
今日のコンピューターは高速ですが、それだけでは不十分です。ストリーミングメディアサーバーを使用している場合、パフォーマンスが重要となる多くの状況があります。
あなたの顧客は大きなディスクを持っているかもしれません、例えば、1TB。1000のHDムービーでどれを取り上げることができますか。それをサービスにしたい場合、それは十分ではありませんか?
これが「最適化」としてカウントされるかどうかはわかりませんが、私がしているのはC ++の代わりにJavaを使用し、開発が10倍速くなることです。前進し、完全にロック!
ところで、開発プロセスの開発をスピードアップするには、Javaを選択する必要があります。Pythonのようなごみを決して試さないでください。開発時間を短縮できると主張しています。