【PHP】質問スレッドpart17【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/17 17:14ID:AT+bUkag・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。
■本家
http://www.php.net/
■日本 PHP ユーザ会
http://www.php.gr.jp/
■PHP マニュアル
http://www.php.net/manual/ja/
■PEAR マニュアル
http://pear.php.net/manual/ja/
過去スレ, 関連スレ等>>2-4
抜けているものがあったら補足願います
0237nobodyさん
04/05/25 15:15ID:???試してみると大分違う。
require_once 'Benchmark/Timer.php';
$leftarrow = '>';
$str1 = $str2 = $str3 = $leftarrow;
$arr1 = $arr2 = $arr3 = array();
for ($i = 0; $i < 2000; ++$i) {
$arr1[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
$arr2[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
$arr3[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
}
$timer =& new Benchmark_Timer();
$timer->start();
$timer->setMarker("Benchmark for 'foreach'");
foreach ($arr1 as $key => $value) {
$arr1[$key] = $str1.$value;
$str1 .= $leftarrow;
}
$timer->setMarker("Benchmark for 'for'");
$max = count($arr2);
for ($i = 0; $i < $max; ++$i) {
$arr2[$i] = $str2.$arr2[$i];
$str2 .= $leftarrow;
}
0238nobodyさん
04/05/25 15:15ID:???$timer->setMarker("Benchmark for 'while--list-each'");
while (list($key, $value) = each($arr3)) {
$arr3[$key] = $str3.$value;
$str3 .= $leftarrow;
}
$timer->stop();
echo $timer->getOutput();
結果
--------------------------------------------------------------
marker time index ex time perct
--------------------------------------------------------------
Start 1085465264.67439000 - 0.00%
--------------------------------------------------------------
'foreach' 1085465264.67453300 0.00014281272888184 0.01%
--------------------------------------------------------------
'for' 1085465264.70273000 0.028197050094604 2.24%
--------------------------------------------------------------
'while--list-each' 1085465265.05475400 0.35202407836914 27.93%
--------------------------------------------------------------
Stop 1085465265.93488100 0.880126953125 69.82%
--------------------------------------------------------------
total - 1.2604908943176
0239nobodyさん
04/05/25 15:19ID:???--------------------------------------------------------------
ずれてたので
marker time index ex time perct
--------------------------------------------------------------
Start 1085465264.67439000 - 0.00%
--------------------------------------------------------------
'foreach' 1085465264.67453300 0.00014281272888184 0.01%
--------------------------------------------------------------
'for' 1085465264.70273000 0.028197050094604 2.24%
--------------------------------------------------------------
'while--list-each' 1085465265.05475400 0.35202407836914 27.93%
--------------------------------------------------------------
Stop 1085465265.93488100 0.880126953125 69.82%
--------------------------------------------------------------
total - 1.2604908943176 100.00%
--------------------------------------------------------------
0240nobodyさん
04/05/25 15:22ID:???02.24% foreach
27.93% for
69.82% while(list() = each())
ってことで、10倍以上の差が出る。
0241nobodyさん
04/05/25 15:26ID:???0243nobodyさん
04/05/25 15:28ID:???ありがとう
0244nobodyさん
04/05/25 15:36ID:???for ($i = 0; $i < $max; ++$i) {
$arr2[$i] = $str2.$arr2[$i];
$str2 .= $leftarrow;
}
の部分だけど、>>199はfor文内でcountを使ってたから
もっと遅くなっていただろうな。
0245nobodyさん
04/05/25 15:39ID:???0246nobodyさん
04/05/25 15:45ID:???0247nobodyさん
04/05/25 15:47ID:???whileやforの条件チェックよりも、foreachの配列チェックの方が早いんだね。
whileはlistかeachのどっちかがボトルネックなのかな
0248nobodyさん
04/05/25 15:57ID:???俺もこれからまめにベンチとってみよう
0249nobodyさん
04/05/25 16:03ID:???<?php
require_once 'Benchmark/Timer.php';
$timer =& new Benchmark_Timer();
$timer->start();
$timer->setMarker("Benchmark for 'for'");
for ($i=0; $i<10000; $i++)
loop_for();
$timer->setMarker("Benchmark for 'forearch'");
for ($i=0; $i<10000; $i++)
loop_foreach();
$timer->stop();
echo $timer->getOutput();
function loop_for()
{
$arr = array('食べ物', '野菜', 'ワイルド系', 'キャベツ');
for ($i=0; $i<count($arr); $i++)
$arr[$i] = str_repeat('>', $i+1).$arr[$i];
unset($arr);
}
function loop_foreach()
{
$slash = "<";
$str = $slash;
$arr = array("食べ物", "野菜", "ワイルド系", "キャベツ");
foreach($arr as $key => $value):
$arr[$key] = $str.$value;
$str .= $slash;
endforeach;
unset($arr);
}
?>
0251nobodyさん
04/05/25 16:18ID:???>※関数を使うプログラムより関数を使わないプログラムの方が優秀である。
一部の香具師によって、否定されていたがある意味正解。
whileはループでは条件判定だけだから
ループ処理では最速なんだろうけど、これが配列になると
キーが関係してくるから結果的に色々な関数を扱わざるおえない。
foreachを使った方がいいって事なんだろう。
whileは、私は代入ぐらいに使おうと思います。
やっぱりfor()は初心者向きだよな。分かりやすいけど。
0252nobodyさん
04/05/25 16:19ID:???foreach 0.07%
for 32.69%
while 25.84%
違うねー
0253nobodyさん
04/05/25 16:21ID:???0254nobodyさん
04/05/25 16:24ID:???0255nobodyさん
04/05/25 16:27ID:???スクリプトじゃない。本物ならこう書くだろう。
0256nobodyさん
04/05/25 16:28ID:???0257nobodyさん
04/05/25 16:28ID:???自分には才能以外の要素は無いんで。
0259nobodyさん
04/05/25 16:30ID:???0262nobodyさん
04/05/25 16:36ID:???0263240
04/05/25 16:38ID:???ん、こっちは、
PHP 5.0.0RC3-dev (cli)
で試したんでそのせいだった。
改めて
PHP 4.3.6 (cli)での結果
Benchmark for 'foreach'
33.01%
Benchmark for 'for'
35.14%
Benchmark for 'while--list-each'
31.75%
0264nobodyさん
04/05/25 16:40ID:???0265nobodyさん
04/05/25 16:41ID:???PHPユーザー(神レベル) foreach() while() for()
PHPユーザー(パンピーレベル)while() while() while()
でOKでつね。
0266nobodyさん
04/05/25 16:50ID:???0267nobodyさん
04/05/25 17:00ID:???count() を使うなら、せめて配列をリファレンスで渡してください。
でないとものすごく遅くなるよ。
0269nobodyさん
04/05/25 18:08ID:???Win 2000・PHP 4.3.4・apache 2.0.48 環境で
Benchmark for 'foreach'
38.63%
Benchmark for 'for'
25.19%
Benchmark for 'while--list-each'
36.09%
0270nobodyさん
04/05/25 18:17ID:???たまにエラーがでてサーバーが落ちてしまいます。
直す方法あるでしょうか。
0271nobodyさん
04/05/25 18:25ID:???チェックボックスにチェックが入ったもの全てを削除というのがなかなか出来ません。
log.txtの中身
118,ベッカム
119,シェフチェンコ
120,ロナウド
del_info.phpの中
print "<form method=\"POST\" action=\"delete.php\" target=\"index\">";
print "<table border=\"0\">\n";
for ($i = 0; $i < count($id); $i++)
{
print "<tr><td>\n";
print "<input type=\"checkbox\" name=\"check[]\" value=\"$id[$i]\"></input>";
print "</td><td>$id[$i]\n";
print "</td><td>$name[$i]\n";
print "</td></tr>";
}
print "<tr><td><input type=\"submit\" name=\"line_del\" value=\"削除\"></td>";
print "</table></form>\n";
delete.phpにどんなソースを書けばよいでしょうか?
0272nobodyさん
04/05/25 18:29ID:???その際にチェックが入っているレコードを書き出さないようにする
0273nobodyさん
04/05/25 18:34ID:???0274nobodyさん
04/05/25 18:35ID:???0276269
04/05/25 18:41ID:???foreach≒whileでやっぱりforが一番速い
あとstr_repeatにしてもほぼ変わらないかむしろ速い
>>239の環境が知りたい
>>270
apacheにしようぜ
0277nobodyさん
04/05/25 18:46ID:???hello worldとか簡単なやつでもエラー出ます。
エラーメッセージは↓これ。anhttpdのバージョンは1.42kです。
zend timeout window httpd.exe -アプリケーションエラー
"0x001554f4"の命令が"0x001554f4"のメモリを参照しました。
メモリが"read"になることはできませんでした。
>>276
やっぱapacheですかねぇ・・・
0278240
04/05/25 18:49ID:???>240 みてよ
loop数を5000にして幾度か試すと
for > foreach ≒whileになったよ。こっちでも。
最初のは、php5なんで無視してくれ。
でだ、カポコンの言うことは当てにならんということでFA
0279240
04/05/25 18:50ID:???>269 みてよ
でした。すまん。
0280240
04/05/25 18:51ID:???> 263 見てよ
だった。吊ってくる
0281nobodyさん
04/05/25 18:57ID:???function hoge(){
$this->aa = array("(´д`)");
}
}
$hoge = new hoge();
echo $hoge->aa[0]; <-と言う呼び方は邪道なんでしょうか?
呼び出しようのメソッドを作るか、$aa = $hoge->aa;とやってから呼ぶべきなのでしょうか?
0282269
04/05/25 18:57ID:???そうするとPHP5はforeachが劇的に変わったのか
それ以外で何らかが変わってそういう結果が出たわけだ
そこが気になったので
0283nobodyさん
04/05/25 18:59ID:???イキロ
0284277
04/05/25 19:27ID:???感謝
0286nobodyさん
04/05/25 19:46ID:???後々の事考えたらそう覚えた方がいいね
0287nobodyさん
04/05/25 19:49ID:???設計を見直してみるとか
0288nobodyさん
04/05/25 19:55ID:???0289nobodyさん
04/05/25 20:07ID:???中途半端なんだよ
0290nobodyさん
04/05/25 20:24ID:???C言語って書いてるあたり素人だろ>カポコン
それと、定期的に現れるベンチ厨ウザイから、ベンチスレでも立ててくれ
0292267
04/05/25 21:01ID:???ループの外でも、計測範囲に入っているなら影響するべ。
もしあなたがでっかい配列を count() に渡しているなら、
今度リファレンスで渡してみ。すごく速くなるから。
0295nobodyさん
04/05/25 21:05ID:RFog7Rovそこで、自分の書き込みが自分のPCに保存されるようにするにはどうしたらよいでしょうか?
PHPかPerlを使ってプログラムを書かないといけないでしょうか?
P3, 733MHz, 256MB, win 2k pro, IE6です。何方かよろしくお願いします。
0297267
04/05/25 21:08ID:???ループの外でも、計測範囲に入っているなら影響するでしょ。
もしあなたがでっかい配列を count() に渡しているなら、
今度リファレンスで渡してごらん。すごく速くなるから。
0299nobodyさん
04/05/25 21:18ID:???0300295
04/05/25 21:20ID:RFog7Rov自分の書き込みが鯖にのこらないんです。
それで、鯖に残らないなら、自分のPCに保存するということをしたいな、
という意味で書きました。これでお分かりになりました?
0302295
04/05/25 21:29ID:RFog7Rov温泉?って表示されるかな?
0304295
04/05/25 21:31ID:RFog7Rovさっきは間違えました。ありが�dこのサイト教えてあげる。
ttp://www.france.co.jp/bunko/yougo/yougo_y.html
0306295
04/05/25 21:34ID:RFog7Rov0307nobodyさん
04/05/25 21:37ID:???貴方がそのサイトのスクリプトを弄れるなら、
そういう機能(鯖にログ保存)を実装する、
または実装されたアプリを使う。サイトの作りに
手が出せないのなら、自前でProxyっぽいのを実装する
手もあるが、現実として貴方の取れる方法は、301の示した方法かな。
つまり「書き込む内容を事前にどこかに手動で残しておく」
書き込みの内容がどうも的を射てないように思えるので、自分で何とか
するんじゃなくて、既にできているものを探して利用するという方向で。
0308nobodyさん
04/05/25 21:38ID:ulnj232eホームページに入れたいんです
0309nobodyさん
04/05/25 21:40ID:???居付いてしまったらウゼェし。
0310nobodyさん
04/05/25 21:43ID:ulnj232eどのphpも付加機能ばっかいらん
0311nobodyさん
04/05/25 21:45ID:???0312nobodyさん
04/05/25 21:47ID:ulnj232e近所の人としゃべって事も無いのでは…
それよりphp教えて
0314nobodyさん
04/05/25 21:53ID:???マニュアルにもUserContributedNotesにも載ってなくて、ほんとの所はどうなんだろう?
試せばすぐ分かるんだろうけどマンドくせ。
ソースだと関係する所はこれくらいかな。
ext/standart/array.c
PHP_FUNCTION(count) -> php_count_recursive(zval *array, long mode TSRMLS_DC)
中ではポインタで渡してるだけの気がするんだが。
0315nobodyさん
04/05/25 21:54ID:GONN/rJfmb_encode_mimeheader
ですが、日本語が10文字くらいになると末尾が文字化けしてしまいます。
「こんにちはこんにち(B」
みたいな感じです。
それよりも短い文字列だと文字化けしません。
phpのバージョンは4.3.6です。
よろしくおながいします
0316nobodyさん
04/05/25 21:58ID:???TEST←定数
EOM;
EOM内で定数を使うことはできるのでしょうか?
0319nobodyさん
04/05/25 22:29ID:GONN/rJf315です。
デフォルトのままです。
コードはSJISで書いているんですが、mb_encode_mimeheaderするまえに
mb_convert_encodingでJISに変換しています。
0320カポコン
04/05/25 22:48ID:???つーかwin2000でphp語るなよw。
0323カポコン
04/05/25 23:15ID:???いくら2chでも貴様の数倍偉い人が決めた言葉よ?
好みでいいだろ。それとオツムの良さはまた別物。
あとベンチマークすんのはいいけど、
>>237-239みたいにちゃんとした結果出せないと説得力ねーよ。
なんだよ%,%ってTimerクラス使ってるのにそりゃーねーだろ。
所詮2chのウンコ厨だな、そんなんだからいつまで経っても
3流の領域抜け出せねんだよ。あと試すんならunix系入れて試せ。
素 人 は お ま え 。
0325nobodyさん
04/05/25 23:37ID:???0326nobodyさん
04/05/26 00:19ID:???0327nobodyさん
04/05/26 00:21ID:VdU4NQovGDを詳しく扱った本はありませんでしょうか?
本の中の1つのコンテンツとして扱っていても結構ですので教えて下さい。
あと、GDを説明しているサイトもできればお願いします…。
0330nobodyさん
04/05/26 02:12ID:???0332nobodyさん
04/05/26 03:31ID:???PHPの書籍でGDの詳しいのねぇ。心当たりはないね。
GDは、今は独自パッチがあたったのがPHPに添付されてるけど
ImageMagickと同様、元々外部のグラフィックライブラリだから
PHP以外での使用方法にも探す範囲を広げた方が良いよ。
0333nobodyさん
04/05/26 03:33ID:???0334nobodyさん
04/05/26 03:48ID:???0336nobodyさん
04/05/26 04:16ID:???プログラミング言語C 或いは C が妥当か。
あとbenchmarkだが他人様のはアテにせず自分でとろうな。
>>326
アホ共がこぞって使う共用のコテハンってところじゃないの?
>>327
無い。
■ このスレッドは過去ログ倉庫に格納されています