我希望展示从一段代码生成的汇编代码,这些代码执行完全相同的操作。例如:
int a = 100;
int b = 50;
int c = a + b;
我正在为我的工作团队开设一个小型介绍类(class),人们开始对性能等问题提出疑问,并希望能够向他们展示这个示例。
最佳答案
嗯,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
这是来自 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
如果您想找出在任何一个时间点为该代码运行的 native 机器代码,通常需要某种调试器,例如.NET 的 cordbg。即便如此,您仍需要确保打开适当的 JIT 编译器优化,因为在调试时您经常不使用优化,因为它会使调试变得更加困难。然后记住,对于像 HotSpot 这样的东西,下次该方法被调用时你可能不会运行相同的代码......
通常不应在汇编代码级别考虑性能,因为这会忽略太多上下文 - 缓存中有什么、此代码运行的频率、一个分支或另一个分支的运行频率。通常重要的是整个应用程序(或者可能是某些子系统或其他子系统)在现实生活中使用时的行为方式。
关于c# - Java 与 C# 机器代码做同样的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5077024/