Merge "Performance fixes in DateRevQueue"
This commit is contained in:
commit
9613b04d81
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
|
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>,
|
||||||
|
* Copyright (C) 2013, Gustaf Lundh <gustaf.lundh@sonymobile.com>
|
||||||
* and other copyright owners as documented in the project's IP log.
|
* and other copyright owners as documented in the project's IP log.
|
||||||
*
|
*
|
||||||
* This program and the accompanying materials are made available
|
* This program and the accompanying materials are made available
|
||||||
|
@ -50,10 +51,22 @@
|
||||||
|
|
||||||
/** A queue of commits sorted by commit time order. */
|
/** A queue of commits sorted by commit time order. */
|
||||||
public class DateRevQueue extends AbstractRevQueue {
|
public class DateRevQueue extends AbstractRevQueue {
|
||||||
|
private static final int REBUILD_INDEX_COUNT = 1000;
|
||||||
|
|
||||||
private Entry head;
|
private Entry head;
|
||||||
|
|
||||||
private Entry free;
|
private Entry free;
|
||||||
|
|
||||||
|
private int inQueue;
|
||||||
|
|
||||||
|
private int sinceLastIndex;
|
||||||
|
|
||||||
|
private Entry[] index;
|
||||||
|
|
||||||
|
private int first;
|
||||||
|
|
||||||
|
private int last = -1;
|
||||||
|
|
||||||
/** Create an empty date queue. */
|
/** Create an empty date queue. */
|
||||||
public DateRevQueue() {
|
public DateRevQueue() {
|
||||||
super();
|
super();
|
||||||
|
@ -70,10 +83,36 @@ public DateRevQueue() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(final RevCommit c) {
|
public void add(final RevCommit c) {
|
||||||
|
sinceLastIndex++;
|
||||||
|
if (++inQueue > REBUILD_INDEX_COUNT
|
||||||
|
&& sinceLastIndex > REBUILD_INDEX_COUNT)
|
||||||
|
buildIndex();
|
||||||
|
|
||||||
Entry q = head;
|
Entry q = head;
|
||||||
final long when = c.commitTime;
|
final long when = c.commitTime;
|
||||||
|
|
||||||
|
if (first <= last && index[first].commit.commitTime > when) {
|
||||||
|
int low = first, high = last;
|
||||||
|
while (low <= high) {
|
||||||
|
int mid = (low + high) >>> 1;
|
||||||
|
int t = index[mid].commit.commitTime;
|
||||||
|
if (t < when)
|
||||||
|
high = mid - 1;
|
||||||
|
else if (t > when)
|
||||||
|
low = mid + 1;
|
||||||
|
else {
|
||||||
|
low = mid - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
low = Math.min(low, high);
|
||||||
|
while (low >= first && when == index[low].commit.commitTime)
|
||||||
|
--low;
|
||||||
|
q = index[low];
|
||||||
|
}
|
||||||
|
|
||||||
final Entry n = newEntry(c);
|
final Entry n = newEntry(c);
|
||||||
if (q == null || when > q.commit.commitTime) {
|
if (q == null || (q == head && when > q.commit.commitTime)) {
|
||||||
n.next = q;
|
n.next = q;
|
||||||
head = n;
|
head = n;
|
||||||
} else {
|
} else {
|
||||||
|
@ -91,11 +130,28 @@ public RevCommit next() {
|
||||||
final Entry q = head;
|
final Entry q = head;
|
||||||
if (q == null)
|
if (q == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
if (index != null && q == index[first])
|
||||||
|
index[first++] = null;
|
||||||
|
inQueue--;
|
||||||
|
|
||||||
head = q.next;
|
head = q.next;
|
||||||
freeEntry(q);
|
freeEntry(q);
|
||||||
return q.commit;
|
return q.commit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void buildIndex() {
|
||||||
|
sinceLastIndex = 0;
|
||||||
|
first = 0;
|
||||||
|
index = new Entry[inQueue / 100 + 1];
|
||||||
|
int qi = 0, ii = 0;
|
||||||
|
for (Entry q = head; q != null; q = q.next) {
|
||||||
|
if (++qi % 100 == 0)
|
||||||
|
index[ii++] = q;
|
||||||
|
}
|
||||||
|
last = ii - 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Peek at the next commit, without removing it.
|
* Peek at the next commit, without removing it.
|
||||||
*
|
*
|
||||||
|
@ -108,6 +164,10 @@ public RevCommit peek() {
|
||||||
public void clear() {
|
public void clear() {
|
||||||
head = null;
|
head = null;
|
||||||
free = null;
|
free = null;
|
||||||
|
index = null;
|
||||||
|
inQueue = 0;
|
||||||
|
sinceLastIndex = 0;
|
||||||
|
last = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean everbodyHasFlag(final int f) {
|
boolean everbodyHasFlag(final int f) {
|
||||||
|
|
Loading…
Reference in New Issue