您要优化什么?[关闭]


19

一般来说,在设计软件时,您通常倾向于哪种类型的优化?

您是喜欢优化设计的人吗?

  • 开发时间(即快速编写和/或易于维护)?
  • 处理时间
  • 存储空间(RAM,DB,光盘等)

当然,这很大程度上取决于要解决的问题的类型以及所涉及的期限,因此,我想听听导致您选择一种优化形式而不是另一种优化形式的原因。


以上所有这三个,但我想提出一个普遍性(与维护有关)。例如,当您花时间设计一个广泛适用于软件需求的真正有效的数据结构并对其进行全面测试时,它将为您服务多年,并避免您不得不编写更多狭窄地适合于解决单个问题的数据结构。问题。

Answers:


40

保养

然后根据需要进行分析并优化速度。我很少需要存储-至少在过去十年中没有。在那之前,我做了。


8
+1,如果您从一开始就对可维护性进行了优化,则在以后证明有必要时,针对速度或存储进行优化将更加容易。
Carson63000

您仍然至少需要考虑处理时间和存储空间,因此您不会选择过于繁琐的方法。

@Thorbjørn,如果您正在优化开发人员时间,则可能(很有可能)选择了以给定语言更易于阅读/编写的算法。只有在以后,并且只有在性能成为问题时,你们俩才能(如@Tim所说的)选择一个探查器。
杰森·怀特霍恩

@杰森,我非常不同意。您应该熟悉所选算法的性能特征,以便选择合适的实现。即,当您主要需要用于查找邮政编码时选择ArrayList可能无法很好地扩展。

1
@Thorbjørn,我不同意你的看法。实际上,我认为您应该注意手头的算法是正确的。但是,我认为我们意见分歧的地方在于,我认为选择哪种算法的想法是从经验中学到的,并且只有在问题出现时才能解决。您的观点是正确的,我只是没有看到需要对此进行优化,但这样做的代价是可读性/实现时间更长。
杰森·怀特霍恩

27

开发时间

处理和存储很便宜。你的时间不对。

请注意:

这并不意味着仅仅为了快速完成代码就做不好的代码。这意味着以有助于快速开发的方式编写代码。它还完全取决于您的用例。如果这是一个简单的,两页或三页的带有联系表的网站,则可能不需要使用PHP框架。几个include和一个mailer脚本将加快开发速度。如果计划是要创建一个灵活的平台来进行扩展和添加新功能,则值得花些时间对其进行适当的布局并进行相应的编码,因为这将加速未来的开发。

与处理时间和存储的直接比较中,我倾向于更快的开发时间。使用collectionutils减去功能是减去集合的最快,最节省内存的方法吗?没有!但这是更快的开发时间。如果遇到性能或内存瓶颈,可以稍后解决。在您不知道需要优化的地方进行优化就是浪费您的时间,而这正是我所提倡的。


4
摩尔定律于大约两年前终止。现在可能是时候开始考虑并发并使用那些额外的内核了。这是将来获得便宜时钟周期的唯一方法。
罗伯特·哈维

3
正确的说,摩尔定律仍在发展,大约每两年将芯片上晶体管的数量增加一倍,这就是在单个芯片上放置多个内核的原因。结束的是每秒不断增加的循环次数的“免费午餐”。
Dominique McDonnell

1
“处理和存储很便宜。” CPU缓存和总线速度不是。它们是当今的主要性能瓶颈。
mojuba 2010年

3
我完全赞同这个。维护可读代码,使用适当的工具来完成任务以及遵守公司所同意的标准,将大大减少您实际在计算机上键入代码所花费的时间,从而为公司节省了大量资金。比起打字,您花了更多的时间在工程上。
Matt DiTrolio 2010年

1
@Bill:或者如果您要进行嵌入式,则可能会有硬限制,如果超出限制,则将大大增加产品成本。或者对于服务器软件,有时-如果有人可以将Google服务器上的处理能力提高1%,那将节省很多。
David Thornley 2010年

12

用户体验。

这是唯一对您的客户重要的价值。

开发时间不太重要。我可以编写一个功能齐全的命令行应用程序,其速度比GUI快得多,但是如果Jane夫人不知道如何使它吐出她想要的报告,那就没用了。

维护不太重要。我可以很快地修理跷跷板,但是如果它在森林中间​​,用户将找不到它。

处理时间不太重要。如果我在60秒内将光速设为0的汽车,用户将无法转向。

美学不太重要。我可以画蒙娜丽莎(Mona Lisa),但如果她隐藏在墙后,没人会看到她。

