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

How to optimize CPU load up to 100% with GZip multithread archiver?

我已经在一个多线程文件归档器上工作了一个星期,它只在干净的线程上工作。同步是通过监视器和 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% 处理器能力? 这是我的 运行() 代码:

 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();

如果不进行分析,就不可能知道是什么限制了您的核心使用,也无法知道您在测试中压缩了多少数据。

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

link 中的 C 源代码可能会有帮助。