Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/RevlogStream.java @ 288:b11f6a08f748
Avoid boxing int values and list resizes on revlog read
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Sat, 10 Sep 2011 00:18:39 +0200 |
parents | 35125450c804 |
children | 981f9f50bb6c |
comparison
equal
deleted
inserted
replaced
287:ed6b74a58c66 | 288:b11f6a08f748 |
---|---|
267 | 267 |
268 private void initOutline() { | 268 private void initOutline() { |
269 if (baseRevisions != null && baseRevisions.length > 0) { | 269 if (baseRevisions != null && baseRevisions.length > 0) { |
270 return; | 270 return; |
271 } | 271 } |
272 ArrayList<Integer> resBases = new ArrayList<Integer>(); | |
273 ArrayList<Integer> resOffsets = new ArrayList<Integer>(); | |
274 DataAccess da = getIndexStream(); | 272 DataAccess da = getIndexStream(); |
275 try { | 273 try { |
276 if (da.isEmpty()) { | 274 if (da.isEmpty()) { |
277 // do not fail with exception if stream is empty, it's likely intentional | 275 // do not fail with exception if stream is empty, it's likely intentional |
278 baseRevisions = new int[0]; | 276 baseRevisions = new int[0]; |
280 } | 278 } |
281 int versionField = da.readInt(); | 279 int versionField = da.readInt(); |
282 da.readInt(); // just to skip next 4 bytes of offset + flags | 280 da.readInt(); // just to skip next 4 bytes of offset + flags |
283 final int INLINEDATA = 1 << 16; | 281 final int INLINEDATA = 1 << 16; |
284 inline = (versionField & INLINEDATA) != 0; | 282 inline = (versionField & INLINEDATA) != 0; |
283 IntVector resBases, resOffsets = null; | |
284 int entryCountGuess = da.length() / REVLOGV1_RECORD_SIZE; | |
285 if (inline) { | |
286 entryCountGuess >>>= 2; // pure guess, assume useful data takes 3/4 of total space | |
287 resOffsets = new IntVector(entryCountGuess, 5000); | |
288 } | |
289 resBases = new IntVector(entryCountGuess, 5000); | |
290 | |
285 long offset = 0; // first offset is always 0, thus Hg uses it for other purposes | 291 long offset = 0; // first offset is always 0, thus Hg uses it for other purposes |
286 while(true) { | 292 while(true) { |
287 int compressedLen = da.readInt(); | 293 int compressedLen = da.readInt(); |
288 // 8+4 = 12 bytes total read here | 294 // 8+4 = 12 bytes total read here |
289 @SuppressWarnings("unused") | 295 @SuppressWarnings("unused") |
307 } else { | 313 } else { |
308 da.skip(3*4 + 32); | 314 da.skip(3*4 + 32); |
309 } | 315 } |
310 if (da.isEmpty()) { | 316 if (da.isEmpty()) { |
311 // fine, done then | 317 // fine, done then |
312 baseRevisions = toArray(resBases); | 318 baseRevisions = resBases.toArray(true); |
313 if (inline) { | 319 if (inline) { |
314 indexRecordOffset = toArray(resOffsets); | 320 indexRecordOffset = resOffsets.toArray(true); |
315 } | 321 } |
316 break; | 322 break; |
317 } else { | 323 } else { |
318 // start reading next record | 324 // start reading next record |
319 long l = da.readLong(); | 325 long l = da.readLong(); |