C# 线程将提高性能吗?

C# 线程将提高性能吗?,c#,multithreading,C#,Multithreading,我有一个这样设置的程序。它是一个.Net Framework 4控制台应用程序。 此程序用于从每个服务器上的每个日志文件(前一周)中收集sc字节和cs字节。此程序已完成,但需要很长时间才能运行 foreach (string server in servers) { foreach (string website in Directory.GetDirectories(server)) {

我有一个这样设置的程序。它是一个.Net Framework 4控制台应用程序。 此程序用于从每个服务器上的每个日志文件(前一周)中收集sc字节和cs字节。此程序已完成,但需要很长时间才能运行

foreach (string server in servers)
            {

                foreach (string website in Directory.GetDirectories(server))
                {

                    foreach (string file in Directory.GetFiles(website))
                    {
我只是想知道像线程或PLINQ这样的东西是否可以用来加速这个过程? 如果这能提高性能,我不确定实现它的最佳方式,因为为每个日志文件(甚至每个网站)都有一个新线程似乎不合逻辑,因为有这么多线程显然不会提高性能

如果您需要查看更多代码,请询问,但此程序基本上读取过去七天内创建的每个文件的每一行,添加字节数,然后使用目录条目(从ID)获取网站名称,然后将每个网站的名称和总字节数输出到文本文件中(最终将成为一个数据库)。 我不需要任何实际的代码,只需要关于提高性能的最佳方法(如果可能)的建议


谢谢。

在像这样的IO绑定任务中(迭代目录和文件并读取它们),瓶颈是磁盘IO,而不是CPU

并行化(?)这不太可能有助于加快速度,甚至可能会影响性能。

这实际上取决于所做的“处理”,即使用多个并发线程是否会提高性能。根据您的描述,您很可能受到I/O限制,因此多线程不会有多大帮助,甚至可能会更糟


因此,除非你自己测量,否则答案是肯定的“可能”。测量是关键。

如果服务器是不同机器上的磁盘,那么将来自每个服务器的请求目录和文件并行化将提高性能。即一台服务器在一个线程中运行,可能1000台服务器在10个线程中运行。您的程序将等待大量IO,网络带宽可能是瓶颈。
更好的方法是在每台服务器上都有一个web服务来执行计数,然后向每一个web服务询问结果。这样,网络就不会成为瓶颈,甚至可以让web服务在您询问时已经知道答案(可能使用文件系统监视程序)

答案取决于以下几点:运行客户机程序的机器有多少CPU,每台服务器的日志检查是直接进入每台服务器上的日志文件夹,还是检查每台服务器上的每个目录(如果是,服务器上的文件系统有多大),以及文件夹在代码片段中的深度,这可能是通过Directory.GetDirectories进行的递归

您说过此任务需要“很长时间”才能运行。在收集数据时,一些基本的Perfmon统计信息和一些TaskManager视图可以帮助您确定本地使用了多少CPU和磁盘,但我怀疑没有您想象的那么多


如果您使用.Net的System.Threading同时处理多个远程服务器上的日志,您很可能会发现I/O负载在多线程下的不同服务器上分布为I/O负载。然后,客户端计算机上试图同时从不同服务器收集此数据的可能瓶颈将由客户端计算机必须对线程进行多处理的CPU数量以及它可以提供的网络带宽,以便通过网络路径同时接收到各个服务器的答案。

文件系统缓存对数据的访问,特别是目录和文件信息。因此,您应该能够看到p的轻微改进性能如果你使用PLINQ之类的东西。在控制台应用程序中,我真的看不出有什么意义。如果性能和对性能的感知很重要,那么这类事情将在GUI中完成,包括进度和取消


但是,我认为您发布的代码存在一些问题。从网站获取文件?这将需要通过连接到另一台服务器的某种请求;我建议操作以异步方式完成。不过,您还没有向任何人提供详细信息来建议您如何做。

只有在性能良好的情况下,并行才有意义多个线程的性能优于一个线程的性能

实际结果取决于您拥有的硬件

如果您拥有非常快速的网络,并且数据存储在每个服务器的SSD中,那么您可以尝试并行所有进程

上述配置在现实世界中很少见

在常规环境中检查您的网络利用率。如果低于20%,您可以尝试对服务器进行并行处理

与多线程读取相比,使用HDD(而不是SSD)进行顺序读取要快得多,因此嵌套循环的并行化不太可能对您有所帮助


p.S.不要尝试100%利用您的网络。您的IT不会对此感到高兴。

一个好主意可能是投资一台高端SSD。这肯定会比多线程处理您的应用程序更好。您的代码没有任何意义。您是如何从网站获取文件的?对不起,也许吧我应该提供更多的代码。我的服务器阵列中的每个服务器看起来都像…服务器。添加(@“\\1.1.1.1\e$\logfiles”);…它们都直接指向一个日志文件夹,然后我使用Directory.GetFiles。感谢您的快速响应。抱歉,我无法投票支持您的答案。感谢您的快速响应。抱歉,我无法投票支持您的答案。我不是从网站获取文件,而是从服务器获取文件。每个服务器都设置了一个日志文件夹,其中包含每个网站的文件夹ide。每个网站文件夹都包含日志文件。如果需要,我可以提供更多代码。您可以对服务器和网站进行详细编码…不清楚您要做什么;因此,可能很难给您提供建议。我的代码中提到的网站只是服务器上的一个目录,n