就处理器资源而言,软件膨胀-为什么有时新版本的应用程序比旧版本慢得多?

序幕


那是一个正常的星期四晚上。我下班回来,坐在笔记本电脑上,打开它,启动Skype,开始习惯性地等待它最终完全启动。然后我突然想到-为什么加载需要这么长时间,甚至系统显然也很难承受这个过程?

我决定调查任务管理器,以估计Skype在后台消耗了多少资源。但是首先,进行一些初步计算。以及这应该消耗多少资源?我现在说的是背景。那些。没有视频连接时,我什至不和任何人说话。所有这些就是联系人列表(以图标和名称的形式显示)以及一个可以在其中进行选择的菜单。

那些。实际上,这是一种形式,您可以从中启动其他菜单。此表单上有一个列表。还有一个用于向某人输入消息的文本框,还有几个按钮。大约15年前,当我用Delphi编写程序时,这样的应用程序(一种形式)重达几百千字节。当然,自那时以来,开发环境开始消耗更多的资源,视觉组件变得更加丰富。但是,即使取得了这一进展,后台的Skype的最大重量仍应在10兆字节左右。毕竟,我既不与任何人交谈也不打电话给我,我还能在那花多少钱?

您可以看一下这个问题,另一方面,正如数学家所说,它是等效的。在没有视频通话和麦克风对话的情况下,Skype提供了一个机会来查看哪些对话者当前在网络上,还可以向他发送文本消息,并接收某人的响应文本消息。那些。它本质上是ICQ-那么,很可能,在后台,Skype最多应该占用ICQ?现在让我们在实践中检查这些计算。我们在TaskManager中查看内存消耗:

图片

Skype是否占用158 MB的内存?您是否认真考虑QIP为35 MB?好吧,35 MB可能太大了,应该对此进行整理,但是我的笔记不是关于此的。我们现在谈论Skype。为什么要占用这么多资源-是QIP的近五倍?对于带有联系人列表的一种表单来说,这有点太多了,不是吗?

有趣的是,这个问题不仅与我有关,如果您开车进入Google“ 为什么Skype会消耗这么多的内存 ”,那么论坛上各种讨论的脚印就会落伍,为什么新版本的Skype如此重要。答案特别令人高兴。例如,在Skype社区论坛上的真实答案(我引用了答案的免费翻译):

, ? 4-8 . 140 , .


是的,是的 当然。如果是这样,那么所有软件开发人员都将进行推理,那么那样的话“ 没有充裕的精力是不够的”问题不是我为Skype的内存感到抱歉(我也很抱歉)。问题是,新版本的Skype(与旧版本相比)中新增的功能有哪些如此新,以至于它们需要那么多的内存?

但这没关系,我对另一个问题更感兴趣-后台使用Skype的处理器也并没有真正放松,并定期显示了满负荷。出现了一个问题,“为什么以及如何摆脱这种情况?”。实际上,问题听起来应该是这样的-开发人员如何管理创建如此庞大的应用程序?以及如何处理呢?

一点历史


当然,该站点的任何访问者可能至少一次听说过摩尔关于提高系统性能的法律。 “ 免费午餐结束”一文提供了这样一个奇怪的画面:

图片

如您所见,在2004年的某个时候,处理器的时钟频率达到了上限。在最近的十年中,这种频率并没有特别增加。难道摩尔定律不再得到满足吗?实际上,没有,并且该文章清楚明确地说明了原因。简而言之,由于其他因素(缓存和多核),我们的计算机性能现在正在提高。但是要注意的是,普通的单线程应用程序将无法加快这些因素。这就是问题所在。事实上,当今许多软件制造商的行为似乎仍然是80年代或90年代,并且就减少时钟周期数而言的软件优化并不构成特殊问题-您可以稍等片刻,处理器将快多了。

这不仅适用于Microsoft,而且我将重点介绍其具体示例。 Joel Spolsky在他的文章中提到,由于Lotus经理犯了一个关键错误-他们试图优化应用程序,因此在80年代Excel和123的较量中,微软成功地超越了Lotus 。具体来说,他们尝试缩小应用程序,以便始终保证可以容纳640 KB的RAM。他们将其杀死了一年半,在此期间,雷德蒙德(Redmond)使用Excel占领了市场,因为那时正在运行具有大量RAM的计算机。此解决方案使Lotus付出了很多代价。

