我很好奇,如果有人知道以下哪一项执行得更快(我知道这似乎是一个奇怪的问题,但我想尽可能多地节省时间和资源。)
int i=0;
i+=1;
或
int i;
i=1;
我也很好奇哪种比较更快:
//given some integer i
// X is some constant
i < X+1
或
i<=X
对于那些已经发布答案的人,我很抱歉,我编辑了所以第一部分是正确的,我的意思是如果我被初始化为0.再次抱歉混淆。
答案 0 :(得分:16)
第一个操作可能没有意义,因为除非i
是静态的,否则你已经i
未初始化。
你被误导并专注于错误的事情。猜猜不会让你到任何地方;提供个人资料,分析您的代码,并找出数据哪些部分需要优化。优化是设计更改,无论是不同的数据结构还是算法。
你严重低估了编译器。你所做的一切都不会对这些微小的变化产生影响,两者都会编译到编译器决定的速度更快。如果你想要一个整数,只需做:int i = 1;
并过你的生活。如果你想比较一个整数是否小于或等于X,那么就这样说:i <= X;
。写清洁可读代码。另外,当X处于最大值时,你的两个比较是不一样的;你添加一个就会溢出。
如果你真的很认真,那么:再拔出一个探查器。另一件事是查看生成的程序集并查看它生成的指令。如果您不知道如何做到这一点,那么您可能无法需要优化。 :/
答案 1 :(得分:0)
如果我是你,我会更担心哪一个能给你你想要的结果,因为两者完全不同。事实上,正如你所写的那样,只有一个有可定义的结果。
答案 2 :(得分:0)
在第一个示例中,可能最好使用int i=1;
,尽管速度低于正确性(例如,如果i
具有自动存储功能, int i; i+=1;
会给出未定义的行为。)
第二,如果有任何差异,它可能有利于i <= X;
(但这里也不会有任何差异)。
答案 3 :(得分:0)
第一个可能更快,因为它调用未定义的行为,优化器基本上可以将其视为不存在。但是,我怀疑那不是你想要的。
答案 4 :(得分:0)
我假设你所谈论的变量是本地的(不是全局的)。
如果是这样的话,你写的第一件事: int i; ... 我++; //这发生在一个函数中 是错的。我不相信。如初。
如果我是全球性的,那么我可能会相信它,但除非我知道编译器和运行时环境如何工作,否则我仍然不会相信它。即使这样,优化器也应该将其初始化为0并使其自由。
如果您只是使用简单的整数类型,那么编译器应该处理这种类型的操作。你应该能够在这里检测到的唯一区别是,你的一些变量存储的寄存器可能会被交换,这几乎不重要。这只是在编译器的寄存器分配器中以不同的顺序抛出数据的副作用,我甚至不知道为什么我提出它。哦,是的,我记得为什么我提起它 - 因为如果你碰巧看到了程序集并看到代码生成的差异,你可能不相信我。
通过比较,如果X是变量,那么绝对没有编译器优化,你可能会更好地使用第二个。
我是关于微优化的OCD,我可以向你保证,对于一个愚蠢的编译器来说,这不会为你赢得任何东西。
答案 5 :(得分:0)
有些人是表现方面的专家。我不认为他们中的任何一个会建议你从这么低的水平开始。相反,他们会说,编写你的程序,干净地,然后分析。我让人们求我我猜猜他们的程序可能会变慢,我可以和任何人一样猜测,也就是说,严重。 Here's the method I use to find out what needs to be optimized.