skimemo


skimemo - 日記/2013-11-04/Android PDF Writerが遅い件 の変更点


#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()