【问题标题】:Multi-core JIT in multithreaded application多线程应用程序中的多核 JIT
【发布时间】:2014-05-05 02:48:51
【问题描述】:

我想了解 ProfileOptimization(也称为多核 JIT)在多线程应用程序中的工作原理。

文档说 ProfileOptimization 跟踪和记录在应用程序执行期间调用的方法。但是如果有多个线程同时执行呢?在这种情况下,方法调用顺序可能因运行而异。因此配置文件将始终被新数据覆盖。

这是否意味着在这种情况下使用多核 JIT 效率不高?或者可能是 ProfileOptimization 仅跟踪来自调用 ProfileOptimazation.StartProfile(...) 的线程的方法调用?还是别的什么?

有人能解释一下 ProfileOptimization 在这种情况下的表现吗?

【问题讨论】:

    标签: multithreading .net-4.5 multicore jit


    【解决方案1】:

    不清楚为什么你认为线程是个问题,我会稍微讨论一下这个功能。抖动工作的传统方式是通过即时编译方法,在方法开始运行前几分之一秒。这与多核 JIT 选项不同,它必须更早地编译方法,以便它可以利用运行抖动的额外内核。问题是,它应该尽早编译什么方法?显然,如果它编译错误的方法几乎没有什么好处,这种方法只会在程序开始后几分钟内被调用。或者更糟的是,永远不会被调用。

    要弄清楚它应该使用什么方法,它需要提前知道要运行什么方法。时间机器当然不是一种选择。它只能通过了解以前发生的事情来以一定程度的准确度猜测这一点。假设当程序第二次运行时,它会以大致相同的顺序调用方法。

    因此,您对 StartProfile() 的调用开始记录被 jitted 方法的名称,只是按照它们第一次运行和编译的顺序。该方法名称列表存储在一个文件中。下次您运行程序并再次调用 StartProfile() 时,它现在开始使用该文件中的数据来让其他内核工作,按照它们在列表中出现的顺序预编译方法。

    这很有可能在第一次运行之前已经编译了该方法,不会产生任何延迟。从而改善程序的热启动时间。不必如此,当它还没有编译时,什么都不会出错,传统上发生的正常即时编译会处理它。它只是没有它可能那么有效。

    如果您的程序在启动时具有高度的不确定性,从一次运行到下一次的代码执行路径截然不同,那么,不,多核 jit 对您的启动时间有益的可能性将是低一个。抖动会预编译错误的方法。这是非常不寻常的,真正的程序在启动时很少有这种行为。这与线程没有任何关系,它们不太可能比主线程的确定性更差。实际上相反,主线程应该与用户交互,这可能会像人类一样表现得不合理,而您的工作人员则不会。一般来说,线程的问题,他们倾向于解决隐藏线程竞争错误的执行模式。

    请记住,所有这一切只在程序生命周期的最初 30 秒内很重要。并且只对热启动时间很重要。当抖动率降得太低时,抖动会完全停止记录。

    【讨论】:

    • 汉斯,谢谢你非常详细的回复。我会尽量澄清我的想法。说“使用多核 JIT 效率不高”,我认为它不如在单线程环境中那么有效。您的帖子证实了这一点。
    • 顺便说一下,我们不限于仅在应用启动时使用 StartProfile()。我们可以在应用程序第一次开始做某事时使用它,方法是在 StartProfile() 中指定相应的配置文件名称。例如,在我们的应用程序中,我们在打开子窗口时使用它,它工作得很好。我认为在启动后台任务时使用它也很棒,但不幸的是它不会那么高效,因为方法调用顺序可能从一次运行到下一次不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2015-04-01
    相关资源
    最近更新 更多