Skip to content

Commit

Permalink
- more efficient comparator calls
Browse files Browse the repository at this point in the history
  • Loading branch information
orbiter committed Mar 14, 2009
1 parent 44874cb commit 65784eb
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 25 deletions.
12 changes: 6 additions & 6 deletions source/de/anomic/kelondro/blob/ObjectBuffer.java
Expand Up @@ -110,7 +110,7 @@ public static String[] combinedStatus(final String[][] a, final int l) {
public void put(final byte[] key, final Object value) {
if ((key == null) || (value == null)) return;
synchronized(this) {
if (NaturalOrder.equal(this.key, key)){
if (NaturalOrder.naturalOrder.equal(this.key, key)){
this.writeDouble++;
} else {
this.writeUnique++;
Expand All @@ -123,7 +123,7 @@ public void put(final byte[] key, final Object value) {
public void put(final String key, final Object value) {
if ((key == null) || (value == null)) return;
synchronized(this) {
if (NaturalOrder.equal(this.key, key.getBytes())){
if (NaturalOrder.naturalOrder.equal(this.key, key.getBytes())){
this.writeDouble++;
} else {
this.writeUnique++;
Expand All @@ -136,7 +136,7 @@ public void put(final String key, final Object value) {
public Object get(final byte[] key) {
if (key == null) return null;
synchronized(this) {
if (NaturalOrder.equal(this.key, key)){
if (NaturalOrder.naturalOrder.equal(this.key, key)){
this.readHit++;
return this.value;
} else {
Expand All @@ -149,7 +149,7 @@ public Object get(final byte[] key) {
public Object get(final String key) {
if (key == null) return null;
synchronized(this) {
if (NaturalOrder.equal(this.key, key.getBytes())){
if (NaturalOrder.naturalOrder.equal(this.key, key.getBytes())){
this.readHit++;
return this.value;
} else {
Expand All @@ -162,7 +162,7 @@ public Object get(final String key) {
public void remove(final byte[] key) {
if (key == null) return;
synchronized(this) {
if (NaturalOrder.equal(this.key, key)){
if (NaturalOrder.naturalOrder.equal(this.key, key)){
this.key = null;
this.value = null;
}
Expand All @@ -172,7 +172,7 @@ public void remove(final byte[] key) {
public void remove(final String key) {
if (key == null) return;
synchronized(this) {
if (NaturalOrder.equal(this.key, key.getBytes())){
if (NaturalOrder.naturalOrder.equal(this.key, key.getBytes())){
this.key = null;
this.value = null;
}
Expand Down
6 changes: 5 additions & 1 deletion source/de/anomic/kelondro/index/Row.java
Expand Up @@ -208,7 +208,7 @@ public Order<Entry> clone() {
}

public long cardinal(final Entry key) {
return base.cardinal(key.getPrimaryKeyBytes());
return base.cardinal(key.bytes(), 0, key.getPrimaryKeyLength());
}

public String signature() {
Expand Down Expand Up @@ -565,6 +565,10 @@ public final byte[] getPrimaryKeyBytes() {
return c;
}

public final int getPrimaryKeyLength() {
return primaryKeyLength;
}

public final byte[] getColBytes(final int column) {
assert offset + colstart[column] + row[column].cellwidth <= rowinstance.length :
"column = " + column + ", offset = " + offset + ", colstart[column] = " + colstart[column] + ", row[column].cellwidth() = " + row[column].cellwidth + ", rowinstance.length = " + rowinstance.length;
Expand Down
24 changes: 18 additions & 6 deletions source/de/anomic/kelondro/index/RowSetArray.java
Expand Up @@ -51,7 +51,7 @@ private int indexFor(byte[] key) {
}

private int indexFor(Entry row) {
return indexFor(row.getPrimaryKeyBytes());
return (int) (this.rowdef.objectOrder.cardinal(row.bytes(), 0, row.getPrimaryKeyLength()) % ((long) array.length));
}

private RowSet accessArray(int i) {
Expand All @@ -64,7 +64,9 @@ private RowSet accessArray(int i) {
}

public void addUnique(Entry row) {
accessArray(indexFor(row)).addUnique(row);
int i = indexFor(row);
if (i < 0) return;
accessArray(i).addUnique(row);
}

public void addUnique(List<Entry> rows) {
Expand Down Expand Up @@ -95,13 +97,15 @@ public String filename() {

public Entry get(byte[] key) {
int i = indexFor(key);
if (i < 0) return null;
RowSet r = this.array[i];
if (r == null) return null;
return r.get(key);
}

public boolean has(byte[] key) {
int i = indexFor(key);
if (i < 0) return false;
RowSet r = this.array[i];
if (r == null) return false;
return r.has(key);
Expand All @@ -121,15 +125,19 @@ public CloneableIterator<byte[]> keys(boolean up, byte[] firstKey) {
}

public void put(Entry row) {
accessArray(indexFor(row)).put(row);
int i = indexFor(row);
if (i < 0) return;
accessArray(i).put(row);
}

public void put(List<Entry> rows) {
for (Entry row: rows) put(row);
}

public Entry remove(byte[] key) {
return accessArray(indexFor(key)).remove(key);
int i = indexFor(key);
if (i < 0) return null;
return accessArray(i).remove(key);
}

public ArrayList<RowCollection> removeDoubles() {
Expand Down Expand Up @@ -159,7 +167,9 @@ public Entry removeOne() {
}

public Entry replace(Entry row) {
return accessArray(indexFor(row)).replace(row);
int i = indexFor(row);
if (i < 0) return null;
return accessArray(i).replace(row);
}

public Row row() {
Expand Down Expand Up @@ -200,6 +210,8 @@ public Iterator<Entry> iterator() {
}

public long inc(byte[] key, int col, long add, Entry initrow) {
return accessArray(indexFor(key)).inc(key, col, add, initrow);
int i = indexFor(key);
if (i < 0) return -1;
return accessArray(i).inc(key, col, add, initrow);
}
}
55 changes: 50 additions & 5 deletions source/de/anomic/kelondro/order/Base64Order.java
Expand Up @@ -253,23 +253,38 @@ public final byte[] decode(String in, final String info) {
}
}

private final long cardinalI(final byte[] key, int off, int len) {
// returns a cardinal number in the range of 0 .. Long.MAX_VALUE
long c = 0;
int lim = off + Math.min(10, len);
int lim10 = off + 10;
while (off < lim) c = (c << 6) | ahpla[key[off++]];
while (off++ < lim10) c = (c << 6);
c = c << 3;
assert c >= 0;
return c;
}

/*
private final long cardinalI(final byte[] key) {
// returns a cardinal number in the range of 0 .. Long.MAX_VALUE
long c = 0;
int p = 0;
while ((p < 10) && (p < key.length)) c = (c << 6) | ahpla[key[p++]];
while (p++ < 10) c = (c << 6);
c = c << 3;
assert c >= 0;
return c;
}

*/
private final long cardinalI(final String key) {
// returns a cardinal number in the range of 0 .. Long.MAX_VALUE
long c = 0;
int p = 0;
while ((p < 10) && (p < key.length())) c = (c << 6) | ahpla[key.charAt(p++)];
while (p++ < 10) c = (c << 6);
c = c << 3;
assert c >= 0;
return c;
}

Expand All @@ -284,16 +299,24 @@ public final byte[] uncardinal(long c) {
}

public final long cardinal(final byte[] key) {
if (this.zero == null) return cardinalI(key);
final long zeroCardinal = cardinalI(this.zero);
final long keyCardinal = cardinalI(key);
if (this.zero == null) return cardinalI(key, 0, key.length);
final long zeroCardinal = cardinalI(this.zero, 0, zero.length);
final long keyCardinal = cardinalI(key, 0, key.length);
if (keyCardinal > zeroCardinal) return keyCardinal - zeroCardinal;
return Long.MAX_VALUE - keyCardinal + zeroCardinal;
}

public final long cardinal(final byte[] key, int off, int len) {
if (this.zero == null) return cardinalI(key, off, len);
final long zeroCardinal = cardinalI(this.zero, 0, zero.length);
final long keyCardinal = cardinalI(key, off, len);
if (keyCardinal > zeroCardinal) return keyCardinal - zeroCardinal;
return Long.MAX_VALUE - keyCardinal + zeroCardinal;
}

public final long cardinal(final String key) {
if (this.zero == null) return cardinalI(key);
final long zeroCardinal = cardinalI(this.zero);
final long zeroCardinal = cardinalI(this.zero, 0, zero.length);
final long keyCardinal = cardinalI(key);
if (keyCardinal > zeroCardinal) return keyCardinal - zeroCardinal;
return Long.MAX_VALUE - keyCardinal + zeroCardinal;
Expand All @@ -303,6 +326,28 @@ private static final int sig(final int x) {
return (x > 0) ? 1 : (x < 0) ? -1 : 0;
}

public final boolean equal(final byte[] a, final byte[] b) {
if ((a == null) && (b == null)) return true;
if ((a == null) || (b == null)) return false;
if (a.length != b.length) return false;
int astart = 0;
int bstart = 0;
int length = a.length;
while (length-- != 0) {
if (a[astart++] != b[bstart++]) return false;
}
return true;
}

public final boolean equal(final byte[] a, int astart, final byte[] b, int bstart, int length) {
if ((a == null) && (b == null)) return true;
if ((a == null) || (b == null)) return false;
while (length-- != 0) {
if (a[astart++] != b[bstart++]) return false;
}
return true;
}

public final int compare(final byte[] a, final byte[] b) {
return (asc) ? compare0(a, 0, a.length, b, 0, b.length) : compare0(b, 0, b.length, a, 0, a.length);
}
Expand Down
6 changes: 6 additions & 0 deletions source/de/anomic/kelondro/order/ByteOrder.java
Expand Up @@ -36,6 +36,12 @@ public interface ByteOrder extends Order<byte[]> {

public int compare(byte[] a, int astart, int alen, byte[] b, int bstart, int blen);

public boolean equal(final byte[] a, final byte[] b);

public boolean equal(final byte[] a, int astart, final byte[] b, int bstart, int length);

public long cardinal(final byte[] a, int off, int len);

public final static class StringOrder implements Comparator<String> {

public ByteOrder baseOrder;
Expand Down
49 changes: 42 additions & 7 deletions source/de/anomic/kelondro/order/NaturalOrder.java
Expand Up @@ -70,7 +70,7 @@ public final String signature() {
if ( asc) return "nu";
return null;
}

/*
private final static long cardinalI(final byte[] key) {
// returns a cardinal number in the range of 0 .. Long.MAX_VALUE
long c = 0;
Expand All @@ -80,15 +80,34 @@ private final static long cardinalI(final byte[] key) {
c = c >>> 1;
return c;
}
*/
private final static long cardinalI(final byte[] key, int off, int len) {
// returns a cardinal number in the range of 0 .. Long.MAX_VALUE
long c = 0;
int lim = off + Math.min(8, len);
int lim8 = off + 8;
while (off < lim) c = (c << 8) | ((long) key[off++] & 0xFF);
while (off++ < lim8) c = (c << 8);
c = c >>> 1;
return c;
}

public final long cardinal(final byte[] key) {
if (this.zero == null) return cardinalI(key);
final long zeroCardinal = cardinalI(this.zero);
final long keyCardinal = cardinalI(key);
if (this.zero == null) return cardinalI(key, 0, key.length);
final long zeroCardinal = cardinalI(this.zero, 0, this.zero.length);
final long keyCardinal = cardinalI(key, 0, key.length);
if (keyCardinal > zeroCardinal) return keyCardinal - zeroCardinal;
return Long.MAX_VALUE - keyCardinal + zeroCardinal;
}


public long cardinal(final byte[] key, int off, int len) {
if (this.zero == null) return cardinalI(key, off, len);
final long zeroCardinal = cardinalI(this.zero, 0, this.zero.length);
final long keyCardinal = cardinalI(key, off, len);
if (keyCardinal > zeroCardinal) return keyCardinal - zeroCardinal;
return Long.MAX_VALUE - keyCardinal + zeroCardinal;
}

public final static byte[] encodeLong(long c, int length) {
final byte[] b = new byte[length];
while (length > 0) {
Expand Down Expand Up @@ -148,10 +167,26 @@ public final int compare0(final byte[] a, final int aoffset, final int alength,
return sig(az - bz);
}

public static final boolean equal(final byte[] a, final byte[] b) {
public final boolean equal(final byte[] a, final byte[] b) {
if ((a == null) && (b == null)) return true;
if ((a == null) || (b == null)) return false;
if (a.length != b.length) return false;
int astart = 0;
int bstart = 0;
int length = a.length;
while (length-- != 0) {
if (a[astart++] != b[bstart++]) return false;
}
return true;
}

public final boolean equal(final byte[] a, int astart, final byte[] b, int bstart, int length) {
if ((a == null) && (b == null)) return true;
if ((a == null) || (b == null)) return false;
return compares(a, 0, a.length, b, 0, b.length) == 0;
while (length-- != 0) {
if (a[astart++] != b[bstart++]) return false;
}
return true;
}

public static final int compares(final byte[] a, final int aoffset, final int alength, final byte[] b, final int boffset, final int blength) {
Expand Down

0 comments on commit 65784eb

Please sign in to comment.