为什么当我运行多线程的方法时速度较慢?

时间:2014-07-23 18:07:01

标签: c# multithreading

我用一个线程运行它。

class Program
{
    static void Main(string[] args)
    {
        Thread thread = new Thread(x => beginAnalysis("C:\\Images\\1"));
        thread.Start();
    }

    public static void beginAnalysis(string folderPath)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        var imagesPath = Directory.GetFiles(folderPath, "*.jpg", SearchOption.AllDirectories);

        var sealSaver = new ImageProcessingLib.SealSaver();

        foreach (string imagePath in imagesPath)
        {
            sealSaver.SealSaver(imagePath);
        }
        sw.Stop();
        Console.WriteLine("Total time: {0}",sw.Elapsed.ToString());Console.ReadKey();
    }
}

时间的结果是

总时间:00:00:09.0007113

但是当我运行四个线程时,时间是非常不同的

 class Program
{
    static void Main(string[] args)
    {
        Thread thread = new Thread(x => beginAnalysis("C:\\Images\\1"));
        thread.Start();
        Thread thread2 = new Thread(x => beginAnalysis("C:\\Images\\2"));
        thread2.Start();
        Thread thread3 = new Thread(x => beginAnalysis("C:\\Images\\3"));
        thread3.Start();
        Thread thread4 = new Thread(x => beginAnalysis("C:\\Images\\4"));
        thread4.Start();
    }

    public static void beginAnalysis(string folderPath)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        var imagesPath = Directory.GetFiles(folderPath, "*.jpg", SearchOption.AllDirectories);

        var sealSaver = new ImageProcessingLib.SealSaver();

        foreach (string imagePath in imagesPath)
        {
            sealSaver.SealSaver(imagePath);
        }
        sw.Stop();
        Console.WriteLine("Total time: {0}",sw.Elapsed.ToString());Console.ReadKey();
    }
}

时间的结果是

Total time: 00:00:12.0002174

Total time: 00:00:11.0006616

Total time: 00:00:12.0011639

Total time: 00:00:13.0006828

如果时间是同一个文件夹,为什么时间会改变?

这些是我的电脑的特点:

操作系统:Windows 8.1 Pro - 64位

RAM:6 GB

处理器:Intel i5-34170 3.20 Ghz核心 - 4

缓存L1 256KB - L2 1.0 MB - L3 6.0 MB

我使用framework 4.0和visual studio 2010进行开发

图书馆" ImageProcessingLib"不使用共享资源。

如果时间是同一个文件夹,为什么时间会改变?

1 个答案:

答案 0 :(得分:1)

有很多原因导致您的代码在MT环境中运行得更慢:

  • 与运行单线程相比,运行多线程代码会增加管理开销。通常,您希望执行代码的并行化将弥补它在多核系统上的总体执行时间下降的意义上,可能花费每个线程花费相同的时间或更长的时间如果/当你设法点亮所有核心。
  • 你的代码正在做一些并行的串行操作(扫描目录)。如果你正在访问同一个目录,结果很可能是由你的操作系统缓存的,但是你要点击四个目录。这意味着当操作相互重叠时,您必须等待每个IO完成IO。这不是改善表现的好方案。

出于性能原因运行代码多线程(与运行代码多线程相反,因为您希望UI始终响应)只有在没有共同的阻塞点并且操作完全独立时才有意义。在您的示例中并非如此,因为IO是瓶颈,并且无法在普通计算机上高效并行化,因为您正在处理磁盘延迟。有一些方法可以改善延迟(更快的磁盘或SSD),但您仍然在处理基本上串行的操作。