我发现VS2005上的标准哈希函数在尝试实现高性能查找时非常缓慢.有哪些快速有效的哈希算法可以解决大多数冲突的好例子?
在我工作的程序中,我有很多代码如下:
pthread_mutex_lock( &frame->mutex );
frame->variable = variable;
pthread_mutex_unlock( &frame->mutex );
Run Code Online (Sandbox Code Playgroud)
如果中间指令可以用原子存储替换,这显然是浪费CPU周期.我知道gcc非常有能力,但是我没能找到关于这种简单的线程安全原子操作的文档.我如何用原子操作替换这组代码?
(我知道简单商店在理论上应该是原子的,但我不希望希望优化器在这个过程的某个时刻不会搞砸他们的原子性.)
澄清:我不需要它们是严格的原子; 这些变量仅用于线程同步.也就是说,线程B读取值,检查它是否正确,如果不正确,它会休眠.因此,即使线程A更新了值并且线程B没有意识到它的更新,这也不是问题,因为这只是意味着线程B在它不需要时就会休眠,并且当它被唤醒时,值将会是对的.
以下代码在GCC中调用clz/ctz的内置函数,在其他系统上调用C版本.显然,如果系统有内置的clz/ctz指令,如x86和ARM,则C版本有点不理想.
#ifdef __GNUC__
#define clz(x) __builtin_clz(x)
#define ctz(x) __builtin_ctz(x)
#else
static uint32_t ALWAYS_INLINE popcnt( uint32_t x )
{
x -= ((x >> 1) & 0x55555555);
x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
x = (((x >> 4) + x) & 0x0f0f0f0f);
x += (x >> 8);
x += (x >> 16);
return x & 0x0000003f;
}
static uint32_t ALWAYS_INLINE clz( uint32_t x )
{
x |= (x >> 1);
x |= (x >> 2);
x |= …Run Code Online (Sandbox Code Playgroud) atomic ×1
c ×1
c++ ×1
gcc ×1
hash ×1
intrinsics ×1
performance ×1
stl ×1
visual-c++ ×1
windows ×1