1

我在 MATLAB 中编写了一个函数。在该函数中,我使用:

t = cputime;
...
time = cputime-t;

我在这些点上进行了一些操作。每当我不调用函数而是手动运行函数中的代码时,我总是有时间 = 0.15 等。

但是,在另一个脚本中,我调用了相同的函数。在第一次通话中,它再次给了我时间 = 0.15。但是,如果我清除工作区并再次调用该函数,我有时间 = 0。只有 0,没有小数。我不知道为什么,因为该功能正在工作并给了我想要的东西。如果我多次运行函数中的代码,我永远不会有时间 = 0。

可能的问题是什么?为什么即使清除了工作区,从脚本中多次调用函数也会使其为 0 秒?

4

1 回答 1

3

您应该始终使用该功能timeit来计时码。其他任何事情充其量都是不准确的。

timeit首先“预热”系统,然后重复运行代码以获得对所需时间的精确估计。

当要执行的代码很短时,使用cputimeor tic/toc会导致测量不精确。时钟的分辨率不足以正确测量它(这就是为什么你可以看到 0 而不是一个非常小的数字),并且测量可能会受到计算机中同时发生的其他事情的影响。

最后,MATLAB 使用 JIT(即时)编译器。函数内的代码在您第一次执行时会被解析和编译一次。随后的时间只是重用编译的代码,因此运行速度更快。

在这方面,我不清楚函数和脚本 M 文件之间的区别。过去的情况是脚本不是 JIT 编译的,只有函数是。但我怀疑这可能在最近版本的 MATLAB 中发生了变化。在任何情况下,直接键入或复制/粘贴到命令提示符的内容都不是 JIT 编译的,因此总是会像第一次运行函数时一样慢。

当您这样做时clear all,您会从内存中清除预加载和预编译的代码,从而使后续代码运行速度变慢。您通常不应该使用clear all. 要清除变量,只需执行clear.

于 2019-06-22T16:08:17.330 回答