【发布时间】:2011-12-06 03:03:41
【问题描述】:
我有一个正在为一个项目运行的代码。它是 O(N^2),对于我来说,N 是 200。有一种算法可以将此 O(N^2) 转换为 O(N logN)。这意味着,使用这种新算法,它应该快 100 倍左右。但是,我只得到了 2 倍的增长(也就是 2 倍快)。
我试图缩小范围,看看我是否搞砸了,或者这是否是我编写这个程序的方式所固有的。对于初学者,我在嵌套类中有很多函数开销。例如,我有很多这样的(在许多循环中):
energy = globals->pair_style->LJ->energy();
由于我在实际数据方面得到了正确的结果,只是错误的速度增加,我想知道函数开销是否实际上会导致 很大的速度减少多达 50 倍。
谢谢!
【问题讨论】:
-
尝试在探查器下运行这两种方法,并查看每种方法花费的时间。
-
Big-O 表示法显示了某些东西的扩展方式,而不一定是它的执行方式。对于较小的 N 值,您可能根本看不到任何差异。
-
“它是 O(N^2),对于我来说 N 是 200”。你有它。您没有正确使用大哦符号。如果“对于 [您的] 案例,N 为 200”,则为 O(1)。
-
天哪。首先,我很抱歉将性能与 Big-O 表示法混淆。其次,@Mankarse:您会建议使用探查器吗?第三,我真的很希望它不是函数开销,否则我将不得不将所有东西都塞进一个,使它非常非常难看并且非常工作密集
-
@Amit:在 OSX 上,我喜欢使用
Activity Monitor内置的分析器(这是我唯一广泛使用的分析器)。在 Windows 上,Very Sleepy 取得了不错的效果。我没有在其他系统上做太多的分析,但请查看here 以获得更多建议。