当运行返回很长列表的函数时,Dartisolate 非常慢

mat*_*eoh 6 dart dart-isolates flutter

在我的 Windows Flutter 项目中,我使用该compute函数在 中运行一些代码Isolate,以避免冻结用户界面。

但我面临一个问题:我在其中运行的代码Isolate返回一个非常长的列表double(几百万个项目),因此,与我不这样做相比,整个执行花费了非常多的时间。Isolate根本不用。

这是进行多次计算并返回一个大列表的函数:

static Future<List<double>> extractWavSamples(File fileWav) async
{
    // read the audio file:
    Uint8List bytes = await fileWAV.readAsBytes();
    bytes = bytes.sublist(44);

    // convert to a list of doubles:
    List<double> samples = [];
    Uint8List samplesBytes = Uint8List(2);
    int sample = 0;
    for (int a = 0 ; a < bytes.length - 2 ; a += 2)
    {
      samplesBytes[0] = bytes.sublist(a + 1, a + 2)[0];
      samplesBytes[1] = bytes.sublist(a, a + 1)[0];
      sample = ByteData.view(samplesBytes.buffer).getInt16(0);
      samples.add(sample / 32768.0);
    }
    return samples;
}

Run Code Online (Sandbox Code Playgroud)

以下是我如何运行该函数compute(运行需要 5-6 秒,但会冻结用户界面):

List<double> samples = await extractWavSamples(myFileWav);
Run Code Online (Sandbox Code Playgroud)

以下是我运行该函数的方法compute(运行大约需要 20 秒):

List<double> samples = await compute(extractWavSamples, myFileWav);
Run Code Online (Sandbox Code Playgroud)

我发现,因为该extractWavSamples()函数返回一个大列表,所以这就是代码运行时间过长的原因。如果我让它返回一个空列表,它会快得多。

事情是:我需要在主线程中使用该列表,这样我就可以显示它(它允许我显示音频文件的波形)。

那么我应该如何修复才能使代码在合理的时间内运行呢?

谢谢。