【问题标题】:Optimizing Smart Client Performance优化智能客户端性能
【发布时间】:2010-03-14 01:04:00
【问题描述】:

我有一个智能客户端 (WPF),它调用服务器 va 服务 (WCF)。我正在处理的屏幕包含一个在调用构造函数时加载的对象列表。我可以添加、编辑和删除列表中的记录。

我所做的通常是在每次添加或删除之后再次从服务中重新加载整个模型,这有很多原因,包括在两次调用之间服务器上的数据可能已更改。

事实证明,这种方法对性能有很大影响,因为我在添加和编辑上加载所有发送列表的内容。

还有哪些其他选项可供我选择,我是否应该只向服务器发送所需的信息?如何在每次执行添加或删除时不重新加载所有数据?

【问题讨论】:

    标签: c# wpf winforms wcf web-services


    【解决方案1】:

    执行您所描述的操作的最佳方式(我将假设您知道客户端/服务器 I/O 已经是瓶颈)是在填充客户端后仅在两个方向上发送更改。

    如果您采用日志模型来更新数据,这可能很简单。为了让任何进程对共享数据进行更改,它必须创建一个添加到日志中的带时间戳的事务。数据的更新是通过将事务应用于数据的方法进行的。

    一旦您的数据模型支持事务日志,您就有一种直接的方法来保持客户端和服务器同步,同时将网络流量降至最低:为了更新客户端,服务器会发送自上次更新客户端的时间。

    改造现有设计可能需要大量工作。在你走这条路之前,你要确定你试图解决的问题实际上就是你遇到的问题。

    【讨论】:

      【解决方案2】:
      1. 确保此功能得到良好封装,以便您可以在不接触其他组件的情况下使用它。
      2. 将您的源代码置于版本控制之下并经常签入。
      3. 我强烈建议您进行一套自动化单元测试,以在重构之前验证一切是否按预期工作,并在您执行每次更改时继续工作。
      4. 如果性能影响是服务器->客户端数据传输,而不是服务器上的查询、处理和磁盘 IO,您可以考虑设计给定集合或对象图的哈希,并传递哈希到服务器上的服务方法,该方法将从数据库中查询和计算哈希,比较哈希,并返回truefalse。只有false 才会重新加载数据。如果更改不太可能或不经常发生,则此方法有效,因为当数据发生更改时,它需要两次调用来获取数据。如果数据库中的更改是一个问题,您可能不希望仅在用户修改或添加某些内容时获取更改 - 例如,这可能是基于计时器的完全独立的操作。您的并发策略实际上取决于您的数据、用户数量、多个用户对同时更改相同数据感兴趣的可能性等。

      【讨论】:

      • 你知道这不仅仅是一个问题的标题,对吧?问题是关于优化的,这只是在触及优化之前的尽职调查。如果我的回答只有 1,2 和 3,我可以理解反对票,但不能全面了解工程实践。不过,我会回答你的问题。为了衡量和比较给定更改的性能影响,需要保留每个实现的版本。为了使这一点变得实用,正在处理的系统应该被很好地封装。为了使其高效,您必须知道它是否有效,从而进行测试。
      猜你喜欢
      • 1970-01-01
      • 2011-07-25
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2019-03-04
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多