我正在尝试使用 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
方法比其执行的实际代码花费更多时间,并导致巨大的开销影响性能。有没有一种方法可以减少
compute
引入的开销,或者我无法弄清楚这个问题的不同方法?
感谢您对我的问题有任何想法或解决方案。
注:
CheckPhotoData
是一个简单的类,包含我的 _work 函数的参数。开销似乎是由调试模式引起的。我在我的应用程序中看到了类似的
compute
数百毫秒的延迟(使用 Flutter 2.10.2),但在发布模式下运行时,延迟不到 10 毫秒。
我也遇到这个问题了。就我而言,在解决问题之前,我会避免在调试模式下调用隔离,如下所示:
final decryptedBytes = (kReleaseMode || kProfileMode)
? await compute(customEncrypter.decryptTheseBytes, encryptedBytes)
: customEncrypter.decryptTheseBytes(encryptedBytes);
虽然我无法提供问题的答案,但我发现这些信息对于更好地理解问题很有用:
https://martin-robert-fink.medium.com/dart-is-indeed-multi-threaded-94e75f66aa1e