
プログラムをはじめたばかりの初心者なので見当違いな事を質問していたらすみません。
他人のコードを見ていた時に以下のようなコードがありました。
if( pathinfo($file,PATHINFO_EXTENSION)=="txt" ||
pathinfo($file,PATHINFO_EXTENSION)=="php" ||
pathinfo($file,PATHINFO_EXTENSION)=="csv"){
処理.....
}
※実際は条件でのpathinfo部分がもっと長いです。
で、気になったのがこれだと条件チェックする際に毎回pathinfoが呼ばれるのでは?
というところです。
条件前に
$hoge = pathinfo($file);
としておき
if($hoge['extension'] == 'txt' || $hoge['extension'] == 'php')
などと記述した方が、pathinfoの呼び出しは一回のため速度的にも見た目的にも
いいのではないでしょうか?
気になったので
echo で pathinfo($file,PATHINFO_EXTENSION)を連続で出力するメソッドと
配列に格納した上で $hoge['extension']を連続出力するメソッドのtimeを測定してみたところ
メッソド呼び出しを毎回行う方が高速になりました。
(高速といってもたいしたことありませんが)
個人的には配列に入れた方が早い気がしていたのですが
この考え自体が間違った考えなのでしょう?
基本を知らないので検討違いな事言っていたらご指摘いただければ幸いです。
現在プログラムを勉強中なのですが、こんな事どーでもいいのかもしれませんが
なんとなく気になったので質問させて頂いた次第です。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> メソッド呼び出しを毎回行う方が高速になりました。
phpに限らず、あらゆる言語処理系は、ソースコードを逐一解釈するわけでなく、ラインタイムライブラリへで動作させる内部コードへのの変換において、「ロジックの先読み」などの最適化処理を行います。
また実行時も、プロセスキャッシュのような機能を使い、高速化を意識しています。
そのため、配列などへのインラインアクセスより、組込オブジェクトによるアクセスのほうが高速であるのは、javaやC#のようなコンパイラ処理系ではよくある話です。
phpのようなインタプリタ処理系では、このあたりの能力がかなり落ちるのですが、そのベンチマークが正しいとすると、zendの実行エンジンも結構頑張っていると言えるのでは。
No.2
- 回答日時:
> などと記述した方が、pathinfoの呼び出しは一回のため速度的にも
> 見た目的にもいいのではないでしょうか?
おおむねそうだと思います。確かにあなたのようにpathinfoを一度だけ呼びその結果を変数に格納したものを使いまわす方がよりよい書き方だとは思います。ただ処理速度に困っていて極限まで速くする必要があるという場合でもない限りはそれほどこだわる必要はないかもしれません。
よりよい書き方にこだわるのなら…、pathinfoの呼び出しを1回にしても拡張子の判定で結局何度も比較を行うのではそこも冗長だと思います。さらに、比較する拡張子が2つだったり3つになったりもっと増えたりと増減する場合や、小文字だけしか許さないようになっているが大文字でも動くようにする場合などを考慮すると、以下のようにした方がスマートだと思います。
if (preg_match('/^(txt|php|csv)$/i', $hoge['extension'])) {
No.1
- 回答日時:
>> pathinfoの呼び出しは一回のため速度的にも見た目的にもいいのではないでしょうか?
その通りです。
>> メッソド呼び出しを毎回行う方が高速になりました。
測定ミスな気が…
まずこれならば「==」ではなく「===」を用いたほうがごく僅かですが速くなります。速さ云々じゃなくて「==」「!=」は曖昧さが嫌いなので私は「===」「!==」を使って書くように一貫していますね。
if (pathinfo($file,PATHINFO_EXTENSION)==="txt" ||
pathinfo($file,PATHINFO_EXTENSION)==="php" ||
pathinfo($file,PATHINFO_EXTENSION)==="csv") { ... }
これでもかなり冗長なので私なら間違いなく以下のように書くと思います。第3引数のTrue指定は「==」ではなく「===」を比較に使用するという意味です。
$ext = pathinfo($file, PATHINFO_EXTENSION);
$list = array("txt", "php", "csv");
if (in_array($ext, $list, true)) { ... }
更に極限まで高速化するならば、in_arrayではなくissetを使えるように書くといいでしょう。前者の速度は O(n) ですが、後者の速度は O(1) です。実質的にはほとんど差が無い上にコード自体は書きにくくなるので先ほどのin_arrayの例で十分だと思いますが…(笑
$ext = pathinfo($file, PATHINFO_EXTENSION);
$hash = array("txt" => "", "php" => "", "csv" => "");
if (isset($hash[$ext])) { ... }
あ、複数ファイルに対してこれを行う場合は $list とか $hash の生成を1回だけにしておくのは当然の配慮ですね。ループの外側に持ってくるだけでもいいし、場合によってはstatic変数として宣言するのもありだと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- デスクトップパソコン インストール方法 1 2022/05/03 10:25
- PHP PHP MySql ページング 2 2022/09/20 06:38
- 借金・自己破産・債務整理 教えて!「債務不履行!ついに裁判所から呼出状!本人訴訟で期日の先送りは可能か!?」 5 2022/10/14 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つの画像ファイルが異なるファ...
-
PHPでFilename cannot be empty...
-
stat failed
-
phpをオフラインで動かしたい
-
phpでお問い合わせフォームを作...
-
初めまして、
-
ファイルシステム関数関係
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
引数を正しく読み込む方法
-
session_startでクッキー範囲を...
-
プログラミング作業効率を上げ...
-
microSDの装着による連続待受時...
-
Content-Typeが機能していない?
-
PHPを
-
ファイル(PDF・エクセル・ワー...
-
ブラウザのページキャッシュ機...
-
写真をアップロードできるスク...
-
「クラウドにアップロード」」...
-
HTML文をなんとか隠蔽したいの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPでの別のサーバーのテキスト...
-
2つの画像ファイルが異なるファ...
-
register_globalsについて
-
shift-jisでfgetcsv
-
phpのftp_get()でエラーが出ます。
-
PHPでFilename cannot be empty...
-
独自INIファイルの操作をしたい...
-
ファイルの行数取得
-
XMLのロードに失敗する
-
別のサーバにあるファイルの存...
-
ファイル指定
-
ファイルについて・・・。
-
画像ファイルの添付
-
Zend Framework で大きなファイ...
-
stdinからの処理でメール情報を...
-
AS3外部テキスト読み込み
-
PHPでAPI 出力はCSVを取得する...
-
ファイル名は、数字の「0」(...
-
PHPでテキストファイルかどうか...
-
ファイルの内容の削除【ファイ...
おすすめ情報