_ Android PDF Writerが遅い件
PDF Writerを使って開発を進めていたのですが、1ページのオブジェクト量が多くなると、生成に非常に時間がかかる事が分かりました。
改ページすると超速いのですが、オブジェクトを追加していくとどんどん遅くなります。
コードを追ってみると、不要と思われる処理、適切で無いと思われる処理がありましたので修正したところ、20倍ぐらい(体感)速くなりましたのでメモとして上げます。
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);
+++ mPageContents.setDictionaryContent(" /Length " + Integer.toString(mPageContents.getStreamContentLength()) + "\n");
++ }
public void addRawContent(String rawContent) {
|
元凶の1つ目は41行目。この中で長大なStringBuilderをtoString()しており、そのたびに(実際は数回に1度)GCが走ってパフォーマンスが落ちています。
ここで欲しいのは長さだけなので、getStreamContentLength()という関数を作ります。
getStreamContentLength()の中身はその上の9〜11、25〜27行目の通り。
元凶の2つ目は43行目のsetStreamContent()。40行目で作ったStringBuilderを、何故か再度newして作り直しています。というわけでコメントアウト。
なんだかこれで良いのか若干不安ですが、私の利用範囲では動いているのでよしとします。
ご利用はあくまで自己責任で(^^;。