我有一个控制台应用程序,它执行以下操作:
>读取输入文件.输入文件具有遍历数千行的行方式数据
>预处理输入文件并转换为中间文件.中间文件具有相同的行数.
>一次从中间文件中读取一行,形成Web请求并将其发送到Web服务器.
>一次从Web服务器读取每个请求的响应,处理(解析)它并将其写入输出文件.输出也具有与输入文件相同的行数.
现在,目前应用程序运行正常,但速度非常慢.我想提高应用程序的性能,以使其更快.
>有人可以告诉我在这种情况下可能使用的各种方法吗?
>如果多线程是问题的答案,那么有人会提出一些启动指针吗?
编辑:
所有请求都将转到同一台服务器.就服务器而言,我对它的容忍度知之甚少或根本不知道(如果归结为此,我可能会将请求线程的数量限制在服务器上).
最佳答案 要线程还是不线程?就是那个问题…
这个问题的多线程部分的一个简单而正确的答案是:是的,1)根据算法是可行的2)它或者涉及I / O绑定的操作,或者你在CPU绑定操作中有几个核心
第一点:可行性
>要执行步骤2,您必须完成步骤1.尚未进行多线程处理
>步骤3需要完成步骤2,但涉及独立的行间活动(每行一个请求).答对了!!
>步骤4要求在步骤3完成所有请求.多线程在那里结束.
第二点:操作类型
Web请求是I / O绑定的操作.你获得了最大的利益.由于您是否对同一服务器执行请求(容错或不容错),因此必须限制查询速率.需要适当调整并发请求的数量,但如果在代码中使用常量(如const int NUMBER_OF_THREADS = 4;),则有一个很好的起点.
提案
使用信号量来处理并发请求.
通过读取文件并转换为中间文件来启动程序,就像之前一样.
完成后,创建一个固定大小的数组(您说最终文件具有相同的行数,因此您可以分配它),然后为每一行启动一个循环:
>获取一个初始化为NUMBER_OF_THREADS常量的信号量,这将允许主线程激活4个并发线程
>通过向行传递行,目标数组和索引来启动一个线程(您实际上不需要将所有这些作为参数传递,即如果列表是类成员)
在循环之后,等待我将要简要讨论的AutoResetEvent
在线程中,执行以下操作:
>执行Web请求
>处理结果
>将结果保存到相应的目标数组行
>使用Interlocked.Increment()方法增加跨线程共享的变量(此处未讨论)
>如果共享变量等于行数,则释放我提到的AutoResetEvent,这样你就可以解锁主线程
调音
从4个并发线程开始.尝试将它们增加到8并查看性能.我建议你不要超过12个线程,但是其他人可能会说这可能太多了…它只是尝试失败.