假设你看到一个像这样的循环:
for(int i=0;
i<thing.getParent().getObjectModel().getElements(SOME_TYPE).count();
++i)
{
thing.getData().insert(
thing.GetData().Count(),
thing.getParent().getObjectModel().getElements(SOME_TYPE)[i].getName()
);
}
如果这是 Java,我可能不会三思而后行。但是在 C++ 的性能关键部分,它让我想修改它......但是我不知道编译器是否足够聪明以至于它是徒劳的。这是一个虚构的示例,但它所做的只是将字符串插入容器中。请不要假设其中任何一个都是 STL 类型,请笼统地考虑以下内容:
- for 循环中有一个混乱的条件每次都会被评估,还是只评估一次?
- 如果这些 get 方法只是返回对对象上成员变量的引用,它们会被内联吗?
- 您是否希望自定义 [] 运算符得到优化?
换句话说,是否值得花时间(仅在性能上,而不是在可读性上)将其转换为以下内容:
ElementContainer &source =
thing.getParent().getObjectModel().getElements(SOME_TYPE);
int num = source.count();
Store &destination = thing.getData();
for(int i=0;i<num;++i)
{
destination.insert(thing.GetData().Count(), source[i].getName());
}
请记住,这是一个紧密的循环,每秒调用数百万次。我想知道的是,所有这些是否会在每个循环中减少几个周期或更重要的东西?
是的,我知道关于“过早优化”的报价。而且我知道分析很重要。但这是一个关于现代编译器的更普遍的问题,尤其是 Visual Studio。