Performance 在';现实世界';?

Performance 在';现实世界';?,performance,algorithm,profiling,complexity-theory,big-o,Performance,Algorithm,Profiling,Complexity Theory,Big O,最近在一次采访中,我被问到了几个与技术问题过程中出现的各种算法的Big-O相关的问题。我觉得我在这方面做得不太好。。。在我参加编程课程的十年里,我们被要求计算算法的大O,我没有讨论过我所研究或设计的任何东西的大O。我曾与其他团队成员以及与我共事的架构师就代码的复杂性和速度进行过多次讨论,但我从未参加过在实际项目中实际使用Big-O计算的团队。讨论总是“鉴于我们对外部数据的理解,是否有更好或更有效的方法来实现这一点?”而不是“该算法的复杂性是什么” 我想知道人们是否真的讨论过他们的代码在真实世界中

最近在一次采访中,我被问到了几个与技术问题过程中出现的各种算法的Big-O相关的问题。我觉得我在这方面做得不太好。。。在我参加编程课程的十年里,我们被要求计算算法的大O,我没有讨论过我所研究或设计的任何东西的大O。我曾与其他团队成员以及与我共事的架构师就代码的复杂性和速度进行过多次讨论,但我从未参加过在实际项目中实际使用Big-O计算的团队。讨论总是“鉴于我们对外部数据的理解,是否有更好或更有效的方法来实现这一点?”而不是“该算法的复杂性是什么”


我想知道人们是否真的讨论过他们的代码在真实世界中的“大O”?

与其说是使用它,不如说是你理解了它的含义

有些程序员没有意识到使用O(N^2)排序算法的后果


我怀疑除了在学术界工作的人之外,很多人会在愤怒的日常生活中使用Big-O复杂性分析。

Big-O表示法是一种理论,而在实践中,你更感兴趣的是实际的分析结果,这给了你一个关于你表现如何的硬数字

您可能有两种排序算法,根据本书,它们具有
O(n^2)
O(nlogn)
上界,但分析结果可能表明,效率更高的算法可能会有一些开销(这没有反映在您发现的理论界中)以及针对您正在处理的特定问题集,您可以选择理论上效率较低的排序算法


一句话:在现实生活中,评测结果通常优先于理论运行时界限。

根据我的个人经验,答案是-不。可能是因为我只使用简单、易于理解的算法和数据结构。他们的复杂性分析在几十年前就已经完成并发表了。罗布·派克(Rob Pike)更好地解释了为什么我们应该避免使用花哨的算法。简言之,从业者几乎不必发明新的算法,因此几乎不必使用Big-O


这并不意味着你不应该精通Big-O。一个项目可能需要设计和分析一个全新的算法。对于一些真实世界的例子,请阅读斯基纳的《战争故事》。

我一直在读。当您必须处理“大”数字时,通常是在我的例子中:用户、数据库中的行、升级代码等,您必须了解并考虑算法的大O

例如,一个为分发生成随机升级代码的算法可以用来生成数十亿个代码。。。使用O(N^2)算法生成唯一代码意味着数周的CPU时间,而O(N)意味着数小时

另一个典型的例子是代码中的查询(糟糕!)。人们查找一个表,然后对每一行执行查询。。。这将使订单增加到N^2。您通常可以更改代码以正确使用SQL并获得N或NlogN的顺序


因此,根据我的经验,只有在使用了正确的算法类之后,评测才有用。我使用分析来捕捉不良行为,比如理解为什么一个“小”数字绑定的应用程序性能不佳。

没有不必要的n平方

根据我的经验,你没有太多关于它的讨论,因为它不需要讨论。在实践中,根据我的经验,所有发生的事情都是你发现某个东西很慢,并且看到它是O(n^2),而实际上它可能是O(n logn)或O(n),然后你去改变它。除了“这是n平方,去修正它”之外,没有其他讨论


是的,根据我的经验,你确实经常使用它,但只是在最基本的意义上“降低多项式的阶数”,而不是在一些高度调优的分析中“是的,但如果我们切换到这个疯狂的算法,我们将从logN增加到Ackerman函数的倒数”或类似的胡说八道。如果不是多项式,理论就不存在了,您可以切换到分析(例如,即使要在O(n)和O(n log n)之间做出决定,也可以测量真实数据)

不。我不会在“真实世界”的情况下使用Big-O复杂性

我对整个问题的看法是-(可能是错误的.,但这只是我的看法。)

Big-O复杂性最终是要理解算法的效率。如果根据经验或通过其他方式,你了解你正在处理的算法,并且能够在正确的地方使用正确的算法,这就是最重要的

如果你知道这个Big-O的东西,并且能够正确地使用它,那就很好

如果你不知道用数学的方式来谈论算法及其效率——大O的东西,但你知道真正重要的是什么——在某种情况下使用最好的算法——那就很好了


如果你也不知道,那就糟糕了。

我知道三个嵌套的
for
-循环可能比一个嵌套的
for
-循环更糟糕。换句话说,我把它作为一种直觉的参考

我从未在学术界之外计算过算法的大O。如果我有两种方法来解决某个问题,如果我的直觉告诉我一种方法的Big-O比另一种方法低,我可能会本能地选择较小的方法,而无需进一步分析

另一方面,如果我知道进入我的算法的n的大小,并且我知道它相对较小(比如,在100个元素以下),我可能会选择最清晰的一个(我想知道我的代码在编写一个月后做了什么)。毕竟,用户很难注意到100^2和100^3执行之间的差异