用户体验是唯一重要的价值。最终开发出一种能够以用户期望的方式完全满足用户期望的应用程序。


抱歉,Joeri,我在编辑中有些生气。
Malfist 2012年

这是某个社区的Wiki,对吗?;)
Joeri Sebrechts 2012年

8

只有一件事需要优化,它是:

您的客户想要什么

您的客户是否需要最快的程序?优化速度。

您的客户需要绝对的可靠性吗?为此进行优化。

他们需要明天交货还是会无用?优化开发速度。

运行在资源极其有限的微型设备上?针对这些资源进行优化。


唯一的收获是他们常常不知道自己想要什么,或者对可能或有用的东西抱有期望。
Tim Williscroft 2010年

1
当被问到一系列选择题时,通常您只会听到“是” :-)
杰森·怀特霍恩

1
我没有说这很容易。而且至少如果您提出要求,就有机会获得有用的答案。
DJClayworth

5

处理时间

我的用户的时间并不便宜。周围发生的事。


我刚刚升级了去年使用的应用程序。他们已经完全重写了该应用程序,但孩子却很慢。我终于不得不购买一台新计算机来快速运行它。我向您保证这并不便宜,但是我的时间更有价值。


有趣的是,处理时间偏斜。希望分享您开发的哪种类型的应用程序?我很感兴趣
杰森·怀特霍恩

1
如果您在许多计算机上运行,则处理时间很重要。例如,如果要在花费额外的2个月时间进行优化,或者将10,000台PC升级到较新的硬件之间进行选择,那么在这种情况下,开发人员的时间就无法取胜。但是,当然,这是一个折衷方案。如果仅在六台服务器上运行,则在这种情况下,开发人员的时间可能会赢了。
迪恩·哈丁

1
@Jason,我现在很容易,可以使用Excel和VBA来处理各种电子表格(我一直在迅速浓缩)。我的用户在隔壁房间工作,如果我有任何问题,他们会通知我。我的观点是使用计算机已有三十年了,看着应用程序不断膨胀,迫使升级也无法弥补。我知道开发人员可以做得更好,他们只需要养成编写高效代码的习惯即可。

+10为有效代码。这经常被忽视,尤其是在模块化编程中。每个模块都以合理的速度运行,但是所有模块的总和可能会非常慢。
乔里斯·梅斯

4

我倾向于倾向于限制内存消耗和分配。我知道这是一所旧学校,但是:

  • 我编写的大多数非可丢弃代码都是高度并行的。这意味着过多的内存分配和垃圾回收活动将序列化许多其他可并行化的代码。这也意味着共享内存总线的争用将很多。
  • 我的主要语言是D,它还没有很好的64位支持(尽管已经纠正)。
  • 我会定期处理相当大的数据集。

+1用于防止恶意软件。占用内存的程序是错误的程序。

内存占用程序基本上可以在64位系统上运行。当我们的一个应用程序遇到内存问题(它合法地使用大量内存)时,我们就是这样做的。性能至关重要时,第一个要点很重要。
David Thornley,2010年

2

我会说我朝着效率进行了优化,效率被定义为开发时间,未来可维护性,用户体验和资源消耗之间的折衷。作为开发人员,您需要综合考虑所有这些因素以保持某种平衡。

您如何实现这种平衡?好吧,首先,您需要建立一些常数,例如截止日期是什么,应用程序将在哪种硬件上运行以及将使用哪种类型的人。在不知道这些的情况下,您将无法建立正确的平衡并确定需要平衡的优先级。

例如,如果您要在一台功能强大的计算机上开发服务器应用程序,则可能需要权衡性能效率以确保您无法按时完成任务。但是,如果您的开发人员需要快速响应用户输入(例如视频游戏)的应用程序,则需要确定输入例程的优先级,以确保输入例程不繁琐。


2

无论我使用什么虚拟化技术

还记得那些将RAM超过512 MB的系统视为尖端技术的日子吗?我花了很多时间编写先前的代码。

我主要研究在Xen环境中在特权域上运行的低级程序。我们对特权域的上限是512 MB,剩下的RAM可供客户自由使用。对于我们来说,通常也将特权域限制为一个CPU内核。

所以我在这里,编写将在全新的$ 6k服务器上运行的代码,并且每个程序都必须(理想情况下)在100kb的分配上限内运行,或者完全避免动态内存分配。

简而言之,我针对以下方面进行了优化:

  • 内存占用
  • 排序(我的大部分代码都花费大部分时间)

在等待锁,等待I / O或只是等待时,我也必须非常勤奋。我将大量时间用于改进现有的非阻塞套接字库,并研究更实用的无锁编程方法。

