Flutter 计算函数需要时间才能开始执行

问题描述 投票:0回答:2

我正在尝试使用 Flutters 计算函数使用 C++ 代码和 dart ffi 进行一些实时的繁重图像处理。
我尝试将对重函数的调用包装在计算中以避免与 ui 线程混淆,并且我进行了一些时间测量以查看执行时间最长的内容。

代码如下所示:

double _work(CheckPhotoData p) {
  DateTime s = DateTime.now();
  Pointer<Double> rPointer = Pointer.fromAddress(p.rPointerAddress);
  Pointer<Double> gPointer = Pointer.fromAddress(p.gPointerAddress);
  Pointer<Double> bPointer = Pointer.fromAddress(p.bPointerAddress);
  final a =  NativeCCode.checkPhoto(rPointer, gPointer, bPointer, p.w, 1);
  print("ACTUAL NativeCCode.checkPhoto took: " + DateTime.now().difference(s).inMilliseconds.toString());
  return a;
}

class CheckPhotoWrapper {
  static Future<double> checkPhotoWrapper(Uint8List photo) async {
    final CheckPhotoData deconstructData = _deconstructData(photo);
    DateTime s = DateTime.now();
    double res = await compute(_work, deconstructData);
    print("compute took: " + DateTime.now().difference(s).inMilliseconds.toString());
    return res;
  }
  ...
}

运行代码后,我得到以下输出:

实际 NativeCCode.check 拍摄照片:106
计算花费:514

(这意味着计算比它运行的代码多花费了 408 毫秒)

根据我对这些结果的了解,dart:async 中的实际

compute
方法比其执行的实际代码花费更多时间,并导致巨大的开销影响性能。
更糟糕的是,当处理开始时,我的应用程序 UI 卡住了。

有没有一种方法可以减少

compute
引入的开销,或者我无法弄清楚这个问题的不同方法?

感谢您对我的问题有任何想法或解决方案。

注:

  • 我在物理设备上以调试模式运行了测试。
  • CheckPhotoData
    是一个简单的类,包含我的 _work 函数的参数。
  • 我使用的是flutter版本2.2.3,Channel稳定
flutter performance dart dart-isolates
2个回答
4
投票

开销似乎是由调试模式引起的。我在我的应用程序中看到了类似的

compute
数百毫秒的延迟(使用 Flutter 2.10.2),但在发布模式下运行时,延迟不到 10 毫秒。


0
投票

我也遇到这个问题了。就我而言,在解决问题之前,我会避免在调试模式下调用隔离,如下所示:

     final decryptedBytes = (kReleaseMode || kProfileMode)
            ? await compute(customEncrypter.decryptTheseBytes, encryptedBytes)
            : customEncrypter.decryptTheseBytes(encryptedBytes);

虽然我无法提供问题的答案,但我发现这些信息对于更好地理解问题很有用:

多个分离株与一个分离株

https://martin-robert-fink.medium.com/dart-is-indeed-multi-threaded-94e75f66aa1e

© www.soinside.com 2019 - 2024. All rights reserved.