マイクロ最適化はモバイルデバイスで価値がありますか?


8

通常、マイクロ最適化は次の説明では価値がないと見なされます。プログラムを1パーセント未満高速化する可能性がありますが、その小さなブーストを気にする人はいません。

さらに、1秒間に1000回起動し、非常に高速に終了するイベントハンドラが存在する可能性があります。それがどれほど速いかは誰も気にしません-それがすでに「観察できるほど速い」ので、それを速くすることは注目に値しません。

ただし、モバイルデバイスではエネルギー消費が重要な要素です。同じイベントハンドラーを10%速く実行するように最適化すると、消費されるエネルギーが少なくなり、バッテリー寿命が長くなり、デバイスの動作時間が長くなります。

モバイルデバイスに関する後者の判断はどの程度正確ですか?それを確認または反証する実際の例はありますか?


3
私見、一般的な最適化と同様に、信頼できる答えは測定によってのみ得られます。しかし、問題はそれにもかかわらず良い、1です:-)
ペーテルTörök

1
用語を定義します。ランタイムのマイクロ最適化について話しているように思いますが、具体的にはエネルギー使用量について言及していますが、小型デバイスのコンテキストでは、最適化する価値があるのはそれだけではありません。実行可能サイズとメモリフットプリントは他のものです。
Peter Taylor

回答:


12

測定値が価値があると言っている場合、それは価値があります。スーパーデバイスだけでなく、モバイルデバイスにも。

編集:トピックから少し外れましたが、あなたの例についてです。イベントが何度もトリガーされる場合は、構想の問題があり、その構想の問題を解決することは本当のことです。マイクロ最適化によって目立たなくしません。

たとえば、コールバックでテストを実行して、あまりに頻繁な呼び出しを破棄したり、コールバックが呼び出される方法をやり直したりできます。

一般に、コールバックを«継続的なイベント»にアタッチすることは悪い習慣です。つまり、一度はトリガーされないものの、時間の経過とともに続くアクションでトリガーされるイベントを意味します。

たとえば、ページまたはスライダーのスクロールは、継続的なイベントです。

これらのイベントがトリガーされる回数はわかりません。それらが十分に速くトリガーされる場合、アプリケーションは遅延し、それらが何度もトリガーされる場合、巨大なCPU負荷が無駄になり、アプリケーションも遅延する可能性があります。


さて、私は何を測定しますか-電力消費または他の何か?
シャープトゥース2011

4
ユーザーにとって何が重要かを測定します。消費が問題である(そしてモバイルデバイス上にある)場合は、それを測定し、測定に従って行動します。
deadalnix、2011

商業的な考慮事項についてはどうですか?最適化を行うことは有益ですか?より大きなバッテリーは、低中量製品のエンジニアリング時間よりも安いかもしれません。バッテリー寿命が5%短い低速のユーザーインターフェイスは、市場に出ている製品がないよりも優れています。$$$を焼くのは簡単で、完璧を達成することは決してありません。
mattnz、2009

2

モバイルデバイスに関する後者の判断はどの程度正確ですか?

実際の最適化が実際に役立つことを実際に示すのは、実際のデバイスでの実際の測定と同じくらい正確です。

仮定と判断は価値がありません。

測定には価値があります。

すべての最適化(「マイクロ最適化」を含む)は、コードが実際にいくつかの要件(速度、メモリ、電力、ネットワーク遅延など)を満たしていないという実際の問題を示す実際の測定が行われるまでの時間の無駄です)。


2

(速度があなたの主要な問題であると仮定します。)誰もが正しいです。
例外-測定では何を最適化するかがわかりません。

測定により、最適化する必要があることがわかります。
測定は、最適化を行ったときに節約した量を示します。

測定では、何を最適化するかがわかりません。
このテクニックは、何を最適化するかを教えてくれます。


2
このランダムサンプリング手法よりもプロファイリングの方が優れていますか?
S.Lott、2011

2
@ S.Lott q:壁画を2ブロック先から見た方が2フィート先から見た場合よりも優れていますか?a:壁画を1つの視点から見ると、実際には見えません。どちらも重要です。サンプリング/プロファイリングは、それがプログラムのパフォーマンスを評価するために取る唯一の視点である場合、時間の浪費になる可能性があります。
ジャスティン2011

