3

文字列を受け取り、quotedprintableとしてフォーマットするルーチンを書いています。そして、それは可能な限り速くなければなりません。私の最初の試みは、ある文字列バッファから別のエンコーディングに文字をコピーし、途中で行を折り返しました。次に、ほとんど同じデータをすべてコピーするよりも、元の文字列バッファを変更する方が速いかもしれないと思いました。挿入はコピーよりもはるかに悪いことがわかりました。2番目のバージョン(文字列バッファ挿入を含む)は8倍遅く、これは多くのメモリを移動する必要があるため、理にかなっています。

私が望んでいたのは、ある種のギャップバッファデータ構造でした。これにより、挿入では、残りの文字列バッファ内のすべての文字を物理的に移動する必要がなくなりました。

それで、時々文字を挿入する文字列をリッピングする最速の方法についての提案はありますか?

標準のmimeutilsライブラリを使用する提案は役に立ちません。これは、文字列をドットエスケープして、SMTPサーバーに一度にダンプできるようにするためです。

4

3 に答える 3

6

最後に、ギャップデータ構造を文字列に変換する必要があります。これには、すべてのチャンクをStringBuilderに追加して、単一の配列にアセンブルする必要があります。

したがって、StringBuilderを直接使用すると高速になります。それよりも速いテクニックは見つからないと思います。容量が使い果たされたときにバッファ全体のコピーを回避するために、StringBuilderを十分な大きさで初期化してください。

于 2012-07-10T13:02:51.620 に答える
2

それで、ここで他のいくつかの答えのアドバイスを受けて、私はこの関数の多くのバージョンを書いてきました。何が最も速くなるかを見て、誰かが私が見つけたものから得ることができるかどうか将来の参考のために:

1)最も遅い:stringbuffer.append()ですが、私たちはそれを知っていました。

2)ほぼ2倍の速度:stringbuilder.append()。ロックは非常に高価なようです。

3)さらに20%高速です....あるchar[]から別のchar[]にコピーします。

4)そして最後に、それよりも3倍速くなります...あるchar配列から別のchar配列にコピーするCでコンパイルされたまったく同じコードへのJNI呼び出し。

あなたは#4の不正行為を検討するかもしれませんが、詐欺師が勝ちます。最速の方法です。

GetCharArrayElements呼び出しによってjavachar配列がコピーされ、Cプログラムに渡されるリスクがありますが、それが発生しているかどうかはわかりません。また、Java実装と比較して高速です。

于 2012-08-06T19:09:49.087 に答える
0

速度とコーディングの優雅さのバランスが取れているのは、を使用することだと思いますMatcher.appendReplacement。すべての挿入ポイントをキャッチする正規表現を作成します。を使用するループではfind、分析Matcher.group()して正確に一致するものを確認し、プログラムロジックを使用してに何を与えるかを決定しappendReplacementます。

いずれにせよ、charごとにテキストをコピーしないことが重要です。可能な限り最大のチャンクでコピーする必要があります。

MatcherAPIは非常に残念ながらにバインドされていStringBufferますが、ご存知のように、最後の5%しか使用できません。

于 2012-07-10T13:07:15.313 に答える