我编写了一个小型应用程序,用于以图形方式显示时间序列,点击按钮,通过在频域中乘以复数传递函数对其进行过滤,并显示已过滤的时间序列。
所需的傅里叶变换是与interop一起使用的众所周知的非托管本机实现(FFTW)。还有一些复制,零填充到频谱,计算复杂传递函数的样本,当然还有显示系列(在表格中使用GDI +),所有这些都在托管的c#中。
对于较长时间序列(> 100k样本),我不会感到惊讶的是有短暂的延迟(一秒到几秒)。让我感到惊讶的是,在第一次按下按钮(以及上面描述的相应计算)时,延迟比后续点击时长得多(不,我不是缓存结果)。比如说2秒而不是0.2秒。
这可能是JIT编译器的影响吗?如果是,是否在第一次调用期间解释了代码,并且在以下调用期间它是本机运行的?或者它必须是编译时间本身导致额外的延迟?
有没有办法监控JIT编译器的操作(例如,找出它是否会导致延迟)。
最后,由于这种现象对用户来说有点刺激,有没有办法指示JIT编译器提前编译一些选定的方法而不是及时编译?