如何使用GZip多线程存档器将CPU负载优化到100%?

时间:2019-03-03 09:21:42

标签: c# .net multithreading gzip

我已经在多线程文件归档器上工作了一个星期,它仅在干净线程上工作。通过监视器和AutoResetEvent实现同步。 我将线程数分配给了这样的核心数:

public static int GetCoreCount()
        {
            int coreCount = 0;
            foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
            {
                coreCount += int.Parse(item["NumberOfCores"].ToString());
            }
            return coreCount;
        }

但是,这会使我的CPU最大负载达到65%。 而且这种负载远非均匀,它不断地上下波动。 告诉我。有谁知道如何使用100%处理器功能? 这是我的Run()代码:

 public void Run()
        {
            var readingThread = new Thread(new ThreadStart(ReadInFile));
            var compressingThreads = new List<Thread>();
            for (var i = 0; i < CoreManager.GetCoreCount(); i++)
            {
                var j = i;
                ProcessEvents[j] = new AutoResetEvent(false);
                compressingThreads.Add(new Thread(() => Process(j)));
            }
            var writingThread = new Thread(new ThreadStart(WriteOutFile));

            readingThread.Start();

            foreach (var compressThread in compressingThreads)
            {
                compressThread.Start();
            }

            writingThread.Start();

            WaitHandle.WaitAll(ProcessEvents);
            OutputDictionary.SetCompleted();

            writingThread.Join();

1 个答案:

答案 0 :(得分:0)

在不进行概要分析的情况下,不可能说出是什么限制了您的核心使用,也无法知道您在测试中压缩了多少数据。

但是我可以说,为了获得良好的效率,其中包括完整的内核利用率和一个线程上 n 个线程的 n 加速因子,在pigz中,我必须创建始终在运行或等待更多工作的线程池。为每个要处理的数据块创建和销毁线程将产生巨大的影响。出于相同的原因,我也有预分配的内存块池。

链接中C语言中的源代码可能会有所帮助。