最快的“for”循环

时间:2013-03-02 22:48:22

标签: c++ performance loops for-loop struct

我们假设我们有这个结构

struct structure
{
    type element;
    int size;
}

我们是主要的,我们想迭代一些东西。

是否更快

for ( int i = 0; i < structure.size; ++i )

int size = structure.size;
for ( int i = 0; i < size; ++i )

在第一种方法或内存的额外空间,以及在方法n.2的第一行中创建第一个变量所花费的时间,重量是否更加重要?

我看不出他们两个之间有什么区别,所以如果你这样做,请分享!

编辑:我编辑了这个问题,现在简洁,简单,易于回答。 请重新考虑您将给予的投票。谢谢。

5 个答案:

答案 0 :(得分:3)

可能有充分的理由选择一个而不是另一个。如果第一个示例中的循环内容更改了structure.size的值,则会根据当前值连续检查i。但是,在您的第二个选择中,size不会像structure.size那样更改。你想要哪一个取决于问题。不过,我可能会改为size而不是initialSize

如果不是这种情况,你应该停止考虑这种微小的“优化”,而是考虑最具可读性的东西。我更喜欢第一个选择,因为它没有引入不必要的变量名称。当你有两个代码执行相同的操作时,请相信编译器能够找到最佳方法。 你的工作告诉编译器你希望你的程序做什么。 编译器工作以最佳方式完成。

当且仅当您通过测量确定这是必要的优化(我无法想象它将会是)时,您应该选择最快测量的那个。

答案 1 :(得分:0)

您应该允许编译器进行这样的微优化。编写可读代码,使其工作,然后如果它运行缓慢的配置文件并优化它真正需要的地方。

虽然在循环内部你调用一个函数,可以修改这个结构,编译器无法访问它的实现第二个变体可能会有所帮助,因为你给编译器一个提示,它不需要从中重新加载structure.size记忆。我建议使用const:

const int size = structure.size;
for ( int i = 0; i < size; ++i ) {
   somefunc( &structure );
}

答案 2 :(得分:0)

编译代码中不存在任何实际差异,除非它真的是一个真正垃圾优化的古老编译器。像gcc,clang,MSVC或Intel的C ++编译器这样的东西会为这些场景生成完全相同的代码。

当然,如果你开始在循环条件内调用一个函数,并且由循环修改函数处理的数据,例如

std::string str;

cin >> str;
for(int i = 0; i < str.size(); i++)
{
    if (str[i] > 'a') 
       str+= 'B';
}
然后我们有一个不同的故事......

答案 3 :(得分:0)

我不知道您对编译了解多少,但在编译器的各种阶段中,有一个名为代码优化的阶段,它试图改进中间代码(通过执行各种优化技术,如死代码消除,循环转换等),以便生成运行速度更快的机器代码。

所以,实际上你的编译器会照顾你的头痛,我怀疑你会注意到任何性能问题。

答案 4 :(得分:-1)

在第一种方法中,如果 structure 是引用或成员变量,它将无法正确存储到CPU缓存中,因为无法判断它是否已更改为此块

在第二种方法中,由于 size 是当前代码块的局部变量,因此它将正确存储在缓存中。

因此,尽管创建了一个新变量,第二种方法应该更快。

有关更完整的说明,请参阅Load-Hit-Store