【发布时间】:2015-02-10 15:44:45
【问题描述】:
假设我有一个以unsigned int 为键的关联数组;值可以是任何固定大小的类型。有一些预定义的最大数量。实例数。
API 使用示例:MyStruct * valuePtr = get(1234); 和 put(6789, &myStructInstance); ...基本。
当我从这个数组中快速随机读取条目时,我想尽量减少缓存未命中,因此我预先设置了malloc(sizeof(MyType) * MAX_ENTRIES) 以尽可能确保引用的局部性。
泛型对于 values 数组很重要。我看过C pseudo-generics,但为了简单起见更喜欢void *;但是,不确定这是否与性能目标不一致。最终,我想知道什么对性能最有利。
我应该如何实现关联数组以提高性能?到目前为止的想法......
- 我是否向关联数组传递了一个指向
malloced 值数组的void *指针并允许它在内部使用它(为此我们需要保证匹配的键数组大小)?我可以一般地这样做吗,因为需要(?)知道类型才能索引到 values 数组? - 我是否在关联数组中有一个单独的
void * valuePtrs[],然后让这些指针指向malloced 值数组中的每个元素?这似乎可以避免需要了解具体类型? - 我是否使用C pseudo-generics 从而允许
get()返回特定的值类型?当然,在这种情况下,唯一的好处是不必显式转换,例如MyStruct* value = (MyStruct*) get(...)... 数组元素仍然需要取消引用,所以开销相同?
而且,总的来说,上述减少 cahce 失误的方法是否有意义?
【问题讨论】:
-
请考虑展示您如何想象 API 使用数组,这有助于使其更加具体。
-
@unwind 如您所愿,请参阅第二段。
-
是的......对于那些字符串示例,您是否设想数组中存储的数据只是字符串指针,而不是字符串本身?如果它只是指针,那么你当然会使用
void *,因为它可以指向任何东西,然后你的数组就变成了一个“指针数组”。 -
@unwind 好点,实际上,让我调整一下,因为字符串是一个不好的例子。最一般地,值数组将是一个结构数组。编辑:相应更新。
-
是的,字符串是这样的一个坏例子。现在,如果没有泛型,我看不出你如何可以拥有一个返回类型是动态的函数,就像你展示的那样。它必须是
bool get(void *value, const void *key)或类似的东西才能复制一个在编译时大小未知的值。
标签: c performance data-structures collections memory-layout