`
febird
  • 浏览: 254297 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

google.sparsetable 实现细节

阅读更多

goolge.sparse*系列容器依赖关系:

 

- sparsetable

   - sparsehashtable

      - sparse_hash_map

      - sparse_hash_set

 

与现有的一些“标准”实现不同,sparsehash table 使用二次探测法,而不是链接,来解决hash冲突。

 

sparse table 就更奇特了,它是一个两级结构,第一级使用直接索引法,而第二级使用的是顺序查找

不过,第二级的尺寸比较小,可以放入cpucache,并且它的顺序查找使用的是popcount(bitmap[i]=count of (j < i and bitmap[j]==1))。在实现中它使用的是字节直接索引法,速度还行。第二级索引使用位图实现,如果值存在,bitmap[i]被置为1,否则为0,当值不存在时,不会消耗内存。具体说:

sparsetable::operator[i]是这样执行的:

 

// google 的代码比较长,并且不够直接
// 用这个直接且较短的代码来表示
value_type& sparsetable::operator[](int i)
{
    int j = i % GroupSize;
    sparsegroup* group = m_groups[i / GroupSize];
    unsigned char* bitmap = group->bitmap;
    if (bitmap[j/8] & 1 << j%8) {
        // value existed
        int valueIndex = popcount(bitmap, j);
        return group->values[valueIndex];
    }
    return s_default_value;
}
 

还有一个顺序查找/插入的地方:group->values是一个value_type数组,它的插入、删除是O(n),当然,在这里,因为n<=GroupSize,而GroupSize是一个编译时常量,并且不太大,google说它是O(1)也不算错。

 

 google.GroupSize的默认值是48, 是为了更好地对齐sparsegroup结构,在64位系统上,sizeof(sparsegroup)==sizeof(void*)+(GroupSize+7)/8 + 2 == 16).。

 

其实,在intel 和 amd 的新cpu的SSE4.2指令集中,有一个popcnt指令,其它一些cpu中也有popcount指令。并且,在icc/msvc/gcc的新版中都有 intrinsic 支持,这比软件实现要快得多。理想上,google应该在检测有cpu支持时就直接用硬件popcount。

gcc 有以下内建函数(相当于msvc/icc的intrinsic),并且可以用于所有实现了popcount指令的cpu

int __builtin_popcount (unsigned int);
int __builtin_popcountl (unsigned long);
int __builtin_popcountll (unsigned long long);

 

根据我的测试: Intel Xeon 64bit ,64bit popcount, cycle unroll 8

硬件popcount比 google 的软件算法快了30倍,而 sparsetable 查询时最慢的地方就在这里,事实上现在大部分主流cpu都支持硬件popcount,希望google可以改进。

 

要开启gcc硬件popcount,加编译选项 -mpopcnt。

 

 

分享到:
评论

相关推荐

    com.google.code.kaptcha:2.3.2 谷歌验证码依赖下载

    4. **简单集成**:对于基于Maven的项目,只需将`com.google.code.kaptcha:2.3.2`添加到项目的`pom.xml`文件中,就可以轻松地引入这个依赖,实现验证码功能。 5. **安全性**:Kaptcha生成的验证码具有一定的安全特性...

    com.google.common.collect jar包

    在Java编程领域,Google提供了一系列强大的工具集,其中就包括`com.google.common.collect`包,它为Java开发者提供了丰富的集合操作和数据结构,极大地提高了开发效率。本文将围绕`google-collect-1.0-rc1.jar`这个...

    com.google.common.collect

    在Java编程领域,`com.google.common.collect`是一个非常重要的包,它是Google的Guava库的一部分。Guava是一个广泛使用的开源库,提供了许多实用的集合框架、缓存、原生类型支持、并发工具、字符串处理等功能。`...

    com.google.zxing.client.j2se.jar下载

    在Java SE环境中,ZXing的客户端组件`com.google.zxing.client.j2se.jar`扮演了关键角色,是开发者实现条码处理功能的重要工具。 1. **ZXing库简介** ZXing库由Google开发,最初是为了Android平台设计,但后来发展...

    com.google.common.jar

    java 工具包com.google.common.jar

    三种方法对web-Google.txt进行pagerank计算,python以稀疏矩阵方法实现单机计算谷歌网页数据计算pageRank值

    三种方法对web-Google.txt进行pagerank计算,1.python以稀疏矩阵方法实现单机计算谷歌网页数据计算pageRank值2.调用networkx库3.调用networkx库,其中pagerank自己实现。

    com.google.gson.Gson 2.8.0 jar包

    截止至2016-12-23,github上com.google.gson.Gson 最新的2.8.0jar包。强大的json字符串解析功能及将字符串转换为json格式。才发现需要这么多分,大家也可以去网盘下载: ...

    谷歌拼音输入法安卓版com.google.android.inputmethod.pinyin_4.5.2.193126728.apk

    谷歌拼音输入法安卓版是谷歌官方推出适用于专为android安卓系统制订的手机输入法。全新谷歌手机输入法具有视觉上质感样式的输入法界面,去掉了键帽的设计,没有了分割的线条,给人一种更加简单、纯粹、统一的感觉,...

    com.google.gson.Gson 2.8.5 jar包

    截止至2018-11-27,github上com.google.gson.Gson 最新的2.8.5jar包。强大的json字符串解析功能及将字符串转换为json格式。我16年上传的免费下载的2.8.0版本不知道为什么变成下载需要50分了

    com.google.zxing两个jar包

    标题中的"com.google.zxing两个jar包"指的是Google开源项目ZXing(Zebra Crossing)的两个Java类库文件。ZXing是一个多格式的一维/二维条码图像处理库,主要用于读取、解码多种条码格式,如QR码、DataMatrix、UPC-A...

    GoogleEarth Pro 6.1.0.5001

    74.125.128.138 kh.google.com 74.125.128.138 www.google.com 72.14.203.101 www.panoramio.com 74.125.39.99 www.google.com 74.125.39.99 kh.google.com 完毕,直接关闭记事本页面即可。 重新启动谷歌地球就可以...

    google TTS jar包 google语音包,com.google.tts

    google TTS jar包 google语音包,com.google.tts google语音工具包 google TTS jar包 google语音包,com.google.tts

    google-maps-api-threejs-layer, 谷歌地图 API层,使用 Three.js 实现超快速动画.zip

    google-maps-api-threejs-layer, 谷歌地图 API层,使用 Three.js 实现超快速动画 用于 谷歌地图 API的 Three.js-层谷歌地图 API层,使用 Three.js 实现超快速动画。用法new ThreejsLayer(options, completeCallback)...

    com.google.tts.apk android 语音包

    android tts 语音包 apk

    com.google.android.webview115.0.5790.138

    Android webview apk 版本:115.0.5790.138,兼容32/64位。

    java使用谷歌zxing实现二维码生成读取

    要生成二维码,主要涉及`com.google.zxing.client.j2se.MatrixToImageWriter`和`com.google.zxing.common.BitMatrix`两个类。首先,创建一个`BitMatrix`对象,将要编码的数据和格式设置好,然后使用`...

    com.google.common guava 18.0 JAR包

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] ...

    GoogleAuthenticator-java实现.zip

    java服务端实现谷歌动态密码验证,包含二唯码字段,阿里身份宝的下载路径为:..._used=&channel=WEB&fdh=no&id_file=012200c6-9b29-11e6-95c0-00163ed833e7&instance=softonic_en&type=PROGRAM&url=...

    FixedTable.7z

    table固定左侧多列,画面中可对多个table进行固定,谷歌、ie都试过没问题;之前实在是网上找不到好的,就自己整合弄了一个,质量没的说,肯定胜过90%其他的;调用简单: 例子是:html+jquery+FixedTable.js $("#...

    google.map.plugin插件下载

    "google.map.plugin.js" 文件很可能是这个插件的核心脚本,包含了实现这些功能的JavaScript代码。 在使用谷歌地图插件时,首先需要在你的项目中引入 "google.map.plugin.js" 文件。这通常通过在HTML文件中添加`...

Global site tag (gtag.js) - Google Analytics