実行されない実行分岐のコード量におけるパフォーマンスの違い
質問内容が変わったので、見解を書きます。
PHPとJavascriptどちらもそうですが
スクリプト言語は実行時コンパイルされます。
ということは
ファイルを読み込み、字句解析をし、正しいPHPコードだと判断後機械語に翻訳され、実行されます。
極端な例を考えると分かりやすいです。
ファイルサイズ1KBのソースコードとファイルサイズ100MBのソースコードを比べた場合、
どちらが読み込み速度は速いでしょうか。
また、どちらがコンパイルビルドにかかる時間が長いでしょうか。
100MBですよね。
つまり、if else でelseが実行されないから読み込まれないのではなく、ファイル全体を読み込んでコンパイルした内容をメモリに保持しているので、ifを実行しようがelseを実行しようがメモリ内のプログラムを実行するだけです。
読込み速度は変わりません。
もちろんifの内容を実行するのに10秒かかる重たい処理が書かれていて
elseの内容は0.1秒で終わる処理が書かれていれば実行時間が軽いのはelseのほうです。
まとめると
- 実行時コンパイルにかかるDisk Readおよび字句解析、ビルドはコード量とファイルサイズに影響します。
- ビルドされたコードの分岐はそれぞれのプログラムの内容によって実行速度は変わります。
###以下 旧回答
パフォーマンスを常に意識しているということはとても素晴らしいことだと思います。
インラインにて見解を書いていきますね。
主にPHP、JavaScriptについてですが
主に仕事で使う社内用プログラムは、時間が経つにつれ、機能を増やしたくなり、それに伴いソースコードが増えてしまいます。
機能が増えれば実装が増えますね。正しい認識です。
特にPHPだと、ソースコードが増えると比例してページの表示スピードが遅くなるのが目に見えて分かります。
このような場合、if構文で条件分岐して、なるべく表示されるwebページで実行される処理は少なくなるようにしています。
該当するURLによって実行されるコード量が増えればその分実行コストはかかりますが、目に見えて遅くなるというのはあまり経験がないです。
そのURLに関係のないPHPファイルまですべてrequireしてるのでしょうか。
requireを記述するのではなく
Auto Loaderという仕組みがあり、classにアクセスしたときにそのclassが見つからなければ自動でclassを読み込みにいくことができます。
これにより余計なrequireを意識せずにむだなロードを減らせます。
また、サーバ処理で一番コストがかかるのが、DB接続だと思います。
コードの読み込みの速度を気にされるより、テーブルのIndexの見直しや、SQLの最適化。実行プランの見直しを検討されるといいと思います。
例えば、if構文はfalseの場合、そのブロック内は読み込まれないというテキストを読んだので、なるべくファイルにはアクセスするhttpリクエストを最小限にし、アクセスされるファイルもその1ファイル内に纏まるように書いたり、ソースコードはif文で特定の条件の場合のみプログラムを実行するようにしたり、(表示しているURLによって、処理をするかしないか、またユーザーのアクションによって実行するかしないか、など)しているのですが、実際にはページの読み込み速度にどこまで影響があるか疑問に思ってしまいました。
httpリクエストを最小限というのはこれはPHPの話からJavascriptの話になったのですよね?
他にはファイル毎に何をするファイルなのか、明確にして纏めて書くようにする、などかと思うのですが、このようなケースでは機能は多くてもページ速度が遅くならないためにどのような工夫が有効でしょうか。
ハイパフォーマンスWebサイトという本があります。
https://www.oreilly.co.jp/books/9784873113616/
scriptタグの定義をbodyの閉じタグの前に宣言しろ、とか
cssスプライトを使ってリクエスト回数を減らせ、とか
Webサイトの高速化に必要な基本的なことが書いてあります。
サイトの表示で一番容量を食うのはhtml/css/javascriptなどのテキストのダウンロードではなく、画像、動画、音声、などのバイナリデータです。
動画や音声はそのサイトの特性上大量の通信が発生するのは仕方ないとして
通常のWebサイトにおいても画像は大量に使用されていると思います。
画像は必ず圧縮してください。
jpegはJPEG-min
PNGはtiny-PNGなどのサイトで圧縮可能です。
また、画像は遅延ローディングができます。
画像 Lazy load などで検索してみてください。いくつかライブラリが見つかります。
速度という意味では、例えば管理画面にて、検索するたびにsubmitで画面全体を再描画したり、テーブルのソートを変えるだけで画面全体を読み込みなおしたりすると、速度面でかなりストレスがあります。
データ取得、更新、削除、登録といったCRUDのWebApiを作成しAjaxによりシングルページにて機能を実現するとパフォーマンスが格段に上がります。
一回のif文を気にしたり、一回のrequireを気にするよりも格段に得られる恩恵は多いと思います。
javascriptについては一番コストがかかるのは通信とDOM操作です。
特に中間データや非表示になっているhtmlに対してDOM操作を大量に行った場合と、計算を最低限に抑えた場合で実行速度に数千倍の差が出ます。
※過去に同僚が実装したjavascriptは実行完了までに3分かかり、IEは実効完了を待たずにダイアログを出して停止するということがありました。
300件のデータをjavascriptでフィルタリングするという内容だったのですが
サーバーにて300件の<li>を生成して返し、<li>を操作して複雑なフィルタをかけて不必要な<li>をdisplay:none;にするという実装でした。
開いた口がふさがりませんでした。彼はその実装に1週間費やしました。
jsonで取得してjsonでフィルタするように半日で修正したのですが、1秒もしないで計算が終わるようになりました。
コードの最適化というよりも詳細設計を最適化する恩恵のほうが遥かに大きいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/06 16:28