我想知道ProfileOptimization(也称为多核JIT)如何在多线程应用程序中运行。
文档说ProfileOptimization跟踪和记录在应用程序执行期间调用的方法。但是如果有多个线程同时执行呢?在这种情况下,方法调用顺序可能因运行而异。因此,新数据将始终覆盖配置文件。
这是否意味着在这种情况下使用多核JIT效率不高?或者可能是ProfileOptimization只跟踪调用了ProfileOptimazation.StartProfile(...)的线程的方法调用?或其他什么?
有人可以解释一下ProfileOptimization在这种情况下的表现吗?
答案 0 :(得分:6)
为什么你认为线程是一个问题还不是很清楚,我只想谈谈这个功能一段时间。抖动的传统方式是通过在方法开始运行之前及时编译方法,只需几分之一秒。这与多核JIT选项不同,它必须提前编译方法,以便利用运行抖动的额外内核。问题是,应该尽早编译什么方法?显然,如果它编译错误的一个很少获得,这个方法只能在程序开始时调用几分钟。或者更糟糕的是,永远不会被召唤。
要弄清楚它应该采用什么方法,它需要提前知道将运行什么方法。时间机器当然不是一个选择。通过了解之前发生的事情,它只能在某种程度上准确地猜测到这一点。假设当程序第二次运行时,它将以大致相同的顺序调用方法。
因此,您对StartProfile()的调用开始记录jitted方法的名称,只是按照它们第一次运行的顺序并进行编译。方法名称列表存储在文件中。下次运行程序并再次调用StartProfile()时,它现在开始使用该文件中的数据来为其他核心工作,按照它们在列表中出现的顺序预编译方法。
这个方法在第一次运行之前已经编译好了,但没有任何延迟。从而改善程序的热启动时间。它不一定是,当它还没有被编译时,什么都不会出错,传统上发生的正常的即时编译会照顾它。它的效率不如 那么高效。
如果你的程序在启动时具有高度不确定性,那么从一次运行到下一次运行的代码执行路径就会大不相同,那么,多核jit对你的启动时间有利的可能性就是低一个。抖动将预先编译错误的方法。这是非常不寻常的,真正的程序在启动时很少表现出来。这与线程没有任何关系,它们不太可能比主线程更具确定性。实际上相反,主线程预计会与用户进行交互,这可能表现得像人类一样非理性,而你的工人则不然。而且一般来说线程存在问题,它们倾向于采用隐藏线程争用错误的执行模式。
请记住,所有这一切只对您的计划生命中的第一次,给予或接受,30秒有关。只有热启动时间才有意义。当抖动率下降得太低时,抖动会完全停止记录。