我每天都像在15年前那样,由于技术的进步,在上个月购买的系统上编写代码,这有点讽刺。

这对于任何在嵌入式平台上工作的人来说都是很典型的,尽管其中许多甚至至少拥有1GB的可用空间。正如Jason指出的那样,编写要在移动设备上运行的程序时也很典型。列表继续出现,信息亭,瘦客户机,相框等。

我开始认为,硬件限制确实使程序员与可以使某项工作无需关心实际消耗的人分开。我担心(如果需要的话,请否决我)哪种语言完全抽象了类型和内存,以检查(过去)在各个学科的程序员之间共享的常识集合。


1
+1表示内存支脚打印角度。我从来没有针对您要处理的特定限制编写代码,但是删除了第一部分中有关Xen的内容,并用iPhone代替了它,我确切地知道了您来自哪里:-)
Jason Whitehorn,2010年

2

研究成果

作为一名学者,我认为我应该分享自己为之优化的东西。请注意,这与为缩短开发时间进行优化并不完全相同。通常,这意味着该作品可能会支持某些研究问题,但不是可交付使用的精美产品。这可能被视为质量问题,并且可以解释为什么许多人说(学术的)计算机科学家没有任何“现实世界”的经验。(例如,“他们是否不知道如何开发可交付产品?”

这是一条好线。在影响方面,您希望您的作品能被他人使用和引用,而乔尔的《冰山效应》就发挥了作用:一点点的磨光和发光可以起到很大的作用。但是,如果您没有为要建立的其他项目打基础,那么您可能就无法证明花费在制造可交付产品上的时间是合理的。


1
  1. 设计
    • 低耦合,模块化
    • 简洁,定义明确的功能区域
    • 有据可查
    • 不断重构
  2. 维修保养
    • 可复制的构建和调试
    • 单元测试
    • 回归测试
    • 源代码控制

...之后其他一切

...最后,优化性能;-)


1

质量/测试

针对质量进行优化,以确保在开发计划中有时间进行测试,包括单元测试和功能/阶段之后的测试。


1

这取决于您的程序的需要。

我所做的大部分工作都受到处理能力和内存的严重限制,但在平均年中并没有经历很多(如果有的话)重大变化。

我过去曾在经常更改代码的项目上工作,因此在这种情况下,可维护性变得更加重要。

过去,我也曾在那些数据量是最大问题的系统上工作,甚至在用于存储的磁盘上,但更常见的是,当您不得不大量或缓慢移动数据时,大小会成为问题。链接。


1

高雅

如果您的代码设计合理,它将产生多种效果:

  1. 易于维护(为客户削减成本)
  2. 优化起来会更容易(对于JIT或完整的编译器)
  3. 更换起来会更容易(当您想到更好的解决方案时)


0

由于我要在多种类型的系统上进行安装,从IBM大型机到PC的所有东西,我首先要针对兼容性进行优化,然后对大小进行优化,然后对速度进行优化。


0

这取决于

如果您正在使用实时嵌入式视频处理系统,则可以优化处理速度。如果您正在使用文字处理器,则可以优化开发时间。

但是,在所有情况下,您的代码都必须有效并且必须可维护。


0

表达我的意图。

我希望阅读我的代码的人能够轻松查看我试图在域上调用的操作。同样,我尝试最小化非语义垃圾(大括号,js中的“ function”关键字等),以使扫描更加容易。

当然,您必须通过可维护性来达到平衡。我喜欢编写返回函数和各种高级技术的函数,它们确实可以实现我的目标,但是如果收益不大,我会坚持使用那些扎实的jr程序员会熟悉的技术。


-6

他们全部

处理时间

当今的计算机速度很快,但远远不够。在很多情况下,性能至关重要-如果您使用流媒体服务器。

存储

您的客户可能有一个大磁盘,例如1Tb。可以用1000部高清电影来拍摄哪部电影,如果您想让它做得还远远不够,不是吗?

开发时间

好吧,我不确定这是否算作“优化”,我要做的是我使用Java而不是C ++,并且开发速度提高了10倍。前进,完全摇摆!

顺便说一句,我相信要加快开发速度,您应该选择Java,切勿尝试使用python之类的废话……这声称它们可以缩短您的DEV时间。


您可能会发现这很有趣:paulgraham.com/avg.html-它讨论了编程语言的优势。

3
在有限的时间和预算下,您不能花所有的时间-必须有一些优先级。
JBR威尔金森(JBRWilkinson),2010年

@JRBWilkinson好吧,应该视情况而定
tactoth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.