代码性能——盘点数据结构设计方案

每种数据类型都有一个与之相关的队列,这个队列是由处理器架构而非这个语言本身授权的。校准数据元素允许处理器以高效的方式从内存中抓取数据,并由 此提高性能。为了提供最佳的性能,编译器试图保持这种数据元素的队列。在32位和64位的Linux系统上,英特尔®C++编译器上使用着的数据类型典型 对齐要求如下:

Data Type

32-bit(bytes)

64-bit(bytes)

char

1

1

short

2

2

int

4

4

long

8

8

float

4

4

double

8

8

long long

8

8

long double

4

16

Any pointer

4

8

一般情况下,编译器会在任何可能的时候都满足这些数据元素的对齐要求。在使用英特尔®C++和Fortran编译器的情况下,可以使用 -align(C/C++,Fortran语言)编译器开关来强制或禁止自然对齐规则。对于通常含有不同类型的数据元素的结构,编译器试图通过在元素之间 插入未使用的存储来保持的数据元素实现正确对齐。这种技术被称为“填充”。此外,编译器还会以它的最严格的对准成员为基准来对齐整个结构。编译器也可能会 增加结构的空间大小,必要的时候,编译器会通过在结构端部添加填充的方式来使其实现成倍的对齐。这就是所谓的“尾填充”。如此一来,填充就医浪费存储空间 的代价提升了性能。如果是英特尔®至强融核™协处理器,提供给应用程序可用存储的数量本身是有限的,这会带来一个严重的问题。

最佳设计方案:最大限度地减少内存浪费

开发者可以通过给结构元素排序来最小化这种内存浪费,这样最大/最宽的元素会排在前面,接着是第二宽的,依次排开。下面的这个例子能为你阐明用结构的空间大小给数据元素排序影响:

代码数据结构

结构s1有11个填充字节,如下表所示:

代码数据结构

看看下面的结构s2:

代码数据结构

这个结构只包含了3个尾填充的字节,如下图所示:

代码数据结构

这样就节省了内存。因此,仅仅在结构定义中重排数据元素就有可能避免内存浪费。

最佳设计方案:一次只接触几个元素

这种给元素排序的一种例外是,如果你的结构比你的高速缓存线(在因特尔至强融核协处理器上是64个字节)更大的话,一些循环或内核就只能接触到结构的一部分。在这种情况下,保持结构的各部分能在内存中一起被接触到可能是有益的,这可能会改善高速缓存局部性。

最佳设计方案:分解更大的结构

如果你的结构比高速缓存线更大,并且一些循环和内核只能接触到结构的一部分的话,你可以考虑下通过把大结构分解为多个以单独的排列存储的更小的结构。这就潜在地提升了可接触数据的密度,incident提升了高速缓存的局部性。

最佳设计方案:强制对齐特定的元素

你也可以使用_decipsec(align)属性来指导编译器比用其他方式更严格地对齐数据,这个扩展属性的语法如下:

C/C++:

_decipsec(align(n))<数据类型声明>

Fortran:

cDEC$ATRIBUTES ALIGN:n::<数据类型声明>

这里的n是要求的队列,是2的乘幂,在英特尔C++编译器里最大为4096,在英特尔Fortran编译器里最大是16384.你可以使用这个属性 为单个变量,静态结构或自动存储持续期间内请求对齐。然而,这就表示,尽管你提高结构的一致性,但这个属性并不能调整结构内元素的对齐。通过把 _declpsec(align)放在关键字struct前面,你就为仅仅这种类型的对象请求适当的对齐。让我用下面这个例子来说明我的观点:

代码数据结构

在上述示例中,对字符a2和整数b2的对齐仍然各自保持为1个字节和4个字节,这是默认的。然而,结构s2的每个实例都被对齐到32个字节的边界,正如_declspsec声明里描述的那样。因此,结构s1内部的结构s2目前的每个实例都将对齐到32个字节的边界。

最佳设计方案:动态分配内存对齐

我们还可以通过动态分配结构s2的排列来进一步扩展这个例子:

代码数据结构

这种情况下,你仍然需要使用_mm_malloc或一个相当于为指针分配对齐内存的可移植性操作系统接口(POSIX),但通过使用_declspec(align(32)),你就是要为排列arr1中的每一个元素都强制对齐到32个字节。

最佳设计方案:使用align(n)和结构来强制小数据元素的高速缓存局部性

