您的位置:首页 > 其它

天人合一之毕设——准备阶段——4 字典benchmark

2018-01-30 21:11 155 查看
 以往的异构内存研究都是一个online的监测预测方式,我做的毕设主要是从程序层面来做对异构内存的放置进行优化。
 要想效果好看一点,就要手写一个仿存特征明显一些的,有意的让他时冷时热,自己控制。
 师兄推荐的是key-value的字典,这样可以进行增删改查,人为的制造数据热点。
 gitup上下载了一个已实现的C程序。
 下面是初步程序分析
1.malloc申请对象
 因为是针对堆区做的,所以只关注malloc的对象(我下的这个程序里用的calloc)
 用到calloc的地方主要有:
 (1)hash_entry结构体

 


(2)hash_entry结构体中的value



(3)计算key的hash值,把key赋值给src



 (4)整个hash表结构体
 


 (5)hash表结构体中的size个hash_entry
 


 (6)字典初始化函数里
 


 总体来说,分配的对象太少了,我还需手动添加一些局部变量的malloc
  特别是在for while循环当中可能存在的整体冷局部热的数据。

 2.对象大小



 每个指针占4个内存,这是dictionary_t和hash_entry_t 4个字节的原因



 16个字节是hash_t结构体占的内存





 264 = 256【KEY_MAX_LEN】+ 2*4(两指针)
 注意:给指针成员分配内存后,还需要给指针指向的地方分配内存
h->array的大小为1024 由sizeof(hash_entry_t * )*HASH_SIZE而的达到



而目前本程序中为4*256=1024
另外两个entry->value 由sizeof(unsigned char)*value_len

完全是根据自己对value的赋值决定,譬如说赋值为“world”则大小为5

3.对象被访问
 可以分别在每个子函数中计算对象被访问次数(一些不会进入的分支不考虑)。
如果将分配对象返回,在上层函数中还会继续使用,还要考虑名字变更的问题(可以考虑直接统一)
如果将分配对象传入,要考虑下层函数对对象的访问

而且还要避免重复命名,提取会很不易,避免短字母组合成为某函数的一部分错误识别

 不确定的地方:
  dict和h都是对象,dict->h算是访问了两个还是一个啊(目前觉得是两个)。
 h是对象,size是h结构体的一部分,h->size计算访问h一次吧

 函数参数列表中传入的对象不算访问吧?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: