• ベストアンサー

同機能の、「組み込み関数」と「ユーザ関数」、両者の性能差について。

いつもお世話になっております。 PHP5.2.5 Apache1.3.37 SQLite3.3.7 PHPには、組み込み関数が予め、膨大な数、用意されているという話なので、 実際には、 有用であるけども出会うことのない組み込み関数 というものもあるように思います。 この場合、 そういった組み込み関数と同機能のユーザ関数 を車輪の再開発してしまうことが考えられます。 そこで、私が知りたいことは、 組み込み関数で提供されている機能を、 ユーザ関数で実現する際、 性能を損なわずに(つまり、処理速度面でも同等に)、 ほぼ等価な関数をユーザ関数で作ることはできるのか、 ということです。 よく使用されるお馴染みの関数の多くは、 それ自体、基本的な機能でのみ構成されていると思われるので、 それをユーザ関数で実現するとなると、 私にも、「それは難しそうだな…」と思えますが、 そうではなく、 かなりマニアックな関数、 つまり、 基本的な組み込み関数を複数組み合わせて作られているような、 そんな組み込み関数も、中にはあるわけで、 それらの中には、よく知られておらず、 車輪の再開発されてしまうものも多いと思います。 (再開発自体を回避する策があるのであれば、それも知りたいと思います) PHPの中の構造について詳しくないので、 既に変なことを言っているかもしれませんし、 以下でも、さらに変なことを言うかもしれませんが、 組み込み関数とは、C言語など、PHPではない言語で作られていたりするのでしょうか? (処理速度をあげる、等の理由から) そうであるならば、 ユーザがPHPを操って作るユーザ関数は、出来る限り作らず、 既存の「組み込み関数」を利用したい、と私は考えます。 よって、「知りたいこと」を要約すると、 ・車輪の再開発を防ぐ方法 ・車輪の再開発されたユーザ関数の、組み込み関数との性能差 ・組み込み関数の成り立ち(C言語由来?) こうなります。 組み込み関数を検索する際の、自分の検索能力を鍛えるべきなのか、 車輪の再開発することになることを想定し、その再開発能力を鍛えるべきなのか、 どなたかに、何らかのアドバイスをして頂けると嬉しく思います。 (そもそも、組み込み関数に適当な関数があるかどうかを、皆さんはどのように検索されているのでしょうね…。 私なんかは、リファレンス本をメインに探していたりしますが。) 以上、どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

■車輪の再開発を防ぐ方法 JavaJavax2さんの仰るとおり「よく調べる」しかないのですが、 ・公式のPHPマニュアルをよく読む。 ⇒ありがちなのが配列操作だったりしますが、array_***という名前で大量に関数あります。 また、sort関数の説明のところに「sort() は » Quicksort でそれを実装しています。 」と書いてあったりします。 これで、quicksortのアルゴリズムでソート関数を作るという車輪の再開発は防げますね。 また、公式のPHPマニュアルの関数リファレンスの下部にある、ユーザ投稿部分は凄く参考になるので、目を通してみるのがオススメです。 ・googleですげー調べる ⇒基本中の基本ですが。自分で考えてることなんて、大概誰かが4000年前に通り過ぎてるとおもいつつ、参考になるものが出てくるまで単語組み替えて調べて見るというのが良いと思います。 特に、PHPは、他の言語に比べて誰かが何かを書き残している量が圧倒的に多いと思われます(印象ですが) ・システム作る前に、似たようなシステムのオープンソースとか、ライブラリとか誰かが作った製作物を眺める ⇒人の製作物は、自分が利用したことのない関数とか出てくることがままあります。ソースの流れを読めば何のためにソレを使っているかが大体わかりますしね。 そういった目的でソースを読むときは、php editorがオススメです。PHPの標準ハイライト表示と同じ色分でアサインされている関数名は青い色で表示されます。

march4
質問者

お礼

