为什么要做算法性能分析

为什么要做性能分析

  在一个软件项目中,有很多重要的事情需要软件开发人员注意,例如用户的体验性,安全性,维护性等等方面的,但是为什么我们需要担心性能呢?我们可以通过性能强悍的计算机解决性能问题吗?其实以上问题的答案是简单而直接的的!

  • 一个应用只有拥有良好的性能表现,我才能直接或间接的解决上述问题,如果性能不佳,那么即使解决了上述问题,应用也不能称之为一个好的应用。

  • 如果计算机是无限快的,那么用于解决某个问题的任何正确的算法都可行的,但是你希望找到最快的,最简单,容易实现的办法。但是显而易见的是计算机并不是无限快的,计算的硬件性能也是有一定的上限的,存储也许是廉价的,但也不是免费的,所以计算时间,存储空间都是一种有限的资源,你应该合理的、明智的使用这些资源,在时间或者空间方面选择更加行之有效的算法都将会帮助你合理的利用资源。

  我们用一个效率问题来形象的解释机器性能和算法之间的一些有趣又不那么显而易见的关系!为求解相同的问题设计的不同的算法在效率方面尝尝具有显著的差别,这些差别可能比由于硬件和软件造成的差别要重要的多,让我们一起来看看吧 🔥,我们先给出数组排序问题的两个算法的分析结论,然后比较这两个算法的时间效率(耗费的时间)之间有多大的差别

  • 归并排序:该算法所耗费的时间大致等于 c 1 n l o g 2 ( n ) c_1nlog_2(n) c1nlog2(n),同样的 c 1 c_1 c1也是一样不依赖于n的常数,n是算法输入的规模,例如排序1000个数字,那么规模就是n就等于100。

  • 插入排序:该算法所耗费的时间大致等于 c 2 n 2 c_2n^2 c2n2,其中 c 2 c_2 c2 是一个不依赖于n的常数,该算法计算所耗费的时间大致上和 n 2 n^2 n2成正比,与归并排序相比,插入排序通常具有一个更小的常数因子,即 c 1 < c 2 c_1<c_2 c1<c2,不过就运行时间而言,常数因子的影响远远不急输入规模n的影响,我们这里特别说明 c 1 < c 2 c_1<c_2 c1<c2也就是为了在接下来的演示中展示常数因子是如何变得可有可无的。

  接下来我们给出一个具体的例子:插入排序会在一台运算速度较快的机器(A)上执行算法,而归并排序将在一台逊色许多的机器(B)上执行算法,输入规模为n=1000万,也就是排序一千万个数的数组,听起来很多,但是以Java为例,一个Int类型的数字占用4个字节,存储范围在[-2,147,483,648~2,147,483,647]之间,完全能够容纳一千万以内的数字,那么输入一千万个数字的数组大约等于( 1000 W × 4 ÷ ( 1024 × 1024 ) = 38 M 1000W \times 4 \div (1024 \times 1024)=38M 1000W×4÷(1024×1024)=38M),所以存储一千万个数字不是太大的问题。

  假设A级器的运算速度是100亿指令/s(当今世界上绝大多数机器都没这么快),而B机器则为1000W指令/s,逊色了一千倍,这非常具有戏剧性和代表性了把,足以说明算法对性能(耗费时间)的作用了吧?🔥,为了更具有说服力,我们假设插入排序是非常牛逼的程序员用机器语言写的,需要的时间是 2 n 2 2n^2 2n2,归并排序是水平一般的程序员用低效的高级编程语言写的,需要的时间是 50 n l o g 2 ( n ) 50nlog_2(n) 50nlog2(n),这表示这两个算法的常数前缀也有25倍的差距,那么归并排序应该死定了吧!!!应该一辈子算不完了把?,而现实是

计算机A需要

2 × ( 1 0 7 ) 条 指 令 ÷ 1 0 10 条 指 令 / s = 20000 s ( 多 于 5.5 小 时 ) 2 \times (10^7) 条指令 \div 10^{10}条指令/s = 20000s(多于5.5小时) 2×(107)÷1010/s=20000s(5.5)

计算机B需要

50 × 1 0 7 条 指 令 ÷ 1 0 7 条 指 令 / s = 1163 s ( 少 于 20 分 钟 ) 50 \times 10^7条指令 \div 10^7条指令/s = 1163s(少于20分钟) 50×107÷107/s=1163s(20)

   结论是通过一个效率较差的机器和编程语言执行归并排序算法的速度居然比用最好的机器和语言执行的插入排序算法快上了17倍!!!oh my god ! shit!!! 💥 💥,我服了。

  更为致命的是随着算法的输入规模的扩展,这个差距没有变小,反而越来越大了!!随着计算机的不断增强,随着信息化时代数据的爆炸式增长,我们会越来越多的使用计算机处理大规模的问题,例如大数据和人工智能,你还会觉得当量子计算机问世的时候咱们就不需要算法了吗?

  正如我们看到的这种现象一样,随着问题规模的扩大,算法之间的效率差别就会变得越来越明显,反而问题规模小的时候无法直观的提现这种差距,所以在比较两个算法谁更好的这个问题上,我们并不能一概而论,更不能通过编写代码执行并计算时间来度量算法是否好坏,结果往往是不准确的,为什么会出现这种现象?这就是我们接下来要分析的问题,而我们分析该现象所使用的方法论就是——渐进分析。

渐进分析

一篇文章不能太多,待后续分解,未完待续…

结语

  是否具有算法知识和技术的坚实基础是区分真正熟练的程序员和一个初学者的一个特征,使用现代计算机技术,如果你对算法懂得不多,你也可以完成一些任务,但是如果有一个好的算法背景,那么你可以做的事情就会更多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值