为什么要进行性能分析?
有许多重要的事情需要注意,例如用户友好性,模块化,安全性,可维护性等。为什么要担心性能?
答案很简单,只有具备性能,我们才能拥有上述所有条件。因此,性能就像是一种货币,通过它我们可以购买上述所有商品。学习性能的另一个原因是-速度很有趣!
总而言之,绩效==规模。想象一下,一个文本编辑器可以加载1000页,但是每分钟可以拼写检查1页,或者一个图像编辑器需要1个小时将图像向左旋转90度,或者…就可以了。如果某个软件功能无法应付用户需要执行的任务规模,那将是无与伦比的。
给定一项任务的两种算法,我们如何找出哪一种更好?
一种简单的方法是–实现这两种算法,并在计算机上针对不同的输入运行这两个程序,然后看看哪一个花费的时间更少。这种方法用于算法分析存在许多问题。
1)对于某些输入,第一种算法的性能可能会比第二种更好。对于某些输入,秒表现更好。
2)对于某些输入,第一种算法在一台机器上的性能更好,而第二种算法在另一台机器上对于某些其他输入的性能更好,这也是可能的。
渐进分析是处理算法分析中上述问题的重要思想。在渐近分析中,我们根据输入大小来评估算法的性能(我们不测量实际运行时间)。我们计算,算法占用的时间(或空间)如何随输入大小而增加。
例如,让我们考虑排序数组中的搜索问题(搜索给定项目)。搜索的一种方法是线性搜索(增长的顺序是线性的),另一种方法是二进制搜索(增长的顺序是对数的)。为了了解渐近分析是如何解决上述算法分析中的问题的,让我们说我们在快速计算机A上运行线性搜索,在慢速计算机B上运行二进制搜索,然后选择两台计算机的常量值,以便告诉我们确切地说,给定机器执行搜索所需的时间(以秒为单位)。假设A的常数为0.2,B的常数为1000,这意味着A的强度是B的5000倍。对于较小的输入数组大小n,快速计算机可能会花费更少的时间。但是,在输入数组大小达到一定值之后,即使二进制搜索在速度较慢的计算机上运行,与线性搜索相比,二进制搜索肯定会开始花费更少的时间。原因是二进制搜索相对于输入大小的增长顺序是对数的,而线性搜索的增长顺序是线性的。因此,在输入大小达到一定值后,始终可以忽略与机器相关的常数。
这是此示例的一些运行时间:
线性搜索在A上的运行时间(以秒为单位) :0.2 * n
B上二进制搜索的运行时间(以秒为单位) :1000 * log(n)
------------------------------------------------
|n | Running time on A | Running time on B |
-------------------------------------------------
|10 | 2 sec | ~ 1 h |
-------------------------------------------------
|100 | 20 sec | ~ 1.8 h |
-------------------------------------------------
|10^6 | ~ 55.5 h | ~ 5.5 h |
-------------------------------------------------
|10^9 | ~ 6.3 years | ~ 8.3 h |
-------------------------------------------------
渐进分析是否始终有效?
渐近分析并不完美,但这是可用于分析算法的最佳方法。例如,假设有两种排序算法,分别在计算机上花费1000nLogn和2nLogn时间。这两种算法在渐近上都是相同的(增长顺序为nLogn)。因此,通过渐进分析,我们无法判断哪个更好,因为我们忽略了渐进分析中的常数。
同样,在渐近分析中,我们总是谈论大于恒定值的输入大小。那些大的输入可能永远不会提供给您的软件,并且渐近变慢的算法在特定情况下始终会表现更好。因此,您最终可能会选择一种渐近变慢但对于您的软件来说更快的算法。