From 3cad9e685173bd33e13bd2407f0d8f6cfe0c5522 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 16 May 2020 13:06:07 +0000 Subject: Bug 64322: Optimize performance of reading ole2 files Remember channel-size to no re-read it for every read-access, but reset it if we extend the size of the file profiling indicates Channel.size() sometimes has similar runtime overhead as position() or read()! git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1877816 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/poifs/nio/FileBackedDataSource.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/java/org') diff --git a/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java index 5b77db4d92..2d4af278c1 100644 --- a/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java +++ b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java @@ -39,6 +39,8 @@ public class FileBackedDataSource extends DataSource { private final static POILogger logger = POILogFactory.getLogger(FileBackedDataSource.class); private final FileChannel channel; + private Long channelSize; + private final boolean writable; // remember file base, which needs to be closed too private RandomAccessFile srcFile; @@ -97,8 +99,9 @@ public class FileBackedDataSource extends DataSource { // remember this buffer for cleanup buffersToClean.put(dst,dst); } else { - // allocate the buffer on the heap if we cannot map the data in directly channel.position(position); + + // allocate the buffer on the heap if we cannot map the data in directly dst = ByteBuffer.allocate(length); // Read the contents and check that we could read some data @@ -118,6 +121,11 @@ public class FileBackedDataSource extends DataSource { @Override public void write(ByteBuffer src, long position) throws IOException { channel.write(src, position); + + // we have to re-read size if we write "after" the recorded one + if(channelSize != null && position >= channelSize) { + channelSize = null; + } } @Override @@ -131,7 +139,13 @@ public class FileBackedDataSource extends DataSource { @Override public long size() throws IOException { - return channel.size(); + // this is called often and profiling showed that channel.size() + // was taking a large part of processing-time, so we only read it + // once + if(channelSize == null) { + channelSize = channel.size(); + } + return channelSize; } public void releaseBuffer(ByteBuffer buffer) { -- cgit v1.2.3 'datefield-set-invalid-value'>datefield-set-invalid-value Vaadin 6, 7, 8 is a Java framework for modern Java web applications: https://github.com/vaadin/frameworkwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/documentation/articles/ValoThemeGettingStarted.asciidoc
blob: 1cf9214dff8cff4bdc9b1516e4f9362ea5cc53ef (plain)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182