skimemo


skimemo - 日記/2013-11-04/Android PDF Writerが遅い件

_ Android PDF Writerが遅い件

PDF Writerを使って開発を進めていたのですが、1ページのオブジェクト量が多くなると、生成に非常に時間がかかる事が分かりました。

改ページすると超速いのですが、オブジェクトを追加していくとどんどん遅くなります。

コードを追ってみると、不要と思われる処理、適切で無いと思われる処理がありましたので修正したところ、20倍ぐらい(体感)速くなりましたのでメモとして上げます。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 
 
 
 
 
!
|
-
 
!
|
-
 
!
|
|
|
|
|
|
|
!
|
-
|
!
|
-
|
|
|
|
|
|
|
|
|
-
 
 
 
 
 
 
 
 
 
!
|
-
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して作り直しています。というわけでコメントアウト。

なんだかこれで良いのか若干不安ですが、私の利用範囲では動いているのでよしとします。
ご利用はあくまで自己責任で(^^;。

Category: [android] - 16:48:48



 
Last-modified: 2013-11-04 (月) 16:56:47 (2631d)