我想知道ProfileOptimization (也称为多核JIT)是如何在多线程应用程序中工作的。
文档指出,ProfileOptimization跟踪并记录在应用程序执行期间调用的方法。但是,如果有多个线程同时执行呢?在这种情况下,方法调用顺序可能因运行而异。因此,配置文件将始终被新的数据覆盖。
这是否意味着在这种情况下使用多核JIT并不有效?或者可能是ProfileOptimization跟踪方法调用来自调用ProfileOptimazation.StartProfile(.)的线程?还是别的什么?
有人能解释一下ProfileOptimization在这种情况下是如何表现的吗?
发布于 2014-03-26 16:18:53
还不清楚为什么您认为线程是一个问题,我只想谈一段时间的特性。抖动的传统工作方式是在方法开始运行前的一秒内编译方法。这与多核JIT选项不同,它需要更早地编译方法,这样才能利用运行抖动的额外核心。问题是,它应该提前编译什么方法?显然,如果编译错误的方法,只会在程序开始后的几分钟内被调用,那么收益就很小了。或者更糟的是,从来没有被叫过。
为了弄清楚它应该使用什么方法,它需要提前知道将运行什么方法。当然,时间机器不是一种选择。只有知道以前发生的事情,才能在一定程度上准确地猜测到这一点。假设当程序第二次运行时,它将以大致相同的顺序调用方法。
因此,对StartProfile()的调用开始记录那些被抛出的方法的名称,只需按照它们第一次运行和编译的顺序来记录。方法名称的列表存储在文件中。下一次运行程序并再次调用StartProfile()时,它将开始使用该文件中的数据来完成其他核心工作,并按它们在列表中出现的顺序预编译这些方法。
这个方法在第一次运行之前就已经编译过了,这是相当有可能的,不会有任何延迟。因此,改善您的程序的温暖启动时间。这不一定,当它还没有被编译的时候,什么都不会出错,传统上发生的正常的实时编译就会处理它。只是效率不高。
如果您的程序在启动时具有高度的不确定性,在从一次运行到下一次运行的代码中具有非常不同的执行路径,那么不,多核jit对启动时间的好处的可能性很低。抖动将预编译错误的方法。这是非常不寻常的,真正的程序在启动时很少会这样。否则,这与线程没有任何关系,它们不太可能比主线程更不确定。实际上,主线程会与用户交互,用户可以像人一样表现出非理性,而你的工作人员却不这样做。一般来说,线程的问题在于,它们倾向于解决隐藏线程错误的执行模式。
请记住,所有这一切只是在你的程序生命的第一个,给予或采取,30秒内的问题。只有温暖的开始时间才重要。当抖动率下降过低时,抖动就会完全停止记录。
https://stackoverflow.com/questions/22665436
复制相似问题