冒頭を読み、 改めて、ホゲホゲさんは優しい方なのだなぁと、感じました。 では、本題へ。 >ありがちなのが配列操作だったりしますが、array_***という名前で大量に関数あります。 まさに。(笑) 質問の発端は、このあたりにあります。 あまりの鋭さに、ドキっとしました。^^; >ユーザ投稿部分は凄く参考になるので、目を通してみるのがオススメ はい◎ 努力します! 英語と仲良くします。笑 >googleですげー調べる 「すげー」が印象的でした。ほっ、ホゲホゲさんっ…。 >自分で考えてることなんて、大概誰かが4000年前に通り過ぎてるとおもいつつ この考え方、いいですね。笑 なぜか、ラーメンマンが頭に浮かびましたが、とても頷けるお話でした。 >参考になるものが出てくるまで単語組み替えて調べて見るというのが良い はい、目を皿のようにして、すげー探し回るように致します。 >似たようなシステムのオープンソースとか、ライブラリとか誰かが作った製作物を眺める はい、4000年の歴史を紐解いて参ります。 >php editorがオススメです 実は、エディタについても、気になっていたんですよね~。 私は現在、dreamweaverCS3を使っていますが、 php editorの使用経験もあります。 使用経験というより、試用経験ですが。笑 あと、Notepad++というエディタなんかもDLしてみました。 こちらはご存知かもしれませんが、 コーディングスタイルを色々なデザインの中から選べたりして、 なかなか面白いエディタです。 また、ifやwhile等の開始と終了を分かりやすく表示してくれる機能などもあります。 (DWにも、このような機能があれば良いのに…。) というわけで、教えて頂いた通りに、まずはやってみようと思います! どうもありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

PHPのソースはCでかかれています。(元になったPHP/FIはPerlで書かれていたそうですが) ソースはすべて公開されていてLinuxではソースからmakeするのも普通に行われます。 組み込み関数というかモジュールで追加される関数もCで書かれているのでPHPで再開発するよりかなり高速でしょう。 PECLというプロジェクトでPHPに独自の関数をCで追加できます。

march4
質問者

お礼

>ソースはすべて公開されていてLinuxではソースからmakeするのも普通に行われます。 Cの知識があれば、PHPのソースから改変することも可能なわけですね。 Cについての知識は、私には無いので、この辺りの話は全く検討もつきませんが、 ただ単純に、「そんなことができたら、楽しいだろうな」とは思います。 >PHPで再開発するよりかなり高速でしょう。 やはり、そうですよね。 >PECLというプロジェクトでPHPに独自の関数をCで追加 PECL。 この言葉は、しばしば目にしますが、 PEARにすら手を出せていない私には、 PECLとの本格的な出会いは、まだまだ遠い先のことのように 思えております。笑 車輪の再開発を回避するために検索を心掛けようと思っておりますが、 その検索範囲は、 検索に許されている時間と自身の検索能力で決まる値なのだと思います。 検索していくことで、自分の中には無い新鮮な考え方との出会いもあるでしょうし、 また、独りよがりな設計になりがちなのを抑えてくれるといったメリットもあるでしょうから、 ここは謙虚に、検索能力を上げる工夫をしていけたらと思います。 以上、参考になるアドバイスをどうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (742/5654)
回答No.4

「車輪」の意味がわかりませんでしたがなんとなくのイメージで解釈して。 質問者様の考えられている事はいい事だと思います。 知りたい事について要約されている事はですね。 私も同じような事は時々考えるのですが、「再開発しないようにあるものを検索するしかない」と言う考えよりも、「調べる時間と手段が十分でないので自分で作るしかない(自分で作った方が早い)」と言う考えになりがちです。 どれほどに性能を求めるのか、大量データを処理するのかによっては必須条件になってくるかも知れませんが、私が今現在それほどまでに性能を求められた事がないので、自分で作るようにしているわけです。 そう言うわけで、よほどでない限り、「車輪の再開発することになることを想定し、その再開発能力を鍛えるべき」だと私は思います。