@ジャスティン:「もし...サンプリング/プロファイリングは時間の浪費になりかねません...」?何?プロファイリングがサンプリングほど良くなかったかのように、サンプリングに関するリンクを提供しました。今、あなたは両方が潜在的に悪いと言っていますか?3番目の選択肢は、リンクとプロファイリングでのサンプリング(私にとってはより完全で有用と思われる)とは異なりますか?3番目の選択肢がある場合、答えを更新して、これらすべての選択肢がどのように組み合わされるかを説明できますか?プロファイリングの何が問題になっているのか、まだはっきりしていません。リンクは、なぜサンプリングが優れているかを説明していません。
S.Lott、2009

@ S.Lott:まあ、それは少数派の見解だと知っていますが、多くの人々がそれを試して同意しました。たとえ話ができれば、考古学者は細かい部分が重要であり、理解する必要があるため、手工具やブラシを使用します。私が知っている唯一のプロファイラーはZoomです。試してみると、理解に集中しているため、まだかなり異なることがわかります。ここで使用する方法です
Mike Dunlavey、2011

@Mike Dunlavey:「試して同意した」?それは何ですか?サンプリング?プロファイリング?あるいは、「もしサンプリング/プロファイリングが時間の浪費になりかねない場合...」という3番目の選択肢は何ですか?プロファイリングは機能していると言いますか?またはプロファイリングには特別なツールが必要ですか?
S.Lott、2009

1

私は最適化に精通しています。私は他の人のプログラムを別の目で見ています-これが私の見解です:

通常、マイクロ最適化は次の説明では価値がないと見なされます。プログラムを1パーセント未満高速化する可能性がありますが、その小さなブーストを気にする人はいません。

面白いのは、そのような変更の1つが99%につながることです。このような10の変更により、プログラムが著しく高速になります。多くのエンジニアにとって、プログラムの記述方法を変更すると、プログラムの実行が数倍速くなる場合があります。効率性を認識し、そのように書くだけで、追加の作業をせずにプログラムを数倍速くすることができます。そのような利益は、マイクロ最適化ではありません、imo。

注:このディスカッションでは、状況に応じて隅々まで最適化を提案することはありません。

さらに、1秒間に1000回起動し、非常に高速に終了するイベントハンドラが存在する可能性があります。それがどれほど速いかは誰も気にしません-それがすでに「観察できるほど速い」ので、それを速くすることは注目に値しません。

また、1kHzは多くの場合に必要とされるよりもはるかに高いため、すでに必要以上の作業を行っている可能性があります。このイベントハンドラーのソースは何で、その効果は何ですか。それが単にUIを更新していて、イベントが収集されて合体する可能性がある場合、1kHzのディスパッチは確かに過剰です(1%よりはるかに多く、25倍以上)。複数のソースを持ち、シリアルで送信されるシステムの場合、1kHzは十分に速くない場合があります(例:MIDI)。

ただし、モバイルデバイスではエネルギー消費が重要な要素です。同じイベントハンドラーを10%速く実行するように最適化すると、消費されるエネルギーが少なくなり、バッテリー寿命が長くなり、デバイスの動作時間が長くなります。モバイルデバイスに関する後者の判断はどの程度正確ですか?それを確認または反証する実際の例はありますか?

私が見たプログラムに基づいて、プログラムを書くためのあなたのアプローチを変えることが信じられないほどの利益を生み出すことができても(> 10倍以上)、そのような最適化を検討(または懸念)する人はそれほど多くありません。(アプリ開発側で)私が見た多くは、書き込みを行ってから、パフォーマンスの問題が追いついたら(/ ifの場合)トップダウンまたは「メアリー」アプローチを採用します。同様に、多くの人はそのような事態が発生するまで時間をかけてプロファイルを作成することすらしません。そのときまでに、非常に多くの複合的な非効率性のノイズにより、プロファイラーから有用な情報を取得することが非常に困難になります。ヘイルメアリーアプローチの例は、間違った領域を最適化する(問題領域を探すかどうかにかかわらず)、または問題領域にさらにコアを投げるだけです。これは、既存の非効率性を修正するのではなく行われます。

(私が見たモバイルプログラムの中で)典型的な既存のプログラムの場合、最適化はそれが書かれたときに大きな問題ではありませんでした。したがって、予算内であり、優先度が高い場合は、「はい」の場合(通常の場合)は時間の価値があります。その場合、プログラムを著しく高速にするこれらの10の変更は、数時間で1日未満で実行できる可能性があります。

