[cvsnt] Re: CVS lock server

alexey-panchenko at hotmail.ru alexey-panchenko at hotmail.ru
Sat Mar 5 14:17:28 GMT 2005


Tony Hoyle <tmh at nodomain.org> wrote:
TH> It really doesn't make a lot of difference - the time taken to setup the
TH> map and copy the extra strings around offsets the advantages.  The 
TH> common case is maybe half a dozen locks active at a time, where the 
TH> linear scan isn't significantly better than the lookup of a map (in the 
TH> general case 90% of the loop is incrementing a pointer and comparing two 
TH> integers.  If you introduce a map it will always do string compares
TH> which is slower).

To optimize number of compare operations we can redefined comparision
operator.

/* contains upper case value for each character */
unsigned char UpperCaseTable[256];

class LockPtrLessOperator {
public:
  bool operator()(const Lock*& left, const Lock*& right) const {
    if (left->length != right->length) {
      return left->length < right->length;
    }
    const char *path1 = left->path.c_str();
    const char *path2 = right->path.c_str();
    for (int i = 0; i < left->length; ++i) {
      if (UpperCaseTable[(int)path1[i]] < UpperCaseTable[(int)path2[i]]) {
        return true;
      }
    }
    return false;
  }
};

map<Lock*, map<site_t,Lock*>, LockPtrLessOperator>

Without string copying. Compare operations have almost the same cost
as in the current implementation. This solution is more scalable for
large number of concurrent users.

-- 
Best regards,
 alexey-panchenko                            mailto:alexey-panchenko at hotmail.ru




More information about the cvsnt mailing list