本文主要是介绍天人合一之毕设——准备阶段——4 字典benchmark,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
以往的异构内存研究都是一个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一次吧
函数参数列表中传入的对象不算访问吧?
这篇关于天人合一之毕设——准备阶段——4 字典benchmark的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!