class body -> parse() の改行コードの処理を微妙に高速化†
- ページ: BugTrack2
- 投稿者: 0
- 優先順位: 低
- 状態: 完了
- カテゴリー: その他
- 投稿日: 2006-01-16 (月) 05:54:42
- バージョン:
(PukiWiki 1.4.7)
preg_系の関数一箇所を、等価でより高速な標準関数に入れ替えました
diff -r1.16 convert_html.php
840c840
< $line = preg_replace("/[\r\n]*$/", '', $line);
---
> $line = rtrim($line, "\r\n");
その他のクリンナップねた: See BugTrack/779#q7865a89
メッセージ†
convert_html.php -> class body -> parse() の改行コードの処理を以下のようにするのはどうでしょう?
- $line = preg_replace("/[\r\n]*$/", '', $line);
+ $line = str_replace("\r", '', $line);
+ $line = str_replace("\n", '', $line);
ざっと調べた感じでは、改行コードが末尾以外に付いている場合はないと思うので、不具合はないと思います。ループの中に置くか外に置くか*1、どちらが速いのかは調べていませんが、可能であれば str_replace() で置き換えた方が明らかに速くなります。
- この着眼点の基本的なところは、「str_replace()で実現できる処理をpreg_replace()にさせるべきではない(遅いから)」という所にあります。この事はPHP str_replace()のマニュアルなどでも示唆されています。今までの修正の中でも、等価な処理であれば積極的に直して来たものです(See BugTrack/779)。 -- henoheno
- それで、今回の修正案は内容が等価ではありません。「末尾の改行コードを取り除きたい」という本来の意図の説明が不十分になる上、「俺は末尾以外の改行バイトなんざ興味ないし副作用があったとしても知らん」と(コードが)主張してしまうと思うので、その辺が難しいですね (^^; Perlで言うchomp() って他に何かうまい書き方なかったかしら・・・(と、以前も悩んだ気がする) -- henoheno
- 本当に問題ないのであれば、「悪気はないんだ」とコメントを添えた上で修正を加えるのが良いと思います。でもどうしたら(問題ないと)証明できるでしょうね? -- henoheno
- ・・・行単位だけれども rtrim(string, "\r\n") は等価かな。・・・ああここは行単位に扱っていますね。これなら素朴で良いかもしれません。ループの外で事前に array に対して適用してしまうのは、本来不要な部分に対するコストが増加する可能性のある諸刃の剣であるようです(そのような処理も「俺他は知らんもんね」と主張するかもしれない)。それをするなら、さらにその外(関数の外の外の外)で事前に処理する事すら可能かもしれません。止まらない混乱の渦に飲み込まれそうで怖いですね (^^; -- henoheno
- なるほど、この提案は浅はかでした (^^; しかも rtrim の方が高速(かつ等価)ですね。 -- 0
- ということで、手元の環境で rtrim() で試したところ、行がそこそこ長いページ 「PukiWiki/1.4/Manual/Plugin/O-R」について、HTML convert timeで言うと 1.230 sec が 1.200 sec (0.03sec) となる程度の効果があるようですので修正します :) -- henoheno