【问题标题】:i++, i=i+1 and i+=1 which one is faster? [duplicate]i++, i=i+1 和 i+=1 哪个更快? [复制]
【发布时间】:2015-05-24 15:06:41
【问题描述】:

我很想知道i++i+=1i=i+1 中哪一个在 CPU 中运行得最快,我如何测量它们的执行时间?

【问题讨论】:

  • 你的意思是什么cpu? i 的类型是什么?
  • 这里 i 是整数类型和任何 CPU。
  • 很有可能,除非i 被标记为volatile int,否则会为所有三个生成相同的代码并且运行时速度没有差异。
  • 如果有性能差异,那就太小了
  • here is 大约只有 100 个 intels cpu,here is 不同的架构,你想比较哪个“任何”?

标签: c operator-overloading operators overloading


【解决方案1】:

嗯,起初人类发明了以下记录。

i = i+1; 

然后随着硬件方面的成就,主流发明了以下记录

i += 1;

最后由于计算机科学的进步,人类发明了以下记录

++i;

i++;

所有这三种形式的记录都是同一组机器指令的表达式。(当 ++i 和 i++ 是一些更复杂的表达式的一部分时,它们是一个小例外):) 而这组机器指令并不甚至取决于编译器优化的级别。:)

附:当然,我们正在讨论基本类型的这些运算符。为用户定义类型讨论这些运算符没有任何意义,因为它们可以以各种方式重载。

【讨论】:

  • 实际上取决于编译器优化的级别
  • @Lashane 我确定你错了。也许对于某些编译器,它取决于优化级别,但对于好的编译器,它不依赖。它们只是相同机器指令的正式记录。
  • @Lashane:重要的是它没有理由依赖编译器优化。
  • 它有原因:根据优化级别,周围的代码会有所不同,不同的寄存器,缓存状态等。作为一个简单的例子 - 没有优化编译器将生成 add/inc 指令,有优化 - 它可以完全删除这些操作并在编译时计算值
  • @Lashane 你刚才写的与记录的形式完全无关。
【解决方案2】:

除非您有一个严重损坏的编译器,否则它们都会生成完全相同的代码。试一试,看看每个的输出。

【讨论】:

  • 我要补充一点,根据优化级别的代码可能会有所不同,这条指令周围的代码也会影响(因为缓存、超线程等)生成的代码
【解决方案3】:

获取时间戳,并在循环中执行其中一个,并在退出循环时设置时间戳。循环 100 万次,并比较每个循环的结果(例如,每种不同类型的一个定时循环)。如果您使用的是嵌入式系统或非常慢的系统,请减少迭代次数。您只需要足够的循环来实现明显的差异。

编译器是不同的,它们会优化。一个好的编译器可能会为每个编译器生成相同的代码,因此您可能看不到任何区别。

使用您的操作系统提供的最高分辨率时间戳生成函数(如微秒或纳秒)。如果您无法获得足够高分辨率的时间戳函数,请增加迭代次数,以便进行有意义的比较。

还要关闭优化,看看生成的时间是否不同。看看你是否可以让编译器向你展示等效的机器语言,从而获得更多的理解。

【讨论】:

  • 我不认为这是可靠的,因为操作系统在处理中断和其他任务时可能会中断循环,甚至可能会给另一个进程一个时间片..
  • 好点。你可以否定它来提高它的优先级,甚至将它撞到一个实时调度类,这取决于*NIX 之类的操作系统。您也可以多次运行该程序并取平均值。但是,如果您循环了很多次,那么平均值应该足够接近,因为操作系统不会倾向于中断一个循环而不是另一个循环。但这确实意味着纳秒级分辨率不会产生额外的精度。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 2014-10-23
  • 2020-12-28
  • 2012-08-25
  • 2014-02-22
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
相关资源
最近更新 更多