Java与C#机器代码做同样的事情

Ste*_*anE 1 c# java assembly

我想展示从一段完全相同的代码生成的汇编程序代码.例如:

int a = 100;
int b = 50;
int c = a + b;
Run Code Online (Sandbox Code Playgroud)

我正在为我的团队在工作中做一个小型的入门课程,人们已经开始对性能等问题,并希望能够向他们展示这个例子.

Jon*_*eet 9

好吧,Java编译器和(普通)C#编译器都不会从源代码生成"本机"汇编代码.它们将分别生成Java字节码或IL代码.然后,根据正在使用的VM,该代码可能最终被解释或JIT编译 - 并且可能多次编译JIT(例如,在HotSpot上).

例如,这是源代码的Java字节码,在我的工作站上使用javac编译(对于这样一个简单的示例,它不太可能有很大不同,但很明显,对于更复杂的代码,可以选择生成什么字节码/ IL):

// Java bytecode
0:  bipush  100
2:  istore_1
3:  bipush  50
5:  istore_2
6:  iload_1
7:  iload_2
8:  iadd
9:  istore_3
Run Code Online (Sandbox Code Playgroud)

这是来自C#编译器的IL:

// IL
IL_0001:  ldc.i4.s   100
IL_0003:  stloc.0
IL_0004:  ldc.i4.s   50
IL_0006:  stloc.1
IL_0007:  ldloc.0
IL_0008:  ldloc.1
IL_0009:  add
IL_000a:  stloc.2
Run Code Online (Sandbox Code Playgroud)

如果你想知道在任何一个时间点为该代码运行什么本机机器代码,通常需要某种调试器,例如用于.NET的cordbg.即使这样,您也需要确保打开适当的JIT编译器优化,就像调试时经常使用优化一样,因为它会使调试行为更加困难.然后请记住,使用像HotSpot这样的东西,下次该方法被击中时你很可能不会运行相同的代码...

通常不应在汇编代码级别考虑性能,因为这会忽略太多上下文 - 缓存中的内容,此代码运行的频率,一个分支或另一个分支的频率.通常重要的是整个应用程序在现实生活中使用时的行为(或者某些子系统或其他).