PHPはエコじゃない? 113
ストーリー by hylom
開発・保守サイクルまで入れるとどうなるんだろう 部門より
開発・保守サイクルまで入れるとどうなるんだろう 部門より
あるAnonymous Coward 曰く、
FacebookではPHPを使いユーザデータを生成しているが、これをC++に換えれば大規模な省エネを実現できるとの試算があるそうだ(本家/.記事より)。
Facebookのサーバーパークでは30,000のサーバーが稼働しているそうだが、例えばこのうち25,000でPHPが走っているとして、C++の方が10倍効率がよいと考えれば22,500のサーバーが不要になるという計算だ。これは49,000トンのCO2削減を実現できるということでもあるという。
Facebookのみならず、PHPインタプリタが走っている世界中のサーバー数を考えると、環境への影響は小さいとは言えないそうだ。
前からわかってますよ (スコア:5, すばらしい洞察)
だから、富豪的プログラミングって言ってるじゃない
富豪(-1, オフトピック) (スコア:1)
富豪と聞いてなぜか松下幸之助 [php.co.jp]が頭に浮かびました。
# 後ろの方のPはprosperityですよね。
この手のエコ活動が先鋭化した果てに (スコア:5, おもしろおかしい)
Cシェパードが登場するのですね。
Re:この手のエコ活動が先鋭化した果てに (スコア:2, おもしろおかしい)
電源コード、ネットワークケーブル抜こうとしたり。
かなりイヤかもw
Re:この手のエコ活動が先鋭化した果てに (スコア:5, おもしろおかしい)
hogeを妨害するのです。
日本の伝統文化変数名が危機に・・・
Re:この手のエコ活動が先鋭化した果てに (スコア:5, おもしろおかしい)
「彼らは調査用と称していますが実際に運用されています!」
Re:この手のエコ活動が先鋭化した果てに (スコア:1, おもしろおかしい)
そうだというなら (スコア:5, すばらしい洞察)
ここで,PHPなど使わずにC++で書き直せ!と考えるか,PHPをもっと最適化しよう!と考えるか?が一つの分かれ目なのだけど,PHPは,プログラマのコストを大幅に削減していると言えるのだから,やはり,後者がGeekのあるべき姿なのではないか.
Re:そうだというなら (スコア:1, 興味深い)
プログラマのコストを大幅に削減って、
プログラマ個人の負担を少なくしているって意味なのか、
単価の低いプログラマで開発させられるって意味なのか。
後者には全面的に同意なんだけど、前者はどうなんでしょう。
個人的にはPHPの開発やっててJavaやC#のような強い型付け言語
と比べて楽だと感じられないんですよね。
例外機能が弱いとかGenericsが無いとか言語機能も貧弱に感じるし。
プログラマのコストを下げてる点ってどこらへんなんでしょ。
むしろC++でもWebソリューションを開発しやすい
プラットフォーム(ASP.NETのような)を作るほうが素敵に思える。
ごめんなさい。
これが20年前なら… (スコア:3, 興味深い)
20年前ならどちらが速い(実効速度ね)で、 インタプリタ vs コンパイラ、 アセンブラ vs コンパイラ、 の怒号が飛び交っていたもんだが。
そうですか、今は CO2 で測るんですか。
Re:これが20年前なら… (スコア:2, すばらしい洞察)
そもそも、「~トンのCO2」ってのが胡散臭い。ジュールでいいだろ、と思う。「~トンのCO2」という表現の一番の問題は、多いのか少ないのかよくわからない事。
例えば36kWhとか130MJとかの表記なら量がわかるけど、20kgのCO2だなんて表記ではよくわからん。あえてわかりにくくしているんだろうと邪推している。
#上記は、50W×24時間×30日の例。22円/kWhなら電気代は800円。
元記事では、最初のあたりで係数を掛けて
> In the USA, an average of 560 grams CO2 is emitted per generated Killo Watt hour
CO2に換算して計算しているけど、最後までジュールでいいだろ。
Facebookでは中間コードを使わないのだろうか (スコア:2)
インタプリタをバカにしてはいけない。
Re:Facebookでは中間コードを使わないのだろうか (スコア:3, 興味深い)
コードキャッシュや事前パーシングぐらいじゃ
実行速度の向上率は精々300%ぐらい。大したことないよ。
http://php.y-110.net/wiki/index.php?PHP%A1%A7eAccelerator%20%A4%C7%20P... [y-110.net]
インタプリタをバカにしてはいけない、というなら
せめてネイティブコードへのJITコンパイルぐらいしてくれないと。
でもそこまでやっても結局、非コンパイル型の動的言語って全部遅いんだよ。
結局変数をスタックに置くのと、ヒープに置くのじゃメモリアクセスが
最低一回分違うわけで、このペナルティはスクリプト言語である以上回避できない問題だ。
あと、特にPHPはrequire周りとOOP機能を使った時のパフォーマンスが悪い(実感として)。
.NET VMで動くC#ですらPHPに対して完全勝利してるんだから、
PHPでいくら頑張っても最適化処理をちゃんとやったC++の足もとにも及ばない。
もちろん、PHP開発にはPHP開発の利点があるのは事実だが、Facebookほどに
利用者数が膨れ上がったシステムを全部PHPで済まそうってのは
非エコって言われてもしょうがないと思う。
ただ、PHPとC++を併用とか大変だから、C#+ASP.NETみたいな
両方の良さを兼ね備えた素敵フレームワークが生まれたんだろうね。
ごめんなさい。
なにが最適? (スコア:2, 参考になる)
だからこそPHPでよりCでの方が効率が良い物に対してPECLというライブラリがあるわけで
DB接続に関しても各DB関数のラッパーのPEAR::DBやPEAR::MDB2ではなくて処理的効率が良いPDOがあるわけで・・・・
それにしてもコンパイル型言語の方がそりゃインタプリタ型の言語より処理効率がいいのは分かり切っていることだけど
CやC++で処理書いてサーバと同じクローン環境(基本的には本サーバと同じバージョンのライブラリなど)を作ってと考えると開発が非効率。
その点Perl/PHPなどのスクリプト言語だとWindows環境でもテスト環境は構築できるから開発環境とテスト環境を同じにすることはできる。(ただしパーミッションやファイルロックなどはWindows系だとテストしきれない)
でそこでJavaって話がでてくるわけで。
Re:なにが最適? (スコア:1)
CやC++で処理書いてサーバと同じクローン環境(基本的には本サーバと同じバージョンのライブラリなど)を作ってと考えると開発が非効率。
VMwareでも使えば解決できそうだけど。
Re:なにが最適? (スコア:1)
そんな速度的に限界がある仮想環境でコンパイル?どっちにしても非効率。
VMwareも完全仮想化じゃなくて準仮想化を使えば十分な速度が得られると思うよ。
Windows上のスクリプト言語での開発でOKという前提 [srad.jp]であれば、完全仮想化でも十分だと思うけどね。
さらに今更ネタになると思うがサーバサイドがx86とは限らない。
メインフレーム系は昔から仮想化をサポートしているし、UNIX系でもAIXのLPARとかSolarisコンテナとかもあるよ。十分検討に値すると思うけどな。
まあ、小規模システムを単独で開発する場合にはメリットは出にくいわけだけど。
「エコ」って使うの止めませんか? (スコア:2, すばらしい洞察)
個人的にも嫌いだし意味が解らないんですよ。「省エネルギー」「エネルギーの節約」でいい
じゃないですか?
21インチで消費電力100W以下から、50インチ以上の大型テレビに買い換えても、エコポイント
が付いたり。公共交通機関を使って自家用車を所有していない人には付かないエコポイントが、
ハイブリッドカーを買った人には付いたり。エコ灯油やそのほかエコ○○と称している、何が
エコなんだか解らない商品にもゲンナリします。
エコはみんなが適当に使ったせいで言葉として腐敗してしまったと思います。出来れば使わな
い方がいいですよ。
Re:「エコ」って使うの止めませんか? (スコア:1)
IDカードがエロカードに見えるようなもんですか。
「PHPはエコじゃない」………と (スコア:2, おもしろおかしい)
PHP研究所が出版したら吹くぞ
まあ、こんな本 [php.co.jp]やこんな本 [amazon.co.jp]をPHP研究所から出るとは松下幸之助も予想しなかったに違いない。
PHPの保守コストは安くない気がする (スコア:2, 興味深い)
ただ、プログラマによって書き方がバラバラなので、保守を引き継いだ人は
えらい大変な目にあうような…
オープンソースと商用のデュアルライセンスのアプリを一時期使うことがあったけど、
「よく金を取る気になるなー」ってコードが満載で、会社でまともに使えるまでには
相当のデバッグが必要だった。
フィードバックしてもぜんぜん反映してくれないし、さっさと見切りをつけて、
Javaあたりで書き直した方が早いって思った。
#会社で導入したので、そうは行かなかったけど
コーディング規約で固めてプログラマの差異を無くせば保守コストは下がると思うけど、
規約でガチガチに固めているならどの言語でも開発コストはさほど変わらないような…
10倍? (スコア:1)
プログラミング分野に関わったことがないのでエロい人に教えてほしいのだが、
> C++の方が10倍効率がよいと考えれば
という仮定は妥当なの?
Re:10倍? (スコア:2, 興味深い)
だけど普通ボトルネックになるのはCPUではなくIOなので、webサーバーには効果あるけど
DBがひっかかって純粋に1/30にはならないと思う
Re:10倍? (スコア:2, 興味深い)
php_jsonというモジュールに置き換えたら、90秒以上かかってい
た処理が、1秒以内で終わるようになった。
私は、phpは詳しくないので、JSON.phpを書いたプログラマが
どのレベルか分かりませんが、IOがない処理だとそういうことも
あるということで。
Re:10倍? (スコア:1, 興味深い)
しかし、C++よりCの方が2~5倍くらい効率がいいかもしれない。
アセンブラで書けばさらに効率がいいってことにもなりかねないような。
一方で、C++、C、アセンブラの順で開発効率が落ちるわけで、効率が落ちた分の
損失も含めて議論しないとなんないですね。
Re:10倍? (スコア:1)
PHPで配列にデータを読み込んだら読んだデータの10倍くらいのメモリ消費になったのでだいたい合ってると思う。
# 記事の方、CPU効率だなんて言ってないよね?
Re:10倍? (スコア:1)
それを明示的に書くか自動的にやってもらうかの違いでしかなく
実用上それほどの差があるともおもえない。
Re:10倍? (スコア:3, 興味深い)
いや、たとえば var a = [100000]; とかやったとき、800000バイトの記憶領域を確保せざるをえないのよ。インタプリタは配列がバイト値の格納にしか使われないかどうか判断することができないから。HTML5 Canvasとかバリバリ使うスクリプトで、画像データをJavaScriptで丸抱えする必要があるときにはクリティカルに効いてくる。
問題解消のためにByteArrayを導入しようとしたけど失敗したというのが先日のストーリー [srad.jp]。仕方がないのでCanvasではCanvasPixelArrayという専用の型を定義して、実装がメモリを節約できるようにしている。少なくともFirefoxの実装では今のところ単なるJavaScriptの配列になるだけなので意味がないけど。
Re:10倍? (スコア:1)
作成コストが100倍かかるのは事実だよ。
Re:10倍? (スコア:1, 興味深い)
ずばりPHPコンパイラの出番でしょう。
Re:10倍? (スコア:1)
しかしながら、Webシステムなどで頑張ってるのはDBエンジンなので、C使おうがperl使おうがそんなに差は出ない。
そういう性能的な要求が出る部分だけ、メッセージングミドルウェアとかを使ってサービスとして分離するのが良いと思う。
Re:10倍? (スコア:3, 参考になる)
Computer Language Benchmarks Game [debian.org]
縦軸が実行に要した時間、横軸が同じアルゴリズムを記述するのに要したコードサイズになっています。
やはり、まだ静的にコンパイルするCとかが速いが、Java VM など最近の JIT コンパイルも強力。
関数型言語や Lisp が意外に頑張ってる。
JavaScript, PHP, Python など LL 言語は似たような特性だが、Ruby はもう少し頑張って下さいってところだろうか。
Re:10倍? (スコア:3, おもしろおかしい)
サービスという面で考えれば、そういう技術的な部分に
話を進めるよりも、もっと先にコンテンツ面の改善で
サーバーへのレスポンスが減るような仕組みを考えたほうが
実は良かったりするんじゃないだろうか。
コードの改善で実行速度を200%改善する難しさよりも、
同じページを2倍長く見る(=単位時間あたりのリクエストが1/2)
ようなコンテンツを作るほうが難易度って低いのじゃないかと技術屋は思ってしまう。
--以下ネタ
Facebookってようはmixiなんでしょ。
好きなマイミクのエッチな写真とか念視できるサービスがあれば
10分ぐらい同じ画面見続けると思うよ。主に夜に。
ごめんなさい。
ネットワークは保つかな (スコア:1)
Re:ネットワークは保つかな (スコア:1)
PHPにもコンパイラぐらいあるでしょ? (スコア:1)
Re:PHPにもコンパイラぐらいあるでしょ? (スコア:3, 参考になる)
まあ、あるといえばあるらしいんだけど、
http://www.roadsend.com/home/index.php?pageID=compiler [roadsend.com]
PHPってif文の中でrequireできてしまう言語だから
変数を全部ヒープに置かなきゃいけなくなるだろうし、
arrayは配列ではなくてハッシュになってしまうわけで、
結局Zend Engine的なものを持たなきゃいけなくなるだろうから、
やはり限界はあると思う。
上のroadsendも
http://sspp2nd.blogspot.com/2006/12/roadsend-compiler-for-php.html [blogspot.com]
によると実行速度3倍程度らしいから、eAcceralatorとかより
多少マシ、ぐらいじゃない。
本家のベンチマークも思ったより速くない。↓
http://www.roadsend.com/home/index.php?pageID=benchmarks [roadsend.com]
結局、実行時のパフォーマンスでいえば静的型付言語には
動的型付言語じゃかなわんと思われ。
ごめんなさい。
Re:PHPにもコンパイラぐらいあるでしょ? (スコア:1)
1週間の処理が5日ほどで終わって嬉しかったなぁ。
「コンパイラがあればこんなこと」と思ったけど、Zendの買う金がなくて (- -);
Optimizing PHP のコンパイラなんがでるといいんだけど。え、あるのかな。
--
case文より ifのふるいの方が早かった。
Re:PHPにもコンパイラぐらいあるでしょ? (スコア:2)
BASICインタプリタでBASICコンパイラを作るのでは?
え違うの?
Re:PHPにもコンパイラぐらいあるでしょ? (スコア:1)
そのコンパイラーをそのコンパイラーにかければ、
コンパイラーもネイティブで動く?
PHPでPHPのコンパイラーを作っている人っているのでしょうか?
#質問ばかりですみません。
Re:PHPにもコンパイラぐらいあるでしょ? (スコア:2)
ディスクからのファイル入出力処理の部分はインタプリタ実行のままでゲームのメイン処理やレイトレーシングの単精度実数計算みたいなループ処理だけをコンパイル実行で高速化するという「おいしいとこ取り」ができるのだ!すてらのばぼーん!
まあ制限があるといえばあるがMSX使ってる時点でなにをおっしゃるウサギさん。
本題に戻るとC言語、C++あたりってCGIやらWebサーバーに必須な文字列周りに使うには貧弱、とゆーかコーダーの技術が低いと簡単にセキュリティーホールになるんでないかな?
C++でガチガチにクラスで縛れば、とはいっても役に立つクラス設計をしようとするとそれ自体高度な技術になるし。
昔はPerl、今はPHPなのも「文字列扱うときに便利だし乱暴に扱ってもこけないよ」ってのがあるからでは、と推測する。
+=======------
| K.Hamaura a.k.a. SeyfertSluw
| 「SFはどこまで実現するか」 復刊希望は→http://www.fukkan.com/vote.php3?no=4901
Ajaxとか (スコア:1)
Facebookについては全く知らないので的外れかもしれないけど、ここまでAjaxについて言及ないですね。
Ajaxを使うことでブラウザ側に一部の負荷を移すことができますよね。大規模なWebシステムでは必須じゃないかと思ってます。Facebookも使ってるらしい。
じゃあ、Ajaxなリクエストに対してPHPで応答するアドバンテージってどれほどあるんでしょ? そこはC++でいいんじゃない、と言うなら納得できるんですが。
日本で言うと…2ch? あれってAjaxとは無縁ですよね。datとかあるけど…。
Re:Ajaxとか (スコア:1, おもしろおかしい)
Ajaxでクライアント側に負荷を移したんならサーバは軽くなるわけで、それならなおPHPでいいじゃん。
Re:稼動時の排出だけじゃなくて (スコア:3, すばらしい洞察)
サーバが1台の環境だったら、運用より開発のほうがCO2をたくさん出しそう・・
Re:稼動時の排出だけじゃなくて (スコア:1)
Re:稼動時の排出だけじゃなくて (スコア:1, 興味深い)
コードを書くようなオタク達はFacebookを書き直す件がなくてもマシンを動かしてコードを書くだろうし、
コーヒーやぬるいコーラや冷たいピザを手放すこともないので、その要素を計算に入れるのはおかしい。
殺すつもりはありませんでした (スコア:1)
80万人が死んだのです。私は無罪です。」
Re:稼動時の排出だけじゃなくて (スコア:1)
Re:稼動時の排出だけじゃなくて (スコア:1)
そもそも間違っているんじゃないかとホンキで思う。
Re:PHPのせいじゃない (スコア:2, すばらしい洞察)
それだけWebの世界ではでPHPが使われてる、ってことじゃないの?
Re:HTMLはエコじゃない (スコア:1, 興味深い)
> そもそもHTMLがコードとデータを一緒に扱っているのが問題だと思います。
そんなあなたにActiveX!
あれ?