Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/RevlogStream.java @ 264:6bb5e7ed051a
Optimize memory usage (reduce number of objects instantiated) when pooling file names and nodeids during manifest parsing
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 19 Aug 2011 03:36:25 +0200 |
| parents | 31f67be94e71 |
| children | 35125450c804 |
comparison
equal
deleted
inserted
replaced
| 263:31f67be94e71 | 264:6bb5e7ed051a |
|---|---|
| 337 private DataAccess daIndex = null, daData = null; | 337 private DataAccess daIndex = null, daData = null; |
| 338 private Lifecycle.BasicCallback cb = null; | 338 private Lifecycle.BasicCallback cb = null; |
| 339 private int lastRevisionRead = BAD_REVISION; | 339 private int lastRevisionRead = BAD_REVISION; |
| 340 private DataAccess lastUserData; | 340 private DataAccess lastUserData; |
| 341 // next are to track two major bottlenecks - patch application and actual time spent in inspector | 341 // next are to track two major bottlenecks - patch application and actual time spent in inspector |
| 342 // private long applyTime, inspectorTime; | 342 // private long applyTime, inspectorTime; // TIMING |
| 343 | 343 |
| 344 | 344 |
| 345 public ReaderN1(boolean needData, Inspector insp) { | 345 public ReaderN1(boolean needData, Inspector insp) { |
| 346 assert insp != null; | 346 assert insp != null; |
| 347 this.needData = needData; | 347 this.needData = needData; |
| 355 } | 355 } |
| 356 if (inspector instanceof Lifecycle) { | 356 if (inspector instanceof Lifecycle) { |
| 357 cb = new Lifecycle.BasicCallback(); | 357 cb = new Lifecycle.BasicCallback(); |
| 358 ((Lifecycle) inspector).start(totalWork, cb, cb); | 358 ((Lifecycle) inspector).start(totalWork, cb, cb); |
| 359 } | 359 } |
| 360 // applyTime = inspectorTime = 0; | 360 // applyTime = inspectorTime = 0; // TIMING |
| 361 } | 361 } |
| 362 | 362 |
| 363 public void finish() { | 363 public void finish() { |
| 364 if (lastUserData != null) { | 364 if (lastUserData != null) { |
| 365 lastUserData.done(); | 365 lastUserData.done(); |
| 370 } | 370 } |
| 371 daIndex.done(); | 371 daIndex.done(); |
| 372 if (daData != null) { | 372 if (daData != null) { |
| 373 daData.done(); | 373 daData.done(); |
| 374 } | 374 } |
| 375 // System.out.printf("applyTime:%d ms, inspectorTime: %d ms\n", applyTime, inspectorTime); | 375 // System.out.printf("applyTime:%d ms, inspectorTime: %d ms\n", applyTime, inspectorTime); // TIMING |
| 376 } | 376 } |
| 377 | 377 |
| 378 public boolean range(int start, int end) throws IOException { | 378 public boolean range(int start, int end) throws IOException { |
| 379 byte[] nodeidBuf = new byte[20]; | 379 byte[] nodeidBuf = new byte[20]; |
| 380 int i; | 380 int i; |
| 466 // | 466 // |
| 467 // it shall be reset at the end of prev iteration, when it got assigned from userDataAccess | 467 // it shall be reset at the end of prev iteration, when it got assigned from userDataAccess |
| 468 // however, actual userDataAccess and lastUserData may share Inflater object, which needs to be reset | 468 // however, actual userDataAccess and lastUserData may share Inflater object, which needs to be reset |
| 469 // Alternatively, userDataAccess.done() above may be responsible to reset Inflater (if it's InflaterDataAccess) | 469 // Alternatively, userDataAccess.done() above may be responsible to reset Inflater (if it's InflaterDataAccess) |
| 470 lastUserData.reset(); | 470 lastUserData.reset(); |
| 471 // final long startMeasuring = System.currentTimeMillis(); | 471 // final long startMeasuring = System.currentTimeMillis(); // TIMING |
| 472 byte[] userData = apply(lastUserData, actualLen, patches); | 472 byte[] userData = apply(lastUserData, actualLen, patches); |
| 473 // applyTime += (System.currentTimeMillis() - startMeasuring); | 473 // applyTime += (System.currentTimeMillis() - startMeasuring); // TIMING |
| 474 patches.clear(); // do not keep any reference, allow PatchRecord to be gc'd | 474 patches.clear(); // do not keep any reference, allow PatchRecord to be gc'd |
| 475 userDataAccess = new ByteArrayDataAccess(userData); | 475 userDataAccess = new ByteArrayDataAccess(userData); |
| 476 } | 476 } |
| 477 } else { | 477 } else { |
| 478 if (inline) { | 478 if (inline) { |
| 479 daIndex.skip(compressedLen); | 479 daIndex.skip(compressedLen); |
| 480 } | 480 } |
| 481 } | 481 } |
| 482 if (!extraReadsToBaseRev || i >= start) { | 482 if (!extraReadsToBaseRev || i >= start) { |
| 483 // final long startMeasuring = System.currentTimeMillis(); | 483 // final long startMeasuring = System.currentTimeMillis(); // TIMING |
| 484 inspector.next(i, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, nodeidBuf, userDataAccess); | 484 inspector.next(i, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, nodeidBuf, userDataAccess); |
| 485 // inspectorTime += (System.currentTimeMillis() - startMeasuring); | 485 // inspectorTime += (System.currentTimeMillis() - startMeasuring); // TIMING |
| 486 } | 486 } |
| 487 if (cb != null) { | 487 if (cb != null) { |
| 488 if (cb.isStopped()) { | 488 if (cb.isStopped()) { |
| 489 return false; | 489 return false; |
| 490 } | 490 } |
