我为图像开发了feature extraction算法。为了评估算法提取时间,我使用已开发的方法及其竞争对手作为输入使用一组图像。所有提取算法都在Matlab中实现。
然而,有人向我指出,使用Matlab实现的时间比较是值得怀疑的。这个说法有什么依据吗?
答案 0 :(得分:4)
这个论点有两个可能的原因:时序测量可能存在差异,而Matlab据说速度慢,因此时间没有意义。
出于第一个原因,getting exact timings can indeed be a challenge,特别是如果运行时间在程序之间非常相似。因此,简单tic
和toc
应替换为timeit函数。
第二个原因是假的。当然,在Matlab中,一些操作可能需要更长的时间,但是TheMathWorks在过去几年中花费了大量精力使Matlab更快,因此在C / C ++中重新实现算法实际上可以使其变慢。确实,算法的相对速度可以在不同语言之间变化,如果其中一种算法更适合语言的优势。但是,以相同的语言实现这两种算法并且以有效的方式诚实地实施算法肯定会导致公平的比较。
答案 1 :(得分:3)
您的计时的有效性取决于您如何实施算法以及如何在“现实世界”中使用它们。如果您有算法的应用程序并且它将使用Matlab实现,那么您的计时没有任何问题,因为您正在计算算法的使用方式。但是,如果您计划使用较低级别的语言(如C ++)重新编码算法,则可能会得到明显不同的结果。
Mathworks花了很多时间在Matlab中优化工具箱和基本操作,因此矩阵乘法,矩阵求逆,FFT,SVD等等通常和好的C ++实现一样快。您不一定知道哪些工具箱例程已经过优化。如果您的算法仅依赖于高度优化的例程,并且竞争算法依赖于优化程度较低的例程,那么您的算法可能看起来更好,因为底层实现更好。
可能存在差异的另一个原因是Matlab是一种解释性语言。当你的程序有一个循环时,解释器必须弄清楚每次循环时代码在做什么。相反,矩阵操作已提前编译到机器代码,并且没有解释器开销。例如,如果我运行:
start = time;
x = zeros(1000,1000);
x = x+1;
stop = time;
stop - start
在我的电脑上,我得到0.02297秒。如果我使用循环运行等效版本:
start = time;
x=zeros(1000,1000);
for i = 1:1000
for j = 1:1000;
x(i,j) = x(i,j) + 1;
end;
end;
stop = time;
stop - start
我得到18.175秒。 (当你需要高精度时,上面@Jonas提到的方法给出了更好的时序,但是在这种情况下,这个简单的方法有足够的数量级差异。)
如果竞争算法在循环中做了很多工作,而你的算法更多地依赖于内置函数,那么你的算法可能只是因为它的解释器开销较少而击败竞争对手。
如果您计划仅在Matlab中使用算法,并且无法从竞争对手中消除解释器开销,则声称算法更好是有效的 - 至少对于Matlab实现。如果您想要声明更一般的结果,至少您必须证明解释器不是性能差异的原因。用C ++这样的语言实现所有算法会消除解释器开销。为了进行公平的比较,您必须确保已经快速实现了所有基础算法(例如,FFT,SVD,矩阵乘法)。幸运的是,优化的库可用于许多不同语言的许多常用算法。
当然,如果你能显示算法的渐近复杂度更好(O()表示法),那就表明它可能在更广泛的实现中更好,尽管常数在实际中变得很重要的实施方式。