march4
質問者

お礼

レスポンス、どうもありがとうございます。 車輪の再開発: 「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまうこと」を意味します。(ソースはwikipedia) そういう「慣用句」を使って質問をさせて頂きましたが、 分かりにくかったとしたら、申し訳ありません。 >「調べる時間と手段が十分でないので自分で作るしかない(自分で作った方が早い)」と言う考えになりがち わかります。笑 検索するより、作ってしまえっ。その方が速いわっ。 と私も思いがちですが、 ただ、頭のどこかで、 「どうもスマートなスタイルではないな…。」 と思えてならないのです。 そこで、このような質問をさせて頂きました。 本質問のような疑問は、 言語問わず、みなさん考えられることだと思いますが、 NO.3の回答を引用させて頂くと、 >特に、PHPは、他の言語に比べて誰かが何かを書き残している量が圧倒的に多いと思われます(印象ですが) こういうご意見がありますから、 PHPに関しては、特に「検索する意味」は大きいのかなと思えます。 >どれほどに性能を求めるのか、 >よほどでない限り、 検索するか、即自作するかの判断は、 自分が作ろうとしているスクリプトの程度次第、ということですかね。 私としては、検索力を上げていきたいな、と考えておりますが、 dell_OKさんが仰るように、探すより作った方が速い!と感じるケースも確かに多々あり、この辺りの判断ではよく悩まされます。 この度は、貴重なご意見をありがとうございました。 また何かありましたら、教えて下さい。 P.S. 余談ですが、私がここで立ち上げました質問自体も、 おそらくは、車輪の再開発になってしまっているのだろうと思います。苦笑

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

読んでたらやたら質問文が長くて質問が多い気がしたな。最後にまとめられてるので今はそう感じないが ・車輪の再開発を防ぐ方法  よく調べるしかないでしょうね。 ・車輪の再開発されたユーザ関数の、組み込み関数との性能差  phpはスクリプト言語ですから当然ネイブ(一部省略)なマシコード(一部省略)にかなうわけがありません。 ・組み込み関数の成り立ち(C言語由来?)  そこまでは知りません。phpのソースコードでも引っ張ってきて覗いてください。phpってソースコード公開してたっけ?・・。しらんがな。

march4
質問者

お礼

