--> -->
#blog2navi() *Android PDF Writerが遅い件 [#q26683bc] PDF Writerを使って開発を進めていたのですが、1ページのオブジェクト量が多くなると、生成に非常に時間がかかる事が分かりました。~ ~ 改ページすると超速いのですが、オブジェクトを追加していくとどんどん遅くなります。~ ~ コードを追ってみると、不要と思われる処理、適切で無いと思われる処理がありましたので修正したところ、20倍ぐらい(体感)速くなりましたのでメモとして上げます。~ ~ #code(java){{ Index: EnclosedContent.java =================================================================== --- EnclosedContent.java (revision 17) +++ EnclosedContent.java (working copy) @@ -48,6 +48,10 @@ return mContent.toString(); } + public int getContentLength() { + return mContent.length(); + } + public void addContent(String Value) { mContent.append(Value); } Index: IndirectObject.java =================================================================== --- IndirectObject.java (revision 17) +++ IndirectObject.java (working copy) @@ -92,10 +92,17 @@ return mStreamContent.getContent(); } + public int getStreamContentLength() { + return mStreamContent.getContentLength(); + } + protected String render() { StringBuilder sb = new StringBuilder(); sb.append(mID.toPDFString()); Index: Page.java =================================================================== --- Page.java (revision 21) +++ Page.java (working copy) @@ -97,9 +97,11 @@ private void addContent(String content) { mPageContents.addStreamContent(content); - String streamContent = mPageContents.getStreamContent(); - mPageContents.setDictionaryContent(" /Length " + Integer.toString(streamContent.length()) + "\n"); - mPageContents.setStreamContent(streamContent); +// 長さを取るためだけにtoString()をすると大量にGCが発生し遅くなる。getStreamContentLengthを新設して代用。 +// String streamContent = mPageContents.getStreamContent(); + mPageContents.setDictionaryContent(" /Length " + Integer.toString(mPageContents.getStreamContentLength()) + "\n"); +// 上の行でaddしているので同じものを詰め替える必要なし +// mPageContents.setStreamContent(streamContent); } public void addRawContent(String rawContent) { }} ~ 元凶の1つ目は41行目。この中で長大なStringBuilderをtoString()しており、そのたびに(実際は数回に1度)GCが走ってパフォーマンスが落ちています。~ ここで欲しいのは長さだけなので、getStreamContentLength()という関数を作ります。~ getStreamContentLength()の中身はその上の9〜11、25〜27行目の通り。~ ~ 元凶の2つ目は43行目のsetStreamContent()。40行目で作ったStringBuilderを、何故か再度newして作り直しています。というわけでコメントアウト。~ ~ なんだかこれで良いのか若干不安ですが、私の利用範囲では動いているのでよしとします。~ ご利用はあくまで自己責任で(^^;。 RIGHT:Category: [[[android>日記/Category/android]]] - 16:48:48 ---- RIGHT:&blog2trackback(); #comment(above) #blog2navi()