gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:22:25 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com