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

标签 c# java assembly

我希望展示从一段代码生成的汇编代码,这些代码执行完全相同的操作。例如:

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/

相关文章:

c# - 在 C# 中保存的 JPG 的质量

c# - System.ArgumentNullException : Value cannot be null, 参数名称: implementationInstance

java - 不安全如何重构重复代码

java - 使用 concat() 时,JPA native 查询返回字节数组而不是字符串

windows - ld 链接器的输出可执行文件比 golink 输出可执行文件大,为什么?

c# - 如何配置 omnisharp syntastic 语法检查器更宽松?

java - 可能的 AuthenticationFailureException :RabbitMQ Java

pointers - 汇编词ptr含义

gcc - x86_64 汇编器中 64 位指针如何放入 4 个字节

c# - 是否可以更改 WPF 图像控件中图像插值的质量?