Java/Android : virtual dispatch, switch-case,或数组访问

标签 java android arrays performance switch-statement

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

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

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

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

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

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

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

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

最佳答案

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

关于Java/Android : virtual dispatch, switch-case,或数组访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653748/

相关文章:

javascript - 如何使用一些从 Angular 6 中的数组列表中查找重复项?

python - 在python中组织点数组

java - 无法将字节转换为 KB

java - 有没有办法将参数传递给Runnable?

java - 暴乱异常 : No dataset writer for RDF/XML/pretty

android - 将项目迁移到 AndroidX 后 com.paymob.acceptsdk.PayActivity void androidx.appcompat.app.ActionBar 崩溃

android - Feature2d + Homography Java实现

java - 使用 TextureView 缩放 Camera2 预览

javascript - 如何检查数组中的属性

java - 使用 SAAJ 使用经过身份验证的 Web 服务?