C++打印10次hello 问题

Timor君 发布于 2012/08/31 23:56
阅读 1K+
收藏 1

连接在http://www.oschina.net/news/32447/print-hello-10-times

print "hello"
print "hello"
print "hello"
print "hello"
print "hello"
print "hello"
print "hello"
print "hello"
print "hello"
print "hello"
print "hello"

评价说不会破坏CPU   流水线。

问题:

1. CPU流水线是怎么破坏的?为什么for会破坏,而这个却不会破坏呢?

加载中
0
小耶果
小耶果
循环不会破坏流水线,但不好的循环会破坏CPU的并序执行.但进入循环会有细微的性能损失(指令地址入栈),所以循环体只有单条指令的话最好循环展开.
0
天国之翼
天国之翼
想想为什么要发明高级语言
0
中山野鬼
中山野鬼

引用来自“小耶果”的答案

循环不会破坏流水线,但不好的循环会破坏CPU的并序执行.但进入循环会有细微的性能损失(指令地址入栈),所以循环体只有单条指令的话最好循环展开.

要看怎么定义流水线。通常破坏流水线,是可以提升性能的。比如预读,预处理,后写出等。

如果是for 循环,编译器比较容易理解单次循环的逻辑关联,并尝试将下一次循环的处理提前进行,这个可能就是原文作者所谓的破流水线的意思,个人猜测。

不使用for ,还有些情况下,会更慢,因为code需要从外部存储器读入进来,如果不凑巧刚好在CPU片内CACHE里没有。

有人会觉得for循环存在条件判断,跳转等动作,所以一定会比散列跑的更慢些,例如这个言论:

”我相信任何编程语言的for循环都不会简单过vim的yy10p的“

其实上述言论很SB。编辑器和编译器完全是两会事。目前的CPU,对for循环的条件判断,跳转等已经有足够的操作,可以简化和降低他们的计算费用。当然这个需要编译器的强力支撑,目前能看到的,C/C++是肯定有的。至于JAVA之类,脚本语言之类,就不要考虑了。而且后两类,并不是用于考虑性能的开发语言。

0
魔方帅帅
魔方帅帅
我觉得说的流水线被破坏是发生了指令周期不对齐的情况。在这里 ,是认为使用For一定会汇编出判断语句。其实不是这样的。如Win32的REP,DSP的RPT,RPTB指令。像打印10条hello串的情况,由于循环结束条件是常量,并且语句块只有一条。很容易使用这种块重复指令来完成的。所以此时的For肯定不会生成破坏流水线的指令。
0
中山野鬼
中山野鬼

引用来自“魔方帅帅”的答案

我觉得说的流水线被破坏是发生了指令周期不对齐的情况。在这里 ,是认为使用For一定会汇编出判断语句。其实不是这样的。如Win32的REP,DSP的RPT,RPTB指令。像打印10条hello串的情况,由于循环结束条件是常量,并且语句块只有一条。很容易使用这种块重复指令来完成的。所以此时的For肯定不会生成破坏流水线的指令。
如果讨论for 里print的问题,那么就没有流水线讨论的意义了。光print本身的函数调用就已经远大于一个简单的for循环的成本了。因此,无论怎么说,调一次print肯定更快。哈。 当然从另一个极端来解释,如果是常量,会依次压入栈中,传入给print,那么压栈的成本如何,也可能影响速度,但这个要看print内部返回的时间费用究竟多少。 不过print中,应该存在向外部驱动的缓冲推数据的过程,就是一个COPY因此很难想象print的时间会比压栈少。
0
魔方帅帅
魔方帅帅

引用来自“中山野鬼”的答案

引用来自“魔方帅帅”的答案

我觉得说的流水线被破坏是发生了指令周期不对齐的情况。在这里 ,是认为使用For一定会汇编出判断语句。其实不是这样的。如Win32的REP,DSP的RPT,RPTB指令。像打印10条hello串的情况,由于循环结束条件是常量,并且语句块只有一条。很容易使用这种块重复指令来完成的。所以此时的For肯定不会生成破坏流水线的指令。
如果讨论for 里print的问题,那么就没有流水线讨论的意义了。光print本身的函数调用就已经远大于一个简单的for循环的成本了。因此,无论怎么说,调一次print肯定更快。哈。 当然从另一个极端来解释,如果是常量,会依次压入栈中,传入给print,那么压栈的成本如何,也可能影响速度,但这个要看print内部返回的时间费用究竟多少。 不过print中,应该存在向外部驱动的缓冲推数据的过程,就是一个COPY因此很难想象print的时间会比压栈少。
那当然,这里主要在考虑for的开销。考虑print的开销的话就没必要For了。这里压栈的开销肯定是单周期的。Print内部的话就不好说了。
0
Windoze
Windoze

print "hello hello hello hello hello hello hello hello hello hello"

这样就不会破坏流水线神马的啦…………

返回顶部
顶部