首页 > 解决方案 > 解析多状态响应的性能不佳

问题描述

我正在使用 xml 库来解析多状态响应。该代码需要花费很多秒来解析一个简单的 xml。我可以做些什么来提高性能?我不能在工厂中使用异步代码。

我对 xml 库的解析速度感到惊讶,而且没有任何异步代码。我试图分析库的代码以将其作为我可以做什么的示例,但我无法理解。

import 'package:xml/xml.dart';

class MultiStatus {
  final List<Response> response;
  final String? syncToken;

  MultiStatus({required this.response, this.syncToken});

  factory MultiStatus.fromXml(XmlDocument element) {
    var response = <Response>[];

    var multistatus = element.firstElementChild;

    if (multistatus!.name.local == 'multistatus') {
      var elements = multistatus.children.whereType<XmlElement>();

      // add responses
      elements
          .where((element) => element.name.local == 'response')
          .forEach((element) {
        response.add(Response.fromXml(element));
      });

      try {
        var syncToken = elements
            .firstWhere((element) => element.name.local == 'sync-token');

        return MultiStatus(response: response, syncToken: syncToken.text);
      } catch (e) {
        return MultiStatus(response: response);
      }
    }

    throw Error();
  }

  factory MultiStatus.fromString(String string){
    var document = XmlDocument.parse(string);

    return MultiStatus.fromXml(document);
  }
}

class Response {
  final String href;
  final Propstat propstat;

  Response({required this.href, required this.propstat});

  factory Response.fromXml(XmlElement element) {
    if (element.name.local == 'response') {
      var elements = element.children.whereType<XmlElement>();

      var href =
          elements.firstWhere((element) => element.name.local == 'href').text;

      var propstatXml =
          elements.firstWhere((element) => element.name.local == 'propstat');

      return Response(href: href, propstat: Propstat.fromXml(propstatXml));
    }

    throw Error();
  }
}

class Propstat {
  final Map<String, dynamic> prop;
  final int status;

  Propstat({required this.prop, required this.status});

  factory Propstat.fromXml(XmlElement element) {
    if (element.name.local == 'propstat') {
      var prop = <String, dynamic>{};

      var elements = element.children.whereType<XmlElement>();

      var props = elements
          .firstWhere((element) => element.name.local == 'prop')
          .children
          .whereType<XmlElement>();

      props.forEach((element) {
        var value = element.text.isNotEmpty
            ? element.text
            : element.children.whereType<XmlElement>();

        prop[element.name.local] = value;
      });

      var status = elements
          .firstWhere((element) => element.name.local == 'status')
          .text
          .split(' ')[1];

      return Propstat(prop: prop, status: int.parse(status));
    }

    throw Error();
  }

  @override
  String toString() {
    var string = '';

    prop.forEach((key, value) {
      var valueString = value.toString();

      string += '$key: ${valueString.length > 200 ? '\n' : ''}$valueString';
    });

    return string;
  }
}

标签: xmlperformancedartwebdavcaldav

解决方案


很难从您发布的代码中判断出什么问题。

您能否分享以下一项或多项详细信息?

  • 运行时的配置文件转储(让我弄清楚时间花在了哪里);
  • 提供一个包含输入数据的可运行(理想情况下是最小的)示例;
  • 如果不可能,至少提供输入数据的一些定量信息(文件大小、文件结构、不同部分的大小、元素数量;数据如何加载;...);
  • 提供有关您运行代码的设备/机器的信息;
  • 等等

推荐阅读