- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道 dalvik 中 packed switch 和 sparse switch 操作码的区别。如果你能提供例子,请。谷歌提供的解释我不清楚。
谢谢。
最佳答案
听起来好像packed-switch
相当于Java的tableswitch
,sparse-switch
相当于lookupswitch
.
packed-switch
使用一个简单的跳转表,以 low + n
的形式索引,其中 low
是其中的最低测试值case
标签,n
是 switch
的输入。每个索引处的值表示每个 case
的字节码偏移量。找到正确的跳转地址是一个常量时间操作。
sparse-switch
使用键值对的排序列表,其中每个键都是来自 case
标签的测试值,值是跳跃偏移量。为 lookupswitch
找到正确的跳转目标需要对键进行二进制搜索,因此这是一个对数时间操作。
编译器将选择使用哪个。如果键倾向于聚集在一起或紧密地打包,则可以使用packed-switch
(或者,在 Java 术语中,tableswitch
)高效排放。但是如果键稀疏,并且值的范围(high - low + 1
)很大,那么使用跳转表将需要一大块字节码,因为无论是否有相应的 case
标签,该范围内的所有值都必须存在于跳转表中。在这些情况下,编译器将发出一个 sparse-switch
(lookupswitch
)。
有趣的是,Dalvik 工程师选择以描述应该使用它们的 key 分布的方式命名这些操作码,而 Java 工程师选择描述字节码操作数类似的概念数据结构的名称。
让我们看一些例子。考虑以下 Java 代码,它将生成一个 tableswitch
(并且在转换为 Dalvik 时生成一个 packed-switch
):
static String packedSwitch(final int n) {
switch (n) {
case 5:
return "Five";
case 3:
return "Three";
case 1:
return "One";
default:
return "Other";
}
}
从概念上讲,packed-switch
操作码的负载看起来像这样:
如您所见,它非常紧凑。五个插槽中的三个指向实际的 case
目标,其余两个跳转到 default
目标。但是,如果我们的测试值更加分散呢?
static String sparseSwitch(final int n) {
switch (n) {
case 500:
return "Five Hundred";
case 300:
return "Three Hundred";
case 100:
return "One Hundred";
default:
return "Other";
}
}
如果编译器尝试将其作为 packed-switch
发出,有效载荷将如下所示:
请注意,几百个槽中只有三个实际上指向原始代码中的 case
标签。其余的只是用来填充跳转表。不是很节省空间,是吗?这就是为什么编译器会发出一个 sparse-switch
,对于这个特定示例,它具有更紧凑的字节码足迹:
现在,这更合理了,你不觉得吗?然而,不利的是,我们不能根据输入确切地知道跳转到哪个索引,而是必须对表执行二进制搜索,直到找到匹配的测试值。开关越大,对性能的影响就越大,尽管效果呈对数曲线。
关于java - packed switch 和 sparse switch dalvik操作码的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855800/
我在 PID 上使用 showmap 命令,但我无法理解报告中的这一部分: 16384 3752 689 0 3132 0 620
在哪里可以找到 dalvik 操作码列表以及相应的允许操作数及其大小(8 位/16 位/32 位/62 位) 最佳答案 This给出 dalvik vm 中存在的每个操作码的所有详细信息和 this给
当我们在桌面系统上运行其他虚拟机时,是否可以直接在 Dalvik 虚拟机上执行任务? 最佳答案 如果我正确理解了您的问题:我正在考虑 task在问题中提到 apk (如果是这样,那么以下答案可能对 y
对此进行了一些研究,并发现了一些关于在应用程序中面临相同问题的人的帖子。我也在我的应用程序的谷歌控制台中遇到了这个崩溃,并关注了我发现的帖子( java.lang.ClassNotFoundExcep
我知道这可能是 Android 中的一个基本问题。但是什么是 Dalvik 和 dalvik-cache? 最佳答案 Dalvik 是 Android 使用的虚拟机。它通常被认为是一个 Java 虚拟
关于在运行时动态生成 java 字节码并将其加载到正在运行的 Dalvik VM 中,这个问题已被多次询问(并回答),但是有没有办法在运行时将 dex 文件/字节码加载到应用程序中? 谢谢 最佳答案
Android 中 Dalvik Bridge Function 和 Dalvik Native Function 调用有什么区别? 最佳答案 简单来说, Android 是基于 Linux 的操作系
我想获取标准 Java 库的 Dalvik 字节码,我的意思是,Android 使用的 java 库(例如 java.util.* 集合)。 我需要获取这些类文件,因为我想分析它们,不是全部,而是像
我正在尝试学习 smali,但有一些问题无法通过谷歌搜索找到。 1)我创建了一个简单的测试用例来更好地解释自己 const-string v1, "Start" :try_start_0 const-
在我的应用程序中,我将一些数据存储在 Application 类中: public HashMap> getConfigs() { if (mConfigs != null) {
Java 规范允许编译器和 VM 重新排序内存写入以提高效率。 Dalvik VM 是否具体利用了这一点? 免责声明:我无意依赖顺序,即使 Dalvik 不这样做(此外编译器也可能这样做),但很高兴知
我已经下载并安装了 SDK。但是我的手机没有显示在 Dalvik 调试监视器中。 请帮帮我,这是怎么回事?我已经杀死了服务器。并重新启动。但是 adb devices 没有列出我的设备。我知道在 ec
我有一个正在运行的 dalvik 实例: /system/bin/dalvikvm ... -Xmx100m ... memmap 看起来像: b01f6000-b05b7000 rwxp 00000
如果我知道变量的模式,例如 R.id.edit_x where x (1..N),我如何才能获得对给定 EditText 的引用,例如 findViewByID(R.id.edit_1)。 Dalvi
我刚刚做了一个基准测试来比较局部变量、成员变量、其他对象的成员变量和getter setter 的访问性能。基准测试在循环中增加了 10 次 mio 迭代的变量。这是输出: BENCHMARK:本地1
在我的 Dalvik 调试监视器中 在删除所有以前的日志消息后显示与以前的日志消息具有不同标记的新日志消息。这意味着日志一直在清除自身并且只显示几行。我将如何查看所有日志消息? 最佳答案 我也经常遇到
我试图了解为 Android 中的每个进程分配了多少内存。据我了解,对于每个应用程序进程,都有一个单独的 Zygote 进程实例,Zygote 将 fork Dalvik VM。 我写了一个小的示例
我使用的是 Android 2.2 SDK,无法让 MultiUserChat 类中的静态 block 执行。我试图将其强制加载为 try { String qual = MultiUserC
我们正在为 Android jelly bean 开发一个项目。我们的平台是arm-based,内核版本是3.1.10。在我们的开发过程中,我们发现在dalvik中发生应用崩溃的概率非常低。根据以下回
每个 ANR 转储都列出了 ANR 发生时所有线程的状态。我知道 WAIT 是什么意思,但是 SUSPENDED 和 MONITOR 是什么意思? 提前致谢... 最佳答案 Dalvik 线程状态总结
我是一名优秀的程序员,十分优秀!