但是,有趣的是-如今,这样的策略可能最终会取得成功-因为标准台式机系统的资源不再像20-30年前那样以惊人的速度增长。问题在于,由于那段时期的激烈竞争,开发应用程序功能的公司是赢家,而忽略了性能和优化。正是这些公司形成了这种发展思想,我们仍在收获其成果。

通货膨胀


这导致了什么?来一个很奇怪的现象。我永远不会放弃硬件升级,但是最近突然间,由于可能发生的通货膨胀,我开始避免不必要地进行软件升级。用这个术语来说,我的意思是我在旧版本中拥有相同的功能集,在新版本中,我以处理器资源和RAM的价格获得了高昂的代价。

英语有一个稳定的成语,俄语中的成语听起来像是“试图修复未损坏的东西”。过去10年中软件的状况非常让人联想到这种习语。 Skype是其中的主要示例之一。通过论坛判断,此内存问题在旧版本的Skype中不存在,例如在3.x版本中。从那以后产品在性能方面有什么改进,以至于RAM变得如此昂贵?

顺便说一句,这同样适用于各种聊天应用程序。大约15年前,聊天(一次占用30 MB的RAM)看起来像胡说八道。但是,尽管当前的聊天室为我们提供了什么,而当时还没有提供,但现在这已经成为一种规范。

不要忘记Microsoft Office。我认为XP的版本令所有人满意。当然,像任何产品一样,它也有缺点。但是他们是否如此关键以至于需要发布2007、2010等版本?我在其中创建了相同的文档,但是现在我必须等待更长的时间,直到这些系统启动。

有道理,我们听说新版本包含新功能。是的,我不否认这一点,但是这样做似乎并不奇怪,旧的机会需要更多的资源吗?

模块化和优化


不过,为什么还要增加资源?在这里,所有情况都可以通过大多数应用程序都是整体的事实来解释。不可以,在组织代码方面,它们可能按照正确的职责划分为多个模块。但是,我称它们为整体式的意思是,在加载应用程序时,通常会立即加载其所有模块,尽管通常不需要这样做。

我们将再次返回Skype。现在显然已经制作完成,因此只需简单的登录,即可将许多模块立即加载到RAM中,这些模块直接负责声音,视频等。尽管事实上,通常的输入仅需要一个用户列表,并且具有交换文本的能力。该系统可以以其他方式完成,仅加载最必要的系统。仅当用户想要真正开始视频交换时,其他所有内容都将加载。

由于开发人员实际上无法从头开始开发所有代码,但是被迫使用编写时没有太多优化压力的现有库,因此优化也很重要。

想象一下,每个库的开发人员将其库的速度降低了5%,而如果他花了更多精力进行优化的话。假设库1在其工作中使用库2,而库3和该库4在这种情况下。在延迟累积的情况下,由15个库组成的链得到的结果为1.05 ^ 15 = 2.07,即。在最坏的情况下,应用程序的运行速度是任何组件的两倍。

我很熟悉这样的短语,即过早的优化是万恶之源。但是,这是一个过早的优化,而不是优化。当处理器在我们眼前变得越来越快的时候,这个口号真是太棒了。达到上限后,此口号开始转向横向,大约15年前编写的旧版本的应用程序突然看起来比上周发布的版本更可取。顺便说一句,人们一定会注意到这样一个事实,即软件制造商经常试图迫使用户更新软件,这恰恰是因为在这种情况下没有特殊的动机为消费者带来利益。

替代例子


原则上,软件行业期望与70年代石油危机之后的汽车行业相同,当时很明显,汽油已成为极其昂贵的资源。从那以后,如果我没记错的话,汽车公司已经能够将发动机的能耗降低约三分之一。

在软件领域,也有这样的例子。有一次,我真的很喜欢Erlang,它基于许多独立的轻量级进程的概念,这些进程仅由常见消息结合在一起(这使您可以充分利用多核)。此外,在此环境中,有一个从LISP解释器中明确借鉴的原理-每个模块和功能都可以在旅途中随时加载和重新加载(任何过程都一样)。

为了进行比较,在Glassfish上,如果您更改了数百或数千个类之一,则需要重新安装整个模块(war / ear / jar)。可以随时随地进行函数或类的热交换,但是与Erlang相比,它的实现非常差。

该行业的未来在于可以充分利用多核技术并且不会立即下载该产品中所有功能的所有可能模块的应用程序。那些。该程序将能够加载基本配置,并消耗其15年前消耗的资源,并在必要时下载用户在旅途中需要的所有内容。

All Articles