Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 循环内重复模的优化_C_Optimization_Bitwise Operators - Fatal编程技术网

C 循环内重复模的优化

C 循环内重复模的优化,c,optimization,bitwise-operators,C,Optimization,Bitwise Operators,我的c程序中有这个语句,我想优化它。通过优化,我特别想提到位运算符(但任何其他建议也可以) uint64_t h_one=hash[0]; uint64_t h_two=散列[1]; 对于(int i=0;i如果大小是2的幂,则对大小-1应用按位AND优化“%size”: 所以基本上你在做什么 k_0 = h_1 mod s k_1 = h_1 + h_2 mod s = k_0 + h_2 mod s k_2 = h_1 + h_2 + h_2 mod s = k_1 + h_2 mod s

我的c程序中有这个语句,我想优化它。通过优化,我特别想提到位运算符(但任何其他建议也可以)

uint64_t h_one=hash[0];
uint64_t h_two=散列[1];

对于(int i=0;i如果大小是2的幂,则对大小-1应用按位AND优化“%size”:


所以基本上你在做什么

k_0 = h_1 mod s
k_1 = h_1 + h_2 mod s = k_0 + h_2 mod s
k_2 = h_1 + h_2 + h_2 mod s = k_1 + h_2 mod s
..
k_n = k_(n-1) + h_2 mod s
根据溢出问题(如果大小小于
2**64
的一半,则不应与原始大小不同),这可能会更快(但不太容易并行化):

注意:我不确定这个公式(没有测试过),它更像是一个一般性的想法。这在很大程度上取决于分支预测的好坏(以及性能对预测失误的影响有多大)。而且,只有当步骤很大时,它才可能有帮助

编辑:或更简单(可能具有相同的性能)-感谢神秘:

uint64_t h_one = hash[0]%size;
uint64_t h_two = hash[1]%size;
k_hash[0] = h_one;
for ( int i=1; i<k; ++i )
{
    (uint64_t *) k_hash[i] = ( k_hash[i-1] + h_two );
    if(k_hash[i] > size)
    {
        k_hash[i] -= size;
    }
} 
uint64\u t h\u one=hash[0]%大小;
uint64_t h_two=散列[1]%大小;
k_散列[0]=h_一;
用于(int i=1;i尺寸)
{
k_hash[i]=大小;
}
} 

你知道关于
大小的任何事情吗
?我已经编辑了这个问题,以便按照你的要求澄清一些事情。有一些方法可以使同一个数字上的重复除法/模非常有效。但这不是微不足道的。你能建议一些链接让我读一读吗。这里是:但就像我说的,非微不足道的。制作
大小
2的幂要求太高了,但我们可以把它作为素数,所以你能建议在这种情况下+1吗?如果你能证明
k_hash[i-1],在你的第一种方法中,实际上可以完全去除模+h_-two
永远不会溢出整数。但鉴于它是一个散列,我将假设这些数字几乎是随机的。@Mystical
size
是一个整数,其余的是uint_-64,因此它们不应该溢出(当然,h_-two可以预先缩减)@哈罗德,看起来我们有了一个解决方案。预计算两个%size
并从一个%size开始。然后在每次迭代中,将它添加到累加器中。然后使用if语句测试它是否大于
size
,必要时进行减法。@Mysticial:实际上我的第二个解决方案是大于或小于这个值,除了我预先确定模应该发生的步骤。一个简单的>可能更可读,也同样有效,我会添加它。
k_0 = h_1 mod s
k_1 = h_1 + h_2 mod s = k_0 + h_2 mod s
k_2 = h_1 + h_2 + h_2 mod s = k_1 + h_2 mod s
..
k_n = k_(n-1) + h_2 mod s
uint64_t h_one = hash[0];
uint64_t h_two = hash[1];
k_hash[0] = h_one % size;
for ( int i=1; i<k; ++i )
{
    (uint64_t *) k_hash[i] = ( k_hash[i-1] + h_two ) % size;
} 
uint64_t h_one = hash[0]%size;
uint64_t h_two = hash[1]%size;
k_hash[0] = h_one;
step = (size-(h_one))/(h_two)-1;
for ( int i=1; i<k; ++i )
{
    (uint64_t *) k_hash[i] = ( k_hash[i-1] + h_two );
    if(i==step)
    {
        k_hash[i] %= size;
    }
} 
uint64_t h_one = hash[0]%size;
uint64_t h_two = hash[1]%size;
k_hash[0] = h_one;
for ( int i=1; i<k; ++i )
{
    (uint64_t *) k_hash[i] = ( k_hash[i-1] + h_two );
    if(k_hash[i] > size)
    {
        k_hash[i] -= size;
    }
}