Parallel.Invoke:跛行执行时间

时间:2014-06-10 14:35:01

标签: c# parallel-processing

感谢网站上人们的帮助,我正在迈出并行编程的第一步。

这是我目前正在测试的C#(简化)代码。

do
{
    // PRN data download to the waveform generator...
    // Response data acquisition from the oscilloscope...
    // etc...

    t0 = Win32.MM_GetTime();

    // Serial evaluation of the data DFT;
    // execution time constantly = 0.785 s.
    //DSP.DFT_2_F(D1, ref R1, ref X1);
    //DSP.DFT_2_F(D2, ref R2, ref X2);

    // Parallel evaluation of the data DFT;
    // execution time = 0.395 s, but...
    Parallel.Invoke(
    () => DSP.DFT_2_F(D1, ref R1, ref X1),
    () => DSP.DFT_2_F(D2, ref R2, ref X2)
    );

    lblTMis.Text = ((double)(Win32.MM_GetTime() - t0) / 1000.0).ToString();

    // Plot the measurement results...
    // etc...
}
while (bMisuraOn);

现在,虽然串行DFT评估不断需要0.785秒,但并行版本只需要0.395秒但不时,比如每3-4个测量循环,执行时间会跳到0.838秒。 我还注意到,在50-60次循环之后,执行时间稳定到0.395秒,只有非常偶然的跳跃;如果我重新启动测量循环,而不退出程序," limping"一段时间后,一次又一次地显示出来。

对我来说,看起来有时Parallel.Invoke决定表现为串行......

这是正确的还是我做错了什么? 有什么方法可以始终保持相同(快速)的执行时间?

Ciao,感谢您的关注。

佛朗哥

1 个答案:

答案 0 :(得分:1)

来自Parallel.Invoke上的MSDN

  

执行每个提供的操作,可能并行执行。

不能保证线程异步执行,它通常会执行。我不确定如何进一步解决这个问题,但这至少解释了这种行为。