こちらでも出没して頂き、ありがとうございます。 >よく調べるしかないでしょうね。 その工夫の仕方など、何かアイデアをお持ちでしたら、是非教えて下さい。(^^ >phpはスクリプト言語ですから当然ネイブ(一部省略)なマシコード(一部省略)にかなうわけがありません。 要するに、組み込み関数の方が性能が高いということですね。 >しらんがな。 どうもありがとうございました。(笑)

全文を見る
すると、全ての回答が全文表示されます。
  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

> 組み込み関数とは、C言語など、PHPではない言語で作られていたりするのでしょうか? > (処理速度をあげる、等の理由から) そうです。 PHPに限らず、スクリプト言語処理系の組み込み関数が 処理速度を上げるためにC/C++で実装されていることは珍しいことではないです。

march4
質問者

お礼

早速の回答をどうもありがとうございます。 ------<質問文を引用>------------------------------------- よって、「知りたいこと」を要約すると、 □車輪の再開発を防ぐ方法 ■車輪の再開発されたユーザ関数の、組み込み関数との性能差 → ★下記項目の回答により、その性能差は「ある」ということで理解します。 ■組み込み関数の成り立ち(C言語由来?)→ ★C/C++で実装 ---------------------------------------------------------- ということは、項目1番目の、 □車輪の再開発を防ぐ方法 これを会得することがいかに重要であるかが、分かりました。 ありがとうございます。 疑問であったことの7割ほどが解決しました。 残り3割です。 それでは、引き続き、 □車輪の再開発を防ぐ方法 こちらに関するアドバイスの募集を続けたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 関数の組み込み。

    PHPでの関数の組み込みの質問です。 自作の関数を集めたPHPファイル"common_function.php"を製作し、 それぞれの処理の頭でこの関数ファイルをinclude_onceを使って 読み込んでいるという形式で処理を行っています。 include_once("../common/common_function.php"); この処理を行わずにこの関数ファイルををデフォルトで読み込む ようにPHPの設定に組みこむ事はできないのでしょうか? よい方法があれば宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP 設定ファイルとユーザ定義関数

    ある機能を満たすためのライブラリ(lib.php)を作成しました。 このlib.phpはユーザ定義関数の寄せ集めです。 それぞれのユーザ定義関数では、設定ファイル(config.php)に記述されている共通変数を利用します。 このconfig.phpなのですが、ユーザ定義関数ごとにincludeする以外の方法はあるでしょうか? lib.php function one() { $hensu1... $hensu2... ...処理; } function two() { $hensu1... ...処理; } .... config.php $hensu1 = 1; $hensu2 = 2; ... という構成です。 function one,function twoでconfig.phpの変数を利用したいのですが、lib.phpの先頭でinclude "config.php"をしてもfunctionの中では変数のスコープが有効にはならず、 lib.php function one() { include "config.php"; ...処理; } function two() { include "config.php"; ...処理; } としています。 PHP5を使用しています。 function one() { global $hensu1... } としたらよいのでしょうか? どなたかアドバイスいただけますと幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • VBAユーザー関数を外部から制御

    ExcelのVBAで、標準モジュールにワークシートで使うユーザー関数を記述しています。 ユーザー関数は、使い勝手を組み込みのワークシート関数と同様にするため、 Application.Volatile (True) で自動再計算するようにしており、数百カ所以上のセルに使用しています。 しかし、他のVBAモジュールでユーザー関数の戻り値が変わるような操作をすると、その都度 数百か所以上が再計算されるため、非常に時間がかかります。 ユーザー関数のApplication.Volatile (False) にすると瞬間で終了する処理が、数分かかる場合も あります。 他のVBAモジュールから、一時的にユーザー関数の処理内容を変更するようなことは可能でしょうか。

  • データベースのユーザ定義関数について

    PHP4.3.1、MySQL4.1.13を使用して、Webアプリケーションを製作しております。 幾つかの参考書籍やこれら情報に関するWebなどを見ていますと、後々データベースが変更になった時を考え、それぞれのデータベース用の関数を利用せずユーザ定義関数で処理した方が良いと書かれていました。 ただ、データーベースの処理と言っても様々な処理があると思いますし、それら全てをユーザ定義関数で置き換えなくてはならないのかな?と疑問(迷い)を感じております。 皆様は、どの様にされていますでしょうか?または、どの様に考えたら良いでしょうか?プログラミングの基本的な事かもしれませんが、どなたかご教授いただけないでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • ユーザ関数の呼び出し方法 その2

    ユーザ関数の呼び出し方法 http://oshiete1.goo.ne.jp/qa3567728.html で、質問をさせて頂いた者です。 お陰様で、だいぶ出来てきました。 frameで左右に分かれています。 「左がメニュー画面」 「右がデータを表示する画面」 メニュー用のPHPに //処理部分 <?php if($_GET["mode"] == 1){ //処理1のスクリプト include("./ee.php"); ads(); } と、しました。 そうすると 左のメニュー画面にデータが表示されてしまいます。 右のデータを表示する画面に更新したい場合 どのように書けば宜しいですか? --------------- <frame name="hidari" src="aa.php"> <frame name="migi" src="ee.php">

    • ベストアンサー
    • PHP
  • PHPの機能制限

    お世話になります 環境はlinux centos6 + php を使っています。 ユーザーにブラウザ上で任意のサーバサイド言語を記述でき、実行できる環境を作ろうと考えています。 ユーザーには悪意のあるユーザーも含まれます。 使用したいものは変数,配列,連想配列、関数はfor,if,foreach,replace系,match系,split,explode 以上のみで他の関数は実行できないようにしたいです php又は他の言語に機能制限みたいなものが存在すれば実現できると思うのですが そのようなものはあるのでしょうか? smarty等のテンプレートエンジンは元々そういう用途のものではないので 思わぬ事故が起きそうでなるべく使用したくありません。 これを実現するには replaceやmatchを駆使してphpの上で動く独自のミニ言語を作る他ないのでしょうか なにか手がかりをご存知の方お教え頂けると嬉しいです。

    • ベストアンサー
    • PHP
  • CPUの違いとクロック数の違いでの性能の差

    現在、CPUの買い替えを検討しているのですが Pentium D3.0GHzとCore 2 Duo E4300 1.8Ghzだと 単純に性能だけを見ると処理能力ではどちらが上なのでしょうか? また、処理速度に不満がある場合CPUを変えるのとメモリを増設 するのはどちらのほうが良いのでしょうか?

  • ユーザ定義関数の引数にクラスのインスタンスを渡すことは可能?

    いつもお世話になっております。 (PHP5.2.5) 質問: ユーザ定義関数の引数に、 「クラスのインスタンス」を渡すことは可能ですか? 例: <?php  //クラスをインスタンス化する。(例:PDOクラス)  $conn = new PDO($dsn,$user,$pass);  //ユーザ定義関数に上記のクラスのインスタンスを与えている  user_func($conn);  //ユーザ定義関数の定義部  function user_func($conn){   $sql = '~SQL文~';   $stmt = $conn->prepare($sql);   :   :処理   :  } ?> 関数に渡すことのできる引数の型について、 なかなか見つけられず、初歩的な質問をしてしまっているかもしれませんが、 どうぞ宜しくお願い致します。        

    • ベストアンサー
    • PHP
  • ユーザ関数function の扱いについて。

    おそらくは、初歩的な質問なのだろうとは思いますが、どうぞよろしくお願い致します。 早速ですが、質問に入ります。(PHP4または5での話です。) //関数を定義 function test($a){   $b = $a*100;   print $b;   return $b; } //テキトーに値を用意して変数に格納 $c = 5; //------------------------ 作った関数を使ってみる //------------------------ //(その1)関数内の処理結果をprintしてくれるものと思って使っている。 test($c); //------------------------- //(その2)関数内の処理結果の戻り値を変数$dで受け、それをprint。 //「その1」との違いを調べたくて、こんなことをしている。 $d = test($c); print $d; //------------------------------- さて、何が言いたいかと言いますと(笑)、 まず、上記(その2)に着目して頂いて、 関数定義の中でprint()を使用している関数に対し、 その定義の中にreturnがあるからと、 $dでその戻り値を受けているわけですが、 この場合、print()で出力した値は、一体、どこへ行ってしまったのでしょうか。 このような質問のしかたをしていますが、 分からないのは、この辺りの処理の流れ全体なんです。 つまり、print()したものがどうなったのかだけが知りたいわけではなく、 ユーザ関数内のprintとreturnの関係とか、そのあたりです。(笑) return; が来たら関数内の処理を抜ける、 ということは分かっています。 以上、1つずつ順を追って説明して頂けると助かります。 //-------------------補足------------ //新たに関数を定義 function test2($a){   $b = $a*100;   print $b; } $e = 5; $f = test2($e); //returnのない関数から戻り値を受け取ろうとしてもダメ //ということは、こんな私にでも分かっています。 //---------------------------- 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • エクセルのユーザーフォームでVLOOKUPと同じ機能をするには?

    エクセルのユーザーフォームで、VLOOKUP関数と同じ機能を持たせるには、どうすればいいですか?マクロ初心者なので、わかりません。  そして、ユーザーフォームで検索したものを別のシートのセルに 反映させる方法も教えて下さい。よろしくお願いします。  たとえば、エクセルで住所、名前等の名簿から、ユーザーフォームで検索し、検索したデータを、年賀状はがき等の作成した様式に反映させるといった感じのもの何ですけど・・・。