我们假设我们有这个结构
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的第一行中创建第一个变量所花费的时间,重量是否更加重要?
我看不出他们两个之间有什么区别,所以如果你这样做,请分享!
编辑:我编辑了这个问题,现在简洁,简单,易于回答。 请重新考虑您将给予的投票。谢谢。
答案 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。