为什么同一代码的第二次运行执行得更快?

时间:2014-01-15 22:05:40

标签: sas

我试图弄清楚为什么在SAS暴露于数据后,在SAS中运行完全相同的过程可以更快地运行,即使没有创建临时文件。下面的示例显示了两个相同的PROC MEANS步骤,其中第二次运行的实际执行时间减少了95%以上。该模式也适用于数据集的临时版本,但差异不是那么明显。

6          PROC MEANS data = data.test;
7              var y;
8          RUN;

NOTE: There were 100000 observations read from the data set DATA.TEST.
NOTE: The PROCEDURE MEANS printed page 1.
NOTE: PROCEDURE MEANS used (Total process time):
      real time           22.69 seconds
      cpu time            1.07 seconds


9          
10         PROC MEANS data = data.test;
11             var y;
12         RUN;

NOTE: There were 100000 observations read from the data set DATA.TEST.
NOTE: The PROCEDURE MEANS printed page 2.
NOTE: PROCEDURE MEANS used (Total process time):
      real time           1.02 seconds
      cpu time            1.04 seconds

当我在顶部放置_NULL_数据步骤(因此仍然没有写入工作目录)并设置数据时,数据步骤需要很长时间,然后两个PROC MEANS步骤同样快速地跑。

6          DATA _NULL_;
7              set data.test;
8          RUN;

NOTE: There were 100000 observations read from the data set DATA.TEST.
NOTE: DATA statement used (Total process time):
      real time           23.28 seconds
      cpu time            1.18 seconds


9          
10         PROC MEANS data = data.test;
11             var y;
12         RUN;

NOTE: There were 100000 observations read from the data set DATA.TEST.
NOTE: The PROCEDURE MEANS printed page 1.
NOTE: PROCEDURE MEANS used (Total process time):
      real time           0.97 seconds
      cpu time            0.98 seconds


13         
14         PROC MEANS data = data.test;
15             var y;
16         RUN;

NOTE: There were 100000 observations read from the data set DATA.TEST.
NOTE: The PROCEDURE MEANS printed page 2.
NOTE: PROCEDURE MEANS used (Total process time):
      real time           0.95 seconds
      cpu time            0.97 seconds

显然,CPU时间变化不大,但为什么在第一次运行数据后实际执行时间会减少很多,即使没有任何内容写入工作目录?

这是使用包含100,000个观测值和1003个数值变量的虚拟测试数据集完成的。

2 个答案:

答案 0 :(得分:3)

我在此假设数据来自文件

它运行速度不快,文件位于操作系统缓存中,Linux已经完成了[永远基本上] - 不确定其他操作系统,不管它们做得多好。

以字体为例,字体会被大量读取 - 你是否真的想要将磁盘读取几kb然后重新启动它?不!

文件系统缓存保持RAM中最近/经常读取(可以配置精确度量)文件。数据集从第一次运行时就在RAM中。

如果您正在运行Unix的风格,您可以使用time来计算程序在用户空间中花费的时间(用户时间,实际做事情,而不是等待读取等),您将发现它并没有什么不同(由于CPU速度变化,其他运行的东西......的一个小变化 - 但没有太大的区别)

你也可以看到它,看到CPU时间是一样的,这是你的程序实际做的时间,实时是从开始到结束的时间。从Real获取CPU,你花时间不做事(比如等待文件读取:))你可以看到它第二次花费相同的时间来做实际的东西,但实际时间更少,所以这些东西如果等待的话变得更快 - 这是缓存的定义/功能/ 作业

很抱歉没有尽快说出来,我完全跳过代码块,理由是“我不知道SAS是什么”:P

答案 1 :(得分:0)

缓存。很可能SAS会在内存中缓存一些有关查询的信息,从而加快速度。如果它能够在内存中找到先前运行的结果,那么它可能不需要进行那么多的编译或分析。硬盘驱动器和内存总线也广泛使用缓存。这种“现象”在软件中非常普遍。