繁体   English   中英

对于复杂的算法,您如何衡量其性能?

[英]For your complicated algorithms, how do you measure its performance?

我们现在假设您缩小了应用中典型瓶颈的位置。 如您所知,可能是您为重新索引表而运行的批处理过程; 它可能是运行在有效日期树上的SQL查询; 它可能是几百个复合对象的XML编组。 换句话说,您可能会遇到以下情况:

public Result takeAnAnnoyingLongTime(Input in) {
   // impl of above
}

不幸的是,即使您已经确定了瓶颈之后,您所能做的就是消除它。 没有简单的解决方案。

您如何衡量瓶颈的性能,以便了解您的修复方向正朝着正确的方向发展?

两点:

  1. 谨防臭名昭着的“优化空闲循环”问题。 (例如,请参阅“保时捷在停车场”标题下的优化故事 。)也就是说,仅仅因为例程花费了大量时间(如您的分析所示),不要认为它是负责用户所感知的缓慢性能。

  2. 最大的性能提升通常不是来自对算法实现的巧妙调整或优化,而是来自于认识到完全有更好的算法。 一些改进相对明显,而其他改进则需要对算法进行更详细的分析,并可能对所涉及的数据结构进行重大改变。 这可能包括牺牲I / O时间的处理器时间,在这种情况下,您需要确保您不仅仅优化其中一个措施。

把它带回问题,确保无论你测量什么代表用户实际体验的内容,否则你的努力可能完全浪费时间。

  1. 简介它
  2. 找到探查器中的顶行,尝试加快速度。
  3. 简介它
  4. 如果有效,请转到1.如果不起作用,请转到2。

我使用相同的工具/方法测量它们,这些工具/方法允许我首先找到它们。

也就是说,坚持计时和记录呼叫到处都是。 如果数字开始下降,那么你可能正在做正确的事情。

正如msdn专栏中所提到的,性能调整与绘制金门大桥的工作相比:一旦你完成整个绘画的绘制,就该回到起点并重新开始。

这不是一个难题。 您需要了解的第一件事是,衡量性能并不是您发现性能问题的方式。 了解某些东西有多慢并不能帮助你找出原因。 你需要一个诊断工具,一个好的工具。 我有很多这方面的经验, 是最好的方法。 它不是自动的,但它在大多数分析器周围运行。

这是一个有趣的问题。 我认为没有人知道答案。 我认为问题的重要部分在于,对于更复杂的程序,没有人能够预测它们的复杂性。 因此,即使您有剖析器结果,根据应该对程序进行的更改来解释它也非常复杂,因为您没有理论基础来确定最佳解决方案。

我认为这就是为什么我们拥有如此臃肿的软件的原因。 我们只进行优化,以便在我们的快速机器上使用非常简单的情况。 但是一旦你把这些碎片组合成一个大系统,或者你使用了数量级更大的输入,所使用的错误算法(从理论上和实际上都是不可见的)将开始显示它们真正的复杂性。

示例:您创建一个处理Unicode的字符串类。 你可以在计算机生成的XML处理中使用它,它实际上并不重要。 但是,Unicode处理就在那里,占用了部分资源。 就其本身而言,字符串类可以非常快,但称之为百万次,程序将很慢。

我相信当前大多数软件都是这种性质的。 有一种方法可以减少它,但它与OOP相矛盾。 有一本有趣的书有一本关于各种技术的有趣书 ,它以内存为导向,但大多数都可以恢复以获得更快的速度。

我发现了两件事:

1)它有多复杂? 最简单的方法是绘制时间和输入大小的图表。 2)它是如何约束的? 是内存,磁盘,还是IPC与其他进程或机器,或者..

现在,第(2)点更容易解决和解释:如果你有更多的RAM或更快的机器或更快的磁盘或转移到演出以太网等,很多事情会更快。 如果你确定了你的痛苦,你可以将一些钱投入硬件以使其可以忍受。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM