热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化大量实体加载-OptimizingBulkEntityLoading

本文探讨了如何通过优化SOAP服务调用和多线程处理来减少生成的事件数量,并提高加载大量实体的效率。

我正在调用一个SOAP服务,该服务根据给定的ID返回一个实体。每次请求仅接受一个ID,因此需要多次调用Web服务来加载所有实体(例如10,000个)。

为了加快这一过程,我使用了多个线程来发出请求,并将所有实体插入到一个并发字典中。尽管如此,整个过程仍然需要几分钟时间。我希望能够在接收到一定数量的实体后,定期将结果返回给调用者,例如每100个实体接收一次。

虽然可以使用事件来实现这一点,但我并不希望为每个收到的实体都触发一个事件。此外,频繁检查计数器是否达到100也会影响性能,因为计数器需要同步。

你有什么建议吗?是否应该使用事件?还有其他更好的方法吗?

解决方案

#1 批量处理线程

如果可以将线程“批量”处理,这种方法可能会有效。使用Task而不是Thread,然后批量创建这些任务。最后,利用Task.WaitAll方法:

// 创建并启动任务
Task[] tasks = new Task[100];
for (int i = 0; i <100; i++)
{
    // action是你的方法委托
    tasks[i] = Task.Factory.StartNew(action);
}

Task.WaitAll(tasks);
FireHundredComplete(); // 触发事件

需要注意的是,Task.WaitAll会阻塞当前线程(且不是异步方法,因此不能使用await)。因此,每个任务集可能在不同时间完成,导致事件在看似随机的时间间隔内触发。同步仍然是一个问题。

#2 使用互锁优化计数器

虽然在同步块中递增计数器非常快速,但可以使用互锁(Interlocked)进一步优化性能:

if ((Interlocked.Increment(ref counter) % EventFrequency) == 0)
{
    // 触发事件
}

此外,真正的性能瓶颈可能是大量的Web服务调用。建议将请求分批处理,而不是一次性发送10,000个请求。例如,可以将10,000个请求分成100个批次,每批次100个请求。这样不仅提高了性能,还减少了网络延迟的影响。


推荐阅读
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • php三角形面积,335宝石大全
    php三角形面积,335宝石大全 ... [详细]
  • 本文探讨了如何在游戏启动画面中移除广告,特别是在游戏数据加载期间(大约5-6秒)广告会短暂显示的问题。通过调整XML布局和代码逻辑,可以实现广告的延迟加载或完全移除。 ... [详细]
  • 本文详细介绍了如何在Android应用中实现重复报警功能。示例代码可在以下路径找到:https://developer.android.com/samples/RepeatingAlarm/index.html。首先,我们将从Manifest文件开始分析。 ... [详细]
  • 深入解析Dubbo:使用与源码分析
    本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。 ... [详细]
  • 本文介绍了读写锁(RWMutex)的基本概念、实现原理及其在Go语言中的应用。读写锁允许多个读操作并发执行,但在写操作时确保互斥,从而提高并发性能。 ... [详细]
  • 本文介绍了如何通过 AJAX 发送请求到后端控制器,并将返回的 JSON 数据解析后在前端页面上显示。具体步骤包括发送 AJAX 请求、解析 JSON 字符串和遍历数据。 ... [详细]
  • 阿里面试题解析:分库分表后的无限扩容瓶颈与解决方案
    本文探讨了在分布式系统中,分库分表后的无限扩容问题及其解决方案。通过分析不同阶段的服务架构演变,提出了单元化作为解决数据库连接数过多的有效方法。 ... [详细]
  • 在React中使用setState时遇到错误,本文将详细分析错误原因并提供解决方案。 ... [详细]
author-avatar
王柱柱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有