博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
看高手是如何抠存储和执行效率的
阅读量:6656 次
发布时间:2019-06-25

本文共 1545 字,大约阅读时间需要 5 分钟。

      今天在分析leveldb(google的bigtable的核心组件之一)代码时看到了如下的一段代码:

leveldb\util\coding.cc

 

char* EncodeVarint32(
char* dst, uint32_t v) {
  
//
 Operate on characters as unsigneds
  unsigned 
char* ptr = reinterpret_cast<unsigned 
char*>(dst);
  
static 
const 
int B = 
128;
  
if (v < (
1<<
7)) {
    *(ptr++) = v;
  } 
else 
if (v < (
1<<
14)) {
    *(ptr++) = v | B;
    *(ptr++) = v>>
7;
  } 
else 
if (v < (
1<<
21)) {
    *(ptr++) = v | B;
    *(ptr++) = (v>>
7) | B;
    *(ptr++) = v>>
14;
  } 
else 
if (v < (
1<<
28)) {
    *(ptr++) = v | B;
    *(ptr++) = (v>>
7) | B;
    *(ptr++) = (v>>
14) | B;
    *(ptr++) = v>>
21;
  } 
else {
    *(ptr++) = v | B;
    *(ptr++) = (v>>
7) | B;
    *(ptr++) = (v>>
14) | B;
    *(ptr++) = (v>>
21) | B;
    *(ptr++) = v>>
28;
  }
  
return reinterpret_cast<
char*>(ptr);
}

 

 

     目标很明确,就是减少int数的内存存储长度,也就是当int小于128时,以一个字节存储,大于128时按数字的大小逐步向上加一个字节,这样最长的整数用二进制表示时最大只有5个字节长度表示就基本上够用了。这还有个名词叫varint,即可变长度整数。无独有偶,在之前我看过云风的开源库pbc时,也看过类似的代码,如下:

 

https://github.com/cloudwu/pbc/blob/master/src/varint.c
 

 

 

_pbcV_encode32(uint32_t number, uint8_t buffer[
10])
{
if (number < 
0x80) {
   buffer[
0] = (uint8_t) number ;
   return 
1;
}
buffer[
0] = (uint8_t) (number | 
0x80 );
if (number < 
0x4000) {
   buffer[
1] = (uint8_t) (number >> 
7 );
   return 
2;
}
buffer[
1] = (uint8_t) ((number >> 
7) | 
0x80 );
if (number < 
0x200000) {
   buffer[
2] = (uint8_t) (number >> 
14);
   return 
3;
}
buffer[
2] = (uint8_t) ((number >> 
14) | 
0x80 );
if (number < 
0x10000000) {
   buffer[
3] = (uint8_t) (number >> 
21);
   return 
4;
}
buffer[
3] = (uint8_t) ((number >> 
21) | 
0x80 );
buffer[
4] = (uint8_t) (number >> 
28);
return 
5;
}
     是不是有些神似?!亲,看来对于存储效率的提升方向,大家还是有一定的共同点的。

 

转载地址:http://lgtto.baihongyu.com/

你可能感兴趣的文章
Linux SSH批量分发管理
查看>>
指定域控制器登录
查看>>
10 alternative careers for burned-out IT workers
查看>>
我的友情链接
查看>>
AngularJS第四课:应用模块化
查看>>
《模式 工程化实现及扩展 (设计模式 C#版)》 - 书摘精要
查看>>
Spring Boot 配置文件 – 在坑中实践
查看>>
mysql二进制日志(bin-log)配置及相关操作
查看>>
LVM+Xen虚拟化应用
查看>>
证书服务器CA的搭建和管理
查看>>
存储过程调用遇到的坑
查看>>
月薪3千与3万文案的区别!一字千金就体现在细微之处
查看>>
***经验16.5.2总结
查看>>
thunar、nautilus右键添加 "压缩/解压"菜单
查看>>
基于jQuery的waterfall(瀑布流)布局
查看>>
heartheat+drbd高可用存储
查看>>
打包压缩
查看>>
将ip转为整数以及整数转为ip的java实现
查看>>
Ubuntu 12.04中文输入法的安装
查看>>
Windows phone开发初体验之-页面导航
查看>>