【发布时间】:2011-04-28 13:28:42
【问题描述】:
我有一个关于指针解引用速度的问题。我有这样的结构:
typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
double left;
double top;
double right;
double bottom;
};
我的问题是,哪些会更快,为什么?
案例 1:
TD_RECT *pRect;
...
for(i = 0; i < m; i++)
{
if(p[i].x < pRect->left) ...
if(p[i].x > pRect->right) ...
if(p[i].y < pRect->top) ...
if(p[i].y > pRect->bottom) ...
}
案例 2:
TD_RECT *pRect;
double left = pRect->left;
double top = pRect->top;
double right = pRect->right;
double bottom = pRect->bottom;
...
for(i = 0; i < m; i++)
{
if(p[i].x < left) ...
if(p[i].x > right) ...
if(p[i].y < top) ...
if(p[i].y > bottom) ...
}
所以在情况 1 中,循环直接取消引用 pRect 指针以获取比较值。在情况 2 中,在函数的本地空间(在堆栈上)创建了新值,并将值从 pRect 复制到本地变量。通过一个循环会有很多比较。
在我看来,它们会同样慢,因为局部变量也是堆栈上的内存引用,但我不确定......
另外,最好继续按索引引用 p[],或者将 p 增加一个元素并直接取消引用而不使用索引。
有什么想法吗?谢谢:)
【问题讨论】:
-
不要浪费时间进行过早的优化,因为这种优化很可能不会产生任何影响。
-
也许一小部分很重要,但如果确实如此,为什么不测量它呢?
-
对于Win32,是否可以使用GetTickCount()来测量调用循环测量速度前后的时间,或者有没有更好的方法?
-
@user482910 可以,但要确保多次(例如一百万次以上)运行的平均值,因为在程序运行时上下文切换到另一个进程的可能性适中。
-
“我想念 MSDOS” - 现在有三个我从未想过我会再次听到的词 :-)
标签: c++ c pointers local dereference