hentry e;
instr_time t0,
t1,
- t2;
+ t2,
+ t3;
INSTR_TIME_SET_CURRENT(t0);
}
INSTR_TIME_SET_CURRENT(t2);
+
+ for (i = 0; i < 1000000; ++i)
+ {
+ bool ok;
+
+ e.key = i;
+ ok = CHashDelete(chash, &e);
+ if (!ok)
+ elog(LOG, "delete %u: not found", i);
+ ok = CHashDelete(chash, &e);
+ if (ok)
+ elog(LOG, "delete %u: found twice", i);
+ }
+
+ INSTR_TIME_SET_CURRENT(t3);
+ INSTR_TIME_SUBTRACT(t3, t2);
INSTR_TIME_SUBTRACT(t2, t1);
INSTR_TIME_SUBTRACT(t1, t0);
- elog(LOG, "inserts: %lu us; searches: %lu us",
+ elog(LOG, "inserts: %lu us; searches: %lu us; deletes: %lu us",
(unsigned long) INSTR_TIME_GET_MICROSEC(t1),
- (unsigned long) INSTR_TIME_GET_MICROSEC(t2));
+ (unsigned long) INSTR_TIME_GET_MICROSEC(t2),
+ (unsigned long) INSTR_TIME_GET_MICROSEC(t3));
PG_RETURN_VOID();
}
return e != NULL;
}
+static bool
+dynahash_delete(uint32 key)
+{
+ uint32 hashcode;
+ hentry *e;
+ LWLockId lockid;
+
+ hashcode = get_hash_value(dynahash, (void *) &key);
+ lockid = dynahash_get_lock(hashcode);
+ LWLockAcquire(lockid, LW_SHARED);
+ e = hash_search_with_hash_value(dynahash, (void *) &key,
+ hashcode, HASH_REMOVE, NULL);
+ LWLockRelease(lockid);
+
+ return e != NULL;
+}
+
Datum
test_dynahash(PG_FUNCTION_ARGS)
{
uint32 i;
instr_time t0,
t1,
- t2;
+ t2,
+ t3;
INSTR_TIME_SET_CURRENT(t0);
}
INSTR_TIME_SET_CURRENT(t2);
+
+ for (i = 0; i < 1000000; ++i)
+ {
+ bool ok;
+
+ ok = dynahash_delete(i);
+ if (!ok)
+ elog(LOG, "delete %u: not found", i);
+ ok = dynahash_delete(i);
+ if (ok)
+ elog(LOG, "delete %u: found twice", i);
+ }
+
+ INSTR_TIME_SET_CURRENT(t3);
+ INSTR_TIME_SUBTRACT(t3, t2);
INSTR_TIME_SUBTRACT(t2, t1);
INSTR_TIME_SUBTRACT(t1, t0);
- elog(LOG, "inserts: %lu us; searches: %lu us",
+ elog(LOG, "inserts: %lu us; searches: %lu us; deletes: %lu us",
(unsigned long) INSTR_TIME_GET_MICROSEC(t1),
- (unsigned long) INSTR_TIME_GET_MICROSEC(t2));
+ (unsigned long) INSTR_TIME_GET_MICROSEC(t2),
+ (unsigned long) INSTR_TIME_GET_MICROSEC(t3));
PG_RETURN_VOID();
}