multithreading - 使用列表时 Dart 隔离非常慢

标签 multithreading flutter dart dart-isolates

我想从一个字符串生成一个包含 300 个项目的列表,但是当这个任务被分成 3 个隔离时,每个隔离生成一个包含 100 个项目的列表,它所花费的时间与单个隔离生成 300 个列表的时间一样长项目。
下面的 fetchCoinList() 方法是在隔离中运行的,而 generateList() 方法产生 3 个隔离。
所有这些隔离确实并行工作并返回它们各自的列表。

List<CoinData> fetchCoinList(ListConfig listConfig) {
  List<CoinData> coinList = [];

  for (int index = listConfig.listStart; index < listConfig.listEnd; index++) {
    if (jsonDecode(listConfig.listData)['data'][index]['rank'] == null ||
        jsonDecode(listConfig.listData)['data'][index]['priceUsd'] == null ||
        jsonDecode(listConfig.listData)['data'][index]['changePercent24Hr'] ==
            null) continue;

    int rank =
        int.parse(jsonDecode(listConfig.listData)['data'][index]['rank']);
    String name = jsonDecode(listConfig.listData)['data'][index]['name'];
    String symbol = jsonDecode(listConfig.listData)['data'][index]['symbol'];
    String id = jsonDecode(listConfig.listData)['data'][index]['id'];
    double value = double.parse(
        jsonDecode(listConfig.listData)['data'][index]['priceUsd']);
    double percentChange = double.parse(
        jsonDecode(listConfig.listData)['data'][index]['changePercent24Hr']);
    String image =
        'https://static.coincap.io/assets/icons/${symbol.toLowerCase()}@2x.png';
    print(listConfig.listEnd);

    coinList.add(CoinData(rank, id, name, symbol, value, percentChange, image));
  }
  return coinList;
}

Future<List<CoinData>> generateList(String response) async {
  print("Inside isolate");

  List<CoinData> coinList = [];
  List list = [];

  for (int i = 0; i < 3; i++) {
    ListConfig listConfig = ListConfig(response, i * 100, (i * 100) + 100);
    list.add(compute(fetchCoinList, listConfig));
  }

  for (int i = 0; i < 3; i++) {
    coinList = coinList + await list[i];
  }

  return coinList;
}
有什么办法可以解决这个问题?如果需要(不挂主线程),将如何生成 300 或 1000 个项目的列表?

最佳答案

您的主要问题可能是您在 fetchCoinList 中处理 JSON 解析的方式有点糟糕。你在哪里运行jsonDecode()对于要从​​ JSON 字符串中提取的每个字段。
您应该缓存 jsonDecode() 的结果。 .此外,您还应该缓存您正在执行的其他一些操作。
我做了以下示例来说明如何重写代码:

List<CoinData> fetchCoinList(ListConfig listConfig) {
  final jsonObject = jsonDecode(listConfig.listData) as Map<String, dynamic>;
  List<CoinData> coinList = [];

  for (int index = listConfig.listStart; index < listConfig.listEnd; index++) {
    final dataMap = jsonObject['data'][index] as Map<String, dynamic>;

    if (dataMap['rank'] == null ||
        dataMap['priceUsd'] == null ||
        dataMap['changePercent24Hr'] == null) continue;

    print(listConfig.listEnd);

    final symbol = dataMap['symbol'] as String;

    coinList.add(CoinData(
        rank: dataMap['rank'] as int,
        name: dataMap['name'] as String,
        symbol: symbol,
        id: dataMap['id'] as String,
        value: double.parse(jsonObject['priceUsd'] as String),
        percentChange: double.parse(jsonObject['changePercent24Hr'] as String),
        image:
            'https://static.coincap.io/assets/icons/${symbol.toLowerCase()}@2x.png'));
  }
  return coinList;
}

class CoinData {
  final int rank;
  final String name;
  final String symbol;
  final String id;
  final double value;
  final double percentChange;
  final String image;

  CoinData({
    required this.rank,
    required this.name,
    required this.symbol,
    required this.id,
    required this.value,
    required this.percentChange,
    required this.image,
  });
}

关于multithreading - 使用列表时 Dart 隔离非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70730674/

相关文章:

flutter - 在 flutter 中创建自定义下拉列表 - 或者如何将自定义下拉选项放在其他所有内容之上的图层中

java - 在 AsyncTask 中同步两个并发网络调用

c - 线程函数返回是否需要 pthread_join?

java - 限制部分代码的 Activity 线程数

flutter - 在 null 上调用了方法 'call'。接收器 : null

amazon-web-services - AWS 转录流 BadRequestException : "Could not decode the audio stream..."

flutter - Flutter Await不等待

dart - Flutter 自定义图标不呈现

flutter - 元素类型 'List<Answer>'无法分配给列表类型 'Widget'

java - 我可以将对象添加到队列中而不用担心它会在多线程应用程序中中断吗?