プログラムを改善するための唯一のアクションはひどい考えなので、「遅延してプロファイルを振り返って書く」というのはひどい考えです。効率的なプログラムの記述方法を(時間をかけて、最後に一緒にテーピングするのではなく)書くことは優れています。アプローチ(imo); 適切なアルゴリズムを使用し、無駄なコピー、割り当て、計算を禁止します(+多く、他の多くのカテゴリ)。もちろん、レトロスペクティブでパフォーマンスを分析することにはメリットがありますが、プログラムを最初から効率的に書くと、多くのことを学び、複数の観点から実行を検討および評価するため、まったく新しいレベルの効率になります。

もう1つは、プログラムは(多くの場合)再利用のために作成する必要があることです。不十分に作成されたプログラムは、非効率性が取り除かれたときにクライアントのプログラムを破壊する可能性のある変更を導入します(または既存のプログラムの破壊を避けるために非効率なままです)。

書くときにそれを考慮することの1つの大きな利点は、プログラムがどのように動作するかを完全に理解していることです(完全な図ではありません)。この情報を使用して、インターフェースの設計とデータの格納方法を支援できます。 。真実は、エンジニア、OSで提供される標準の「1つのサイズですべてに適合する」ソリューションよりも数倍(たとえば> 10倍)速いものを実装できることです。

最後に、モバイルデバイスを超えた価値もあります。ハードウェアは2年間で速くなるという考えで書かれた非効率的なプログラムが世の中にたくさんあります(今日書かれたプログラムであっても、根拠は頻繁です!)。それは不正確ではありません、楽観的すぎます。同様に、並列化には目的がありますが、それは多くのプログラムにとって間違った「デフォルトの解決策」です。これらの既存のプログラムの多くは、最初に既存の非効率性を取り除くことで最も改善できます。

ですから...現実の世界では、通常、1%、2%、7%(およびさらに悪い)のケースが大量にあります。それらを修正するか、または(より重要なことに)そもそもそれらを記述/公開しないことは、大きな利点を提供できます。これらのケースの多くは簡単に特定して修正できます(エンジニアがこれにある程度の経験がある場合)。しかし、事実を修正して再テストするのは本当に大変です。プログラムが最適化されている場合、理想的には最初からそのように記述されます。

エンドユーザーとして、低速のプログラムを継続的に待機し、低速/非効率的なプログラムによって発生する問題に対して2倍のハードウェアを投入するのはイライラします。A:「ソフトウェアをアップグレードする前の応答性と生産性を取り戻す-それだけです。」開発者(imho)をまったく考慮していません。


1
それを完璧にするために時間をかけることは、一部にとって素晴らしい贅沢です。私が知っていたある会社は、ビジネスからの脱却に向けてマイクロ最適化を行いました。彼らの競合製品はあらゆる点で劣っており、速度が遅く、頻繁に再充電する必要がありましたが、ユーザーが支払う準備ができた価格で購入することは可能でした....
mattnz '21

@mattnzは公正な例です(+1)。記録のために、私は完璧なプログラムの主張をしていません。私の投稿では、優れたデザインを強調し、通常よりもパフォーマンスを考慮しています。コストの防御:簡単に再利用できるコンポーネントで適切に機能する適切に記述されたプログラムと、寿命が比較的短くなる貧弱で非効率的な設計との間でバランスをとることができます。メンテナンスコストを考慮し、各設計の長所と短所を認識する必要があります。(続き)
2011

(続き)優れた実装は再利用可能であり、寿命が長い傾向がありますが、不十分に書かれたプログラムはすぐに陳腐化に直面し、多くの場合、高い保守コスト(デバッグ、チューニング、再書き込み、出荷前後の再テストなど)を必要とします。不十分に書かれたプログラムは、多くの場合、長期的には開発時間/リソースの大きな無駄になります。
ジャスティン2009

1

マイクロ最適化に煩わされるべきではない理由は、それらがマイクロ最適化であるためです。全体像を見て、マイクロ最適化に時間を費やす代わりに、実際の改善の理由を見つけてください。

私の経験則では、速度を考慮せずに作成されたが、まったく愚かではないコードは、多くの努力で10倍速くできるということです。マイクロ最適化による10%は、私が気にするものではありません。あなたはそれよりもはるかに大きな節約を、少ない労力で行うことができると確信しています。

一方、ここ数年の商用製品では、私にとっての「最適化」は、ほとんどの場合、コードを無駄にするのではなく、無駄にするコードを見つけることでした。最適化よりも非悲観化。

(一方、一部の人々は、時期尚早な最適化は悪であると脳に突き刺しているため、何かを行う方法Aと効率の悪い方法Bがある場合、Aは「時期尚早の最適化」であるため、Bを選択します。 。一部の人々はただ愚かです)。

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