首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在这种情况下,环裂变是有意义的?

为什么在这种情况下,环裂变是有意义的?
EN

Stack Overflow用户
提问于 2012-06-20 16:09:57
回答 1查看 1.3K关注 0票数 9

没有裂变的代码如下所示:

代码语言:javascript
运行
复制
int check(int * res, char * map, int n, int * keys){
    int ret = 0;
    for(int i = 0; i < n; ++i){
        res[ret] = i;
        ret += map[hash(keys[i])]
    }
    return ret;
}

裂变:

代码语言:javascript
运行
复制
int check(int * res, char * map, int n, int * keys){
    int ret = 0;
    for(int i = 0; i < n; ++i){
        tmp[i] = map[hash(keys[i])];
    }
    for(int i = 0; i < n; ++i){
        res[ret] = i;
        ret += tmp[i];
    }
    return ret;
}

备注:

  • 瓶颈是随机访问内存的map[hash(keys[i])]
  • 通常情况下,应该是if(tmp[i]) res[ret++] = i;来避免if,我使用的是ret += tmp[i]
  • map[..]总是0或1

裂变版本通常要快得多,我想解释一下原因。我最好的猜测是,ret += map[..]仍然引入了一些依赖项,从而防止了投机性的执行。

我想知道是否有人有更好的解释。

EN

回答 1

Stack Overflow用户

发布于 2012-06-20 16:13:36

我不认为是数组索引,而是对函数hash()的调用可能导致管道阻塞,并阻止优化的指令重新排序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11123658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档