hol*_*eap 8 c performance struct pointers
假设我们有一些封装在另一个结构中的结构化数据,这样就可以形成一个循环链表.
typedef struct Data
{
int x;
int y;
} Data;
typedef struct DataNode
{
struct DataNode *next;
struct Data *data;
} DataNode;
Run Code Online (Sandbox Code Playgroud)
假设圆形链表正确构造并*head
指向列表的成员,->
在链中使用运算符是否有任何缺点(性能或其他方面),尤其是在循环中?
DataNode * findPrevMatching(int x, int y)
{
// Chained arrow operators in a loop
while (!(head->next->data->x == x && head->next->data->y == y))
head = head->next;
return head;
}
Run Code Online (Sandbox Code Playgroud)
如果我创建局部变量以便没有链式箭头会有什么区别吗?
DataNode * findPrevMatching(int x, int y)
{
DataNode *next = head->next;
Data *data = next->data;
while (!(data->x == x && data->y == y))
{
// Assign head->next to head
head = head->next;
// Assign each local variable, using the new head
next = head->next;
data = next->data;
}
return head;
}
Run Code Online (Sandbox Code Playgroud)
如果您可以创建一个节点数组,在数组中创建前一个和下一个指针索引,并从该池中分配所有节点,那么这可能在给定的体系结构上具有性能优势。连续数组更有可能位于缓存中,您可以告诉操作系统您何时愿意并且不会\xe2\x80\x99t使用该块中的任何节点,例如 或posix_madvise()
,PrefetchVirtualMemory()
您可以使用索引小于指针并获得更小的节点,并且您的 CPU 可能支持间接寻址,这使得查找数组元素与查找指针一样高效。
对于纠正连续取消引用指向行中的多个指针的代码来说,可能发生的最糟糕的事情是一系列缓存未命中(或者实际上是页面错误)。
\n\n不过,要真正回答这个问题,您需要进行分析,找出程序所有时间都花在哪里,重点关注那里,然后再次进行分析,以了解您节省了多少时间。
\n