回 帖 发 新 帖 刷新版面

主题:请问mltx老师我两个程序的执行速度为什么是反过来的

我编写了一段代码,就是把一个一维实数数组里相同的数放在一起,不讲究大小顺序。
程序一是最逻辑很简单,就是从一个元素起,将其后的元素与它比较,相同就放在后面,是两个do循环。穷尽所有数组。
那时我认为效率不高,比如一个数组已经是相同的元素在一起了,则程序一还是会一个个移动,不能判断相同的就不需要移动。于是我想除了一个程序二。
程序二是这样的,也是两层do循环,加了一些判断条件,同时从两头开始,先判断“第二个”和“倒数第二个”(相对的,见程序)是否与前面(后面)的元素一致,则不需交换。虽然说起来很简单,但是实现起来还是很麻烦。(见附录程序)
但是我通过profile执行时间分析,即使对全相同的元素数组来说,结果还是程序一快很多,你们可以运行看看。
我不能理解,虽然程序二代码多,但是对于相同元素的数组来说,其实际上运行的代码比程序一少很多,就是一个判断,不需要移动。
真是被自己给娱乐了,一开始还满是期待了,花了一个多小时整出来的东西。[em10][em10]
对于程序速度的影响有哪些方面[em18][em18]
编程时追求速度应该遵循一些什么原则,或经验。。[em18][em18]
求教!!!

回复列表 (共8个回复)

沙发

我看到了real型用相等比较,这是最明显的问题

还有另外的编译器优化、分支判断、PGO之类就不说了

板凳


real为什么不能相等比较
不比较怎么知道他们是相同的。
[em18]

3 楼

是不是判断分支严重影响程序的速度,是不是涉及到代码缓存的问题。。

4 楼

real存储在内存里只能是最接近他的一个数字
1.0可能存储成0.99999999

5 楼


我的最新理解,请看是不是正确的
当程序有分支是,就有分支预测这一说,它又与cpu的流水线的级数有关,比如prescott核心就有31级,当预测失败是,就会有39个时间周期的延迟,从而影响速度。
而对于预测的控制,可以通过高级优化来告诉计算机那个分支是最有可能的,提高预测命中率。

6 楼

[quote]real存储在内存里只能是最接近他的一个数字
1.0可能存储成0.99999999[/quote]
是由于涉及到小数,由于二进制很可能不能精确表示十进制的小数,不过1.0应该是1.0
但是不比较,怎么判断相等。有什么解决办法,
实数的等于比较不会太影响速度吧。只是正确性的问题

7 楼

所以程序二运行慢的根本原因是分支太多,因为判断分支大大影响程序的速度。
说错的请指出来。。[em18]

8 楼

实数型的比较一般是用两者之差与一个非常小的数比较,abs(1.0 - 0.9999999999) < 1.0e-7

我来回复

您尚未登录,请登录后再回复。点此登录或注册