Slide 1

Slide 1 text

パフォーマンス最適化

Slide 2

Slide 2 text

最適化についての格言 早すぎる最適化は諸悪の根 源である。 •ドナルド・クヌース

Slide 3

Slide 3 text

最適化についての格言 細かい効率のことは忘れて、時間の97%につ いて考えよう。時期尚早な最適化は諸悪の根 源だ。それでも残り3%についても機会を逃す べきではない • ドナルド・クヌース

Slide 4

Slide 4 text

最適化についての格言 プログラム最適化の第一法則: 最適化するな。 プログラム最適化の第二法則(上級者限定): まだす るな。 • Michael A. Jackson

Slide 5

Slide 5 text

最適化についての格言 個々の操作を特定の順に実行させることは非常に興味深く奇妙な問題である。その上で全てを入力する余裕はない。どの ような計算でもプロセスの遷移のための多種多様な配置が可能であり、様々な考慮の上でそれを選択しなければならない。 基本的な目的は計算を完了するまでの時間を最小にする配置を選択することである • Ada Byron‘s notes on the analytical engine 1842 情報処理における罪の多くは(必ずしも達成されることのない)効率の名においてなされる。そこには盲目の愚かさも含まれ る • W.A. Wulf ボトルネックは思いもよらない場所に存在するので、ボトルネックの箇所を特定するまで性能最適化(ハック)してはいけな い • ロブ・パイク

Slide 6

Slide 6 text

じゃあどうするか 体系的に立ち向 かう

Slide 7

Slide 7 text

じゃあどうするか リファクタリングして同じ処理は2度書かないコード にする 実運用と同じ環境、データ数で速度測定 遅い部分を特定し、そこだけ直す

Slide 8

Slide 8 text

パレートの法則 プログラムの処理に かかる時間の80% はコード全体の20% の部分が占める。

Slide 9

Slide 9 text

そんなこと言っても速度は 大事だから常に気を付け ないと その方法だと遅くなるから 止めろと言ってます 読みにくいコー ドの全体を見て チューニングと かあまり効果が 出ません

Slide 10

Slide 10 text

パフォーマンスの予測 実測せずに予測はできません。 • ロブ・パイクもクヌースも予測できない と言っているのに、誰ができると言った ら信じられるというのか。

Slide 11

Slide 11 text

Q1 以下のどちらが効率的に動くでしょうか?(言語はC#。Javaでも大体同じ。) var str = "あいうえお" + "かきくけこ" + "さしすせそ" + "たちつてと" + "なにぬねの"; var builder = new StringBuilder(); builder.Append("あいうえお"); builder.Append("かきくけこ"); builder.Append("さしすせそ"); builder.Append("たちつてと"); builder.Append("なにぬねの"); var str = builder.ToString();

Slide 12

Slide 12 text

A1 Aが速い

Slide 13

Slide 13 text

Q1 以下のどちらが効率的に動くでしょうか?(言語はC#。Javaでも大体同じ。) var result = ""; foreach (var str in strArray) { result += str; } var builder = new StringBuilder(); foreach (var str in strArray) { builder.Append(str); } var result = builder.ToString();

Slide 14

Slide 14 text

A2 strArray.length <= 7の時はAが速い

Slide 15

Slide 15 text

Q3 文字列を複雑に結合してHTMLを作る速度が速いのはどの言語での実装でしょう? C Java JavaScript

Slide 16

Slide 16 text

A3 Chromeあたりのエンジンを使え ばJavaScriptがCを抜いたそうで す。

Slide 17

Slide 17 text

予測できません