你也可以使用这个数据对齐支持来为高速缓存线使用最优化提供优势。通过把平常经常在一起使用的小对象聚集到一个结构里,并强制这个结构从高速缓存线 的起始端分配内存,你就能有效地保证每一个对象在需要的时候都能及时地被装载进高速缓存里,这样会有很明显的性能提升。例如,考虑i和j这两个被频繁调用 的变量,他们可能会被分配到不同的告诉缓存线上。你可以像下面这么来声明它们:

代码数据结构

通过使用这种方式声明变量,编译器就能确保这些变量被分配在同一个高速缓存线上。

慧都提供【正版IDE联合推广计划】,各种IDE低至半价出售(截止日期2014/12/31)。另外还有5折限时抢购免费领iPhone 6、iPad air等好礼!


转载于:https://my.oschina.net/evget/blog/354037

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5.系统数据结构设计 5。1逻辑结构设计要点 1. 用户信息表(user) 用户(用户编号,用户账号,用户真实姓名,密码,头像,性别,地址,电话,Ema il,注册时间,collect—id,用户类型) 2. 商品信息表(goods) 商品(商品编号,商品名称,编号,商品价格,图片名,商品类型,发布时间,发 布者编号,商品描述,被收藏数量) 3. 商品类型表(goods_type) 商品类型(类型编号,商品类型名称,描述) 4. 用户收藏表(goods_collect) 用户收藏(编号,用户编号,收藏时间,收藏的商品) 5. 管理员信息表(User) 管理员(管理员编号,账号,密码,Email,状态,注册时间) 6. 商品评论表(goods_comment) 评论表(编号,用户账号,商品编号,星级,评论时间,状态,评论内容) n 1 1 1 n n n 1 n 1 图14: E-R图 5。2物理结构设计要点 1. 用户信息表(user) 序号 "字段名 "字段含义 "类型 "长度 "默认值 "允许空 "主键 "说明 " "1 "user_id "用户编号 "int "11 "1 "否 "是 "自动递增 " "2 "username "用户账号 "varchar "32 " "否 " " " "3 "ralname "用户姓名 "varchar "8 " "否 " " " "4 "user_pwd "密码 "char "40 " "否 " " " "5 "user_picname "头像 "varchar "32 " " " " " "6 "sex "性别 "varchar "2 "1 "否 " " " "7 "address "地址 "varchar "255 " "否 " " " "8 "phone "电话 "varchar "20 " "否 " " " "9 "email "邮箱 "Varchar "50 " "否 " " " "10 "regtime "注册时间 "Datetime " " " " " " "11 "collect_id "收藏编号 "Int "11 " " " " " "12 "Select_identity "用户类型 "Varchar "32 " "否 " " " " 2. 商品信息表(goods) 序号 "字段名 "字段含义 "类型 "长度 "默认值 "允许空 "主键 "说明 " "1 "goods_id "商品编号 "int "11 "1 "否 "是 "自动递增 " "2 "goods_name "商品名称 "varchar "32 " "否 " " " "3 "goods_number "编号 "varchar "11 " "否 " " " "4 "goods_price "商品价格 "double "8,2 " "否 " " " "5 "goods_picname "商品图片 "Varchar "32 "暂无图片信息 " " " " "6 "goods_modelsid "商品类型 "Int "11 " "否 " " " "7 "goods_licence "发布时间 "Datetime " " "否 " " " "8 "goods_ownerid "发布者编号 "Int "11 " "否 " " " "9 "goods_description "商品描述 "Tinytext " " " " " " "10 "goods_collect "被收藏数量 "Int "11 "0 " " " " " 3. 商品类型表(goods_type) 序号 "字段名 "字段含义 "类型 "长度 "默认值 "允许空 "主键 "说明 " "1 "tytpe_id "类型编号 "int "11 "1 "否 "是 "自动递增 " "2 "type_name "类别名称 "varchar "32 " "否 " " " "3 "type_desc "类别描述 "varchar "200 " " " " " " 4. 评论表(goods_comment) 序号 "字段名 "字段含义 "类型 "长度 "默认值 "允许空 "主键 "说明 " "1 "Comment_id "评论编号 "Int "11 "1 "否 "是 "自动递增 " "2 "comment_userid "用户编号 "int "11 " "否 " " " "3 "comment_goodid "商品编号 "int "11 " "否 " " " "4 "comment_common " "int "11 " " " " " "5 "comment_bad " "int "11 " " " " " "6 "comment_content "评论内容 "text

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值