Changeset 322e76d


Ignore:
Timestamp:
Jun 21, 2013 3:13:37 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
bb100de
Parents:
1444f12
Message:

speed up XORComparators

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/net/i2p/kademlia/XORComparator.java

    r1444f12 r322e76d  
    33import java.util.Comparator;
    44
    5 import net.i2p.data.DataHelper;
    65import net.i2p.data.SimpleDataStructure;
    76
     
    2221
    2322    public int compare(T lhs, T rhs) {
    24         byte lhsDelta[] = DataHelper.xor(lhs.getData(), _base);
    25         byte rhsDelta[] = DataHelper.xor(rhs.getData(), _base);
    26         return DataHelper.compareTo(lhsDelta, rhsDelta);
     23        // same as the following but byte-by-byte for efficiency
     24        //byte lhsDelta[] = DataHelper.xor(lhs.getData(), _base);
     25        //byte rhsDelta[] = DataHelper.xor(rhs.getData(), _base);
     26        //return DataHelper.compareTo(lhsDelta, rhsDelta);
     27        byte lhsb[] = lhs.getData();
     28        byte rhsb[] = rhs.getData();
     29        for (int i = 0; i < _base.length; i++) {
     30            int ld = (lhsb[i] ^ _base[i]) & 0xff;
     31            int rd = (rhsb[i] ^ _base[i]) & 0xff;
     32            if (ld < rd)
     33                return -1;
     34            if (ld > rd)
     35                return 1;
     36        }
     37        return 0;
    2738    }
    2839}
  • router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java

    r1444f12 r322e76d  
    33import java.util.Comparator;
    44
    5 import net.i2p.data.DataHelper;
    65import net.i2p.data.Hash;
    76
    87/**
    98 * Help sort Hashes in relation to a base key using the XOR metric.
    10  * Warning - not thread safe.
    119 */
    1210class XORComparator implements Comparator<Hash> {
    1311    private final byte[] _base;
    14     private final byte[] _lx, _rx;
    1512
    1613    /**
     
    1916    public XORComparator(Hash target) {
    2017        _base = target.getData();
    21         _lx = new byte[Hash.HASH_LENGTH];
    22         _rx = new byte[Hash.HASH_LENGTH];
    2318    }
    2419
     
    2722     */
    2823    public int compare(Hash lhs, Hash rhs) {
    29         DataHelper.xor(lhs.getData(), 0, _base, 0, _lx, 0, Hash.HASH_LENGTH);
    30         DataHelper.xor(rhs.getData(), 0, _base, 0, _rx, 0, Hash.HASH_LENGTH);
    31         return DataHelper.compareTo(_lx, _rx);
     24        byte lhsb[] = lhs.getData();
     25        byte rhsb[] = rhs.getData();
     26        for (int i = 0; i < _base.length; i++) {
     27            int ld = (lhsb[i] ^ _base[i]) & 0xff;
     28            int rd = (rhsb[i] ^ _base[i]) & 0xff;
     29            if (ld < rd)
     30                return -1;
     31            if (ld > rd)
     32                return 1;
     33        }
     34        return 0;
    3235    }
    3336}
Note: See TracChangeset for help on using the changeset viewer.