首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增加线程和进程优先级,以减少处理器密集型并行应用程序的执行时间。

增加线程和进程优先级,以减少处理器密集型并行应用程序的执行时间。
EN

Stack Overflow用户
提问于 2012-08-21 08:30:32
回答 4查看 8K关注 0票数 5

我知道设置线程优先级是堆栈溢出的禁忌话题,但我确信我的应用程序是提高优先级的好选择。为了证明这一点,我解释了下面的情况。现在的问题是如何有效地做到这一点?

应用程序是.NET 4 (C#)控制台应用程序,它执行一个复杂的算法,执行时间约为5个小时。算法完全不是内存密集型的,只是处理器密集型的.它进行数字处理,不执行任何磁盘I/O、数据库连接、网络连接等操作。应用程序的输出只是一个数字,它在最后写入控制台。换句话说,该算法是完全独立的,没有依赖关系。

该应用程序运行在自己专用的16核心64位计算机上,运行Windows,其空闲RAM远远超过它所需的(8GB)。我的意思是,服务器已经被专门用于运行这个应用程序。

我已经尽可能多地优化了代码,使用了广泛的概要分析、花哨的数学快捷方式和一些绕行的技巧。

以下是伪码的总体结构:

代码语言:javascript
复制
public static void Main ()
{
    Process.GetCurrentProcess().PriorityBoostEnabled = true;
    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;

    // Of course this only affects the main thread rather than child threads.
    Thread.CurrentThread.Priority = ThreadPriority.Highest;

    BigInteger seed = SomeExtremelyLargeNumber; // Millions of digits.

    // The following loop takes [seed] and processes some numbers.
    result1 = Parallel.For(/* With thread-static variables. */);

    while (true) // Main loop that cannot be parallelized.
    {
        // Processes result1.
        result2 = Parallel.For(/* With thread-static variables. */);

        // Processes result2.
        result1 = Parallel.For(/* With thread-static variables. */);

        if (result1 == criteria)
            break;

        // Note: This loop does not need to sleep or care about system responsiveness.
    }
}

现在,基于SO上与线程优先级相关的问题,我认为使用ThreadPool的任何东西都不应该在优先级方面受到干扰。所以,如果我需要切换到手动线程,就这样吧。

问题:

  • 如何将上述代码更改为手动线程处理,以从增加的线程优先级(不使用线程池等)中获益?
  • 将优先级设置为所有子线程的最高优先级会有帮助吗?我的意思是,子线程是仅仅是在互相争斗,还是让它们比外部操作系统任务更有优势?
  • 考虑到有16个内核,我应该运行16个线程还是15个线程?这是否有一般的指引呢?
  • 将进程优先级设置为实时也会有帮助吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-21 09:20:02

有了这样一个应用程序,我希望更改优先级将使整个运行时产生0%的差异。如果你已经用尽了CPU的使用,所有16个核心100%在做真正的工作,没有更多的你可以做。

票数 2
EN

Stack Overflow用户

发布于 2012-08-21 10:37:06

您不需要为单个线程设置优先级,只需为整个进程设置优先级,因为它的大多数线程显然都在执行重要的工作。

不过,我不认为它会对像你这样的CPU密集型应用产生任何影响。唯一可以强行抢占您自己的进程的进程是I/O密集型应用程序,传统上大多数OSes都喜欢这些应用程序,但是由于您有一台专用的机器,所以这不会成为一个问题(而且,在我的经验中,Windows非常轻量级,所以如果您的应用程序是唯一运行的,它就不会受到干扰)。

作为一个旁注:

算法完全不是内存密集型的,只是处理器密集型的.它进行数字处理,不执行任何磁盘I/O、数据库连接、网络连接等操作。

它不执行“明显”的I/O操作这一事实并不意味着它不能占用内存。如果您正在处理大型数组或其他数据结构,CPU将不断向主内存发出读/写操作,并且正在做大量的工作来在不同的内存级别之间移动数据。即使只使用数字也会对程序的性能产生负面影响,如果操作不当的话。

票数 1
EN

Stack Overflow用户

发布于 2019-02-18 18:43:21

我的代码可以更改进程和线程的优先级。

代码语言:javascript
复制
public void SetPriorityProcessAndTheards(string nameProcess,ProcessPriorityClass processPriority, ThreadPriorityLevel threadPriorityLevel)
{
    foreach(Process a in Process.GetProcessesByName(nameProcess))
    {
        a.PriorityBoostEnabled = true;
        a.PriorityClass = processPriority;

        foreach(ProcessThread processThread in a.Threads)
        {
            processThread.PriorityLevel = threadPriorityLevel;
            processThread.PriorityBoostEnabled = true;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12050925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档