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 } | 
