Questions tagged «jit»

即时编译(JIT)是一种用于通过将解释的代码转换为机器代码来提高其性能的技术。


3
输出-1在循环中变为斜线
令人惊讶的是,以下代码输出: / -1 编码: public class LoopOutPut { public static void main(String[] args) { LoopOutPut loopOutPut = new LoopOutPut(); for (int i = 0; i < 30000; i++) { loopOutPut.test(); } } public void test() { int i = 8; while ((i -= 3) > 0) ; String value = …
54 java  string  while-loop  jvm  jit 

2
Java:手动展开的循环仍比原始循环快。为什么?
考虑下面两个长度为2的代码片段: boolean isOK(int i) { for (int j = 0; j < filters.length; ++j) { if (!filters[j].isOK(i)) { return false; } } return true; } 和 boolean isOK(int i) { return filters[0].isOK(i) && filters[1].isOK(i); } 我认为,经过充分的预热后,这两块琴的性能应该相似。 我已经使用JMH微基准测试框架对此进行了检查,如此处和此处所述,并观察到第二个片段的运行速度提高了10%以上。 问题:为什么Java没有使用基本循环展开技术优化我的第一个代码段? 特别是,我想了解以下内容: 我可以很容易地产生一个代码,为2个滤波器的情况下最佳的,仍然可以在过滤器另一个号码的情况下工作(想象一个简单的建造者): return (filters.length) == 2 ? new FilterChain2(filters) : new FilterChain1(filters)。JITC可以这样做吗?如果不能,为什么? …

1
编写高性能的Javascript代码而无需优化
当使用对大型数值数组(例如线性代数程序包,对整数或浮点数进行操作)的Javascript编写对性能敏感的代码时,总是希望JIT尽可能提供帮助。大概意味着: 我们始终希望数组是压缩的SMI(小整数)或压缩的Double,这取决于我们是在进行整数还是浮点计算。 我们始终希望将相同类型的事物传递给函数,以使它们不会被标记为“大形”或未优化。例如,我们始终希望同时调用vec.add(x, y)这两个x并y打包SMI数组,或者同时打包两个Double数组。 我们希望尽可能内联函数。 当一个人偏离这些情况时,会突然而突然地降低性能。出于各种无害的原因,可能会发生这种情况: 您可以通过看似无害的操作将压缩的SMI数组转换为压缩的Double数组,例如的等效项myArray.map(x => -x)。实际上,这是“最佳”的坏情况,因为压缩Double数组仍然非常快。 您可以将打包的数组变成通用的盒装数组,例如通过将数组映射到(意外地)返回null或的函数上undefined。这种情况很容易避免。 您可能会取消对整个函数的优化,例如vec.add()通过传递太多类型的事物并将其变为大形。如果您想进行“泛型编程”,vec.add()则可能会发生这种情况,这种情况在您对类型不十分小心的情况下使用(这样会看到很多类型),并且在想要最大程度地提高性能的情况下也可以使用(例如,它只能收到盒装双打)。 我的问题更多是一个软问题,关于如何根据上述考虑编写高性能的Javascript代码,同时又保持代码的美观和可读性。一些特定的子问题,以便您了解我的目标是: 在打包SMI阵列的世界中,例如,在编程方面有一些准则吗? 是否可以使用Javascript进行通用的高性能编程,而无需使用诸如宏系统之类的工具将其内联vec.add()到callsite中? 鉴于宏调用站点和优化问题,如何将高性能代码模块化到库中?例如,如果我愉快地A高速使用Linear Algebra程序包,然后导入B依赖的程序包A,但B使用其他类型调用该程序包,然后对其进行优化,那么突然(无需更改代码)我的代码运行速度就会变慢。 是否有任何易于使用的良好测量工具来检查Javascript引擎在内部对类型进行的操作?

1
用反射打破JIT优化
当为高度并发的单例类研究单元测试时,我偶然发现了以下奇怪的行为(在JDK 1.8.0_162上进行了测试): private static class SingletonClass { static final SingletonClass INSTANCE = new SingletonClass(0); final int value; static SingletonClass getInstance() { return INSTANCE; } SingletonClass(int value) { this.value = value; } } public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { System.out.println(SingletonClass.getInstance().value); // 0 // Change the instance to a …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.