0

我知道“在你的应用程序中测试它”是必须的。尽管如此,我也想要求一个分析的见解。

我有一个应用内指令队列(作为一个Array),它的元素是按顺序处理的。细节无关紧要。(将“指令”视为虚拟指令,即仅根据我的应用程序对其进行解释——就像一个小型内部虚拟机)。

实际的问题是:处理队列元素哪个更快——Java 提供的虚拟调度,还是switch-case?

  1. 在第一种情况下,Array由一个自己的对象的后代组成Operation(或者只是Runnable——你明白了)。在这种情况下,指令执行只是调用Operation.run()对象的覆盖。虚拟调度将完成其余的工作——run()将调用具体实例的。

  2. Array是一个原始int数组,每个元素都是一个指令代码,它来自一个连续的范围(例如,int介于 0..65535 之间)。指令处理意味着指令代码被解释:(A)通过switch-case语句,或(B)通过使用由指令代码直接索引的Array(对象)。Operation

在第二种情况下,我想switch-case现在已经足够优化(特别是因为我使用的是连续范围),所以我们可以忘记这个Array选项。

总结一下,哪个更快?将解释代码添加到 的分支switch-case,还是使用虚拟调度?

我想它可以分解为:switch-case更快还是虚拟调度?我读到 aswitch-case可以优化为分支表或跳转指令,我想在这种情况下这是可能的。

4

2 回答 2

1

由于您的 switch 语句是“密集的”,我的感觉是它应该比多重继承方案更快。很可能编译器会将其优化为基于整数索引的表查找。再次只是我的感觉是,编译器更不可能在(内部)解决您的继承方案以便在第二种选择中执行“invokevirtual”操作码......特别是如果基类已被继承在许多变体中。

于 2012-09-29T18:55:15.810 回答
0

我认为 swtich-case 较慢(并且不那么可读),因为它基本上与级联 if/elseif/... 相同,因此在找到正确的 case-branch 之前,您将在这里进行很多比较,而与直接访问,正确的指令应该可以直接访问。(希望我理解你的问题,所有这些假设和理论的东西)

于 2012-09-29T15:32:00.993 回答