使用java -XX:+PrintFlagsFinal我找到了TieredCompilation旗帜,我在线阅读了一下.
然而,我仍然不知道究竟它设置时会发生什么false.
我知道编译系统支持5个执行级别,基本上分为解释器C1和C2:
资料来源:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34
两个问题:
(1)通过设置-XX:-TieredCompilation,这些级别中的一些只是禁用了吗?如果是的话,哪个?
(2)是否有一些标志来决定是禁用C1还是C2,还是根本不编译?
编辑:不幸的是,LuaJIT在下面的链接中被取消了比较.
这种编程语言的比较表明,LuaJIT比普通的Lua实现有十倍以上的改进.为什么变化如此之大?是否有一些特定的Lua使得它从JIT编译中受益匪浅?Python是动态类型化的,并且也被编译为字节码,那么为什么PyPy(我相信现在有JIT)显示出如此大的性能提升?
在写另一个问题的答案时,我注意到JIT优化的一个奇怪的边界情况.
以下程序不是 "Microbenchmark",也不是为了可靠地测量执行时间(如另一个问题的答案中所指出的).它仅用作MCVE来重现该问题:
class MissedLoopOptimization
{
public static void main(String args[])
{
for (int j=0; j<3; j++)
{
for (int i=0; i<5; i++)
{
long before = System.nanoTime();
runWithMaxValue();
long after = System.nanoTime();
System.out.println("With MAX_VALUE : "+(after-before)/1e6);
}
for (int i=0; i<5; i++)
{
long before = System.nanoTime();
runWithMaxValueMinusOne();
long after = System.nanoTime();
System.out.println("With MAX_VALUE-1 : "+(after-before)/1e6);
}
}
}
private static void runWithMaxValue()
{
final int n = Integer.MAX_VALUE;
int i = …Run Code Online (Sandbox Code Playgroud) 我听说Java必须使用JIT才能快速.与解释相比,这是完全合理的,但为什么不能有人制作生成快速Java代码的提前编译器?我知道gcj,但我认为它的输出通常不比Hotspot快.
是否有关于语言的事情使这个困难?我认为这取决于这些事情:
我错过了什么?如果我避免使用这些功能,是否可以将Java代码编译一次到本机机器代码并完成?
根据计算机语言基准测试游戏,LuaJIT实现似乎击败了所有其他JIT-ed动态语言(V8,Tracemonkey,PLT Scheme,Erlang HIPE)一个数量级.
我知道这些基准测试不具代表性(正如他们所说:"哪种编程语言实现具有最快的基准测试程序?"),但这仍然令人印象深刻.
在实践中,情况确实如此吗?有人测试过Lua的实现吗?
如果我使用仅在方法中需要的常量,最好在方法范围内或类范围内声明const吗?是否有更好的性能在方法中声明它?如果这是真的,我认为在类范围(文件顶部)定义它们以更改值并更容易重新编译更为标准.
public class Bob
{
private const int SomeConst = 100; // declare it here?
public void MyMethod()
{
const int SomeConst = 100; // or declare it here?
// Do soemthing with SomeConst
}
}
Run Code Online (Sandbox Code Playgroud) .NET程序首先编译为MSIL代码.执行时,JIT编译器会将其编译为本机机器代码.
我想知道:
这些JIT编译的机器代码存储在哪里?它只存储在进程的地址空间中吗?但是由于程序的第二次启动比第一次快得多,我认为即使在执行完成之后,这个本机代码也必须存储在磁盘上.但是哪里?
我正在为最近一直在研究的业余爱好虚拟机编写JIT编译器.我知道有点汇编,(我主要是一个C程序员.我可以阅读大多数汇编参考我不理解的操作码,并编写一些简单的程序.)但我很难理解这几个例子我在网上找到的自修改代码.
这是一个这样的例子:http://asm.sourceforge.net/articles/smc.html
提供的示例程序在运行时进行了大约四种不同的修改,其中没有一个被清楚地解释.Linux内核中断被多次使用,没有解释或详细说明.(作者在调用中断之前将数据移动到几个寄存器中.我假设他正在传递参数,但这些参数根本没有解释,让读者猜测.)
我正在寻找的是自修改程序代码中最简单,最直接的例子.我可以看到的东西,用于理解如何编写x86程序集中的自修改代码,以及它是如何工作的.您是否有任何资源可以指向我,或者您可以提供的任何示例都能充分证明这一点?
我正在使用NASM作为我的汇编程序.
编辑:我也在Linux上运行此代码.
我正在更新一些旧代码,并且发现了几个实例,每次需要调用其中一个属性或方法时,都会重复转换相同的对象.例:
if (recDate != null && recDate > ((System.Windows.Forms.DateTimePicker)ctrl).MinDate)
{
((System.Windows.Forms.DateTimePicker)ctrl).CustomFormat = "MM/dd/yyyy";
((System.Windows.Forms.DateTimePicker)ctrl).Value = recDate;
}
else
{
(System.Windows.Forms.DateTimePicker)ctrl).CustomFormat = " ";
}
((System.Windows.Forms.DateTimePicker)ctrl).Format = DateTimePickerFormat.Custom;
Run Code Online (Sandbox Code Playgroud)
我倾向于修复这种怪异,但考虑到我有限的时间,我不想打扰任何不影响功能或性能的东西.
所以我想知道的是,这些冗余的演员是否被编译器优化了?我试着用一个简单的例子使用ildasm自己搞清楚,但不熟悉IL我只是更加困惑.
UPDATE
到目前为止,共识似乎是a)不,演员表没有优化,但b)虽然可能会有一些小的性能影响因此,它不太可能显着,并且c)我应该考虑修复它们无论如何.如果我有时间的话,我有一天会解决这些问题.同时,我不会担心他们.
感谢大家!
除了确保它们无法更改(编译器错误的调整)之外,JIT是否对const本地进行任何优化?
例如.
public static int Main(string[] args)
{
const int timesToLoop = 50;
for (int i=0; i<timesToLoop; i++)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)