放假狂魔小学生 放假狂魔小学生
TIAWTCTW,JCOM.
关注数: 96 粉丝数: 278 发帖数: 13,283 关注贴吧数: 33
【自己翻译】深入了解Android L的ART from AnandTech 之前发在通吧了,发回来供基佬们讨论 原文翻译自Anandtech:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fanandtech.com%2Fprint%2F8231%2Fa-closer-look-at-android-runtime-art-in-android-l&urlrefer=86f61f306cdb37c5479430df11cc6c81 自己翻译。如果有术语错误,请以原文为准。请谅解。 深入了解Android L的ART最近的I/O大会之后,google终于正式公开了它对Android新的运行环境的计划。Android RunTime,简称ART,用于执行Android上的Java代码的虚拟机,是取代Dalvik的继任者。我们已经在去年秋季上市的KitKat上对它稍有了解,但是对于它的术语和技术细节,Google并未言之过多。 对比其它的移动平台,比如iOS,Windows或者Tizen,它们都运行着针对特定硬件架构编译的本地代码,但绝大多数Android软件都基于通用的代码语言,将编译代码生成的ByteCode转化为设备自身的本机指令。 从最早的Android版本开始,Dalvik从一个不太复杂的虚拟机起步。但是随着时间推移,Google开始意识到让其性能跟上业界硬件脚步的重要性。Google在Android 2.2中加入了JIT编译器,加入了多线程功能,并且想逐步优化改进。 但是,在最近几年中,整个生态系统已经超过了Dalvik的发展过程,所以Google需要建立一个能够为以后打下坚实基础,能够适应今天与未来的八核处理器,大容量存储和大内存的新的虚拟机。 所以ART诞生了。 架构首先,ART的设计完全兼容Dalvik已有的字节码格dex(Dalvik executable)。所以从开发者的角度,在从Dalvik转移至ART的过程中,完全无需担心兼容性的问题并且代码无需任何改动。 ART带来最大的改变,就是用AOT(Ahead of time,运行前编译)取代了JIT(Just In Time,运行时编译)。ART将之前需要在每次应用运行时进行的编译,变成了只做一次。在之后所有的执行中,都会执行这一次编译完成的字节码。 当然,这些本地的转换使得应用程序会耗费更多存储空间,并且这个新的方案只有像现在这样Android设备的可用存储空间大幅提升了之后,才成为了可能。 这个转变使得以前很多无法实现的优化成为了可能:因为代码只被优化和编译一遍,所以将它优化到位是很重要的。Google宣称现在已经可以达到一个更高的针对整个程序代码的优化层次,而以前的JIT编译器只能进行本地方法块的优化。一般对代码检测异常的部分被大量的移除,并且方法和接口调用得到了显著的提速。新的"dex2oat"完成以上过程,取代以往Dalvik使用的"dexopt"。ART中也不需要odex文件(optimized dex,优化的dex),被ELF文件取代。 因为ART编译一个ELF可执行文件,所以内核现在可以处理代码分页——这将带来更好的内存管理与更少的内存使用。我很好奇KSM(Kernel same-page merging)会带来什么样的效果,这是绝对值得关注的。 对于电池续航,它的作用也是非常明显的——因为在应用运行时无需进行JIT的工作,直接减少了CPU的使用,降低功耗。 所有这一切带来的唯一坏处,就是一次编译需要更多时间。设备与应用的第一次启动时间,相比Dalvik都会明显变长。Google指出时间不会拉的太长,他们预期最终的正式版甚至会比Dalvik速度更快。相比Dalvik,ART的性能提升是显著的。如上图,基本上运行在虚拟机上的代码,都有了2倍的性能提升。 Google指出诸如Chessbench这样提升3倍的应用,更能代表真实情况下,Android L正式版所带来的提升。 垃圾回收(Garbage Collection, GC):理论与实践 Android的虚拟机依靠自动内存管理的模式,它作为Java编程范式的基础从一开始,就是Android的一部分。对自动内存管理这个概念不甚熟悉的人来说,一个比较通俗的解释就是,一个程序员既不手动申请物理内存,也不手动释放它。它不同于以手动管理内存为常态的底层编程。当然,自动管理的好处就是开发者无须担心内存管理问题,坏处就是开发者无法控制,无法自己进行优化。 Android与Dalvik深受Dalvik的GC方案之苦。每次当某一程序需要分配内存并且堆(heap, 一块应用专属的内存空间)无法分配的时候,GC将会启动。 GC的工作是仔细检查堆,枚举所有应用分配的对象,逐一标记仍在使用的对象,并且释放掉剩余的未标记对象。 在Dalvik中,这导致以下两种暂停——一种因枚举过程产生,另一种因标记产生。在这里,暂停指的是为了保证应用的完整性,该应用所有线程所有的代码执行都会停止。如果暂停过长,这将导致在渲染的过程中掉帧,这就是Android卡顿的来源。 Google宣称在Nexus 5上,这样的暂停平均耗时54ms,这导致了每次GC启动时,都会带来至少4帧的掉帧。 在我自己的体验与调查中,这个数字因具体程序不同而差异巨大。比如,官方的FIFA app就是一个十分鲜明的例子,GC进行的十分狂野如下: 07-01 15:56:14.275: D/dalvikvm(30615): GC_FOR_ALLOC freed 4442K, 25% free 20183K/26856K, paused 24ms, total 24ms 07-01 15:56:16.785: I/dalvikvm-heap(30615): Grow heap (frag case) to 38.179MB for 8294416-byte allocation 07-01 15:56:17.225: I/dalvikvm-heap(30615): Grow heap (frag case) to 48.279MB for 7361296-byte allocation 07-01 15:56:17.625: I/Choreographer(30615): Skipped 35 frames! The application may be doing too much work on its main thread. 07-01 15:56:19.035: D/dalvikvm(30615): GC_CONCURRENT freed 35838K, 43% free 51351K/89052K, paused 3ms+5ms, total 106ms 07-01 15:56:19.035: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 96ms 07-01 15:56:19.815: D/dalvikvm(30615): GC_CONCURRENT freed 7078K, 42% free 52464K/89052K, paused 14ms+4ms, total 96ms 07-01 15:56:19.815: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 74ms 07-01 15:56:20.035: I/Choreographer(30615): Skipped 141 frames! The application may be doing too much work on its main thread. 07-01 15:56:20.275: D/dalvikvm(30615): GC_FOR_ALLOC freed 4774K, 45% free 49801K/89052K, paused 168ms, total 168ms 07-01 15:56:20.295: I/dalvikvm-heap(30615): Grow heap (frag case) to 56.900MB for 4665616-byte allocation 07-01 15:56:21.315: D/dalvikvm(30615): GC_FOR_ALLOC freed 1359K, 42% free 55045K/93612K, paused 95ms, total 95ms 07-01 15:56:21.965: D/dalvikvm(30615): GC_CONCURRENT freed 6376K, 40% free 56861K/93612K, paused 16ms+8ms, total 126ms 07-01 15:56:21.965: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 111ms 07-01 15:56:21.965: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 97ms 07-01 15:56:22.085: I/Choreographer(30615): Skipped 38 frames! The application may be doing too much work on its main thread. 07-01 15:56:22.195: D/dalvikvm(30615): GC_FOR_ALLOC freed 1539K, 40% free 56833K/93612K, paused 87ms, total 87ms 07-01 15:56:22.195: I/dalvikvm-heap(30615): Grow heap (frag case) to 60.588MB for 1331732-byte allocation 07-01 15:56:22.475: D/dalvikvm(30615): GC_FOR_ALLOC freed 308K, 39% free 59497K/96216K, paused 84ms, total 84ms 07-01 15:56:22.815: D/dalvikvm(30615): GC_FOR_ALLOC freed 287K, 38% free 60878K/97516K, paused 95ms, total 95ms 以上是这个程序运行之后几秒内的日志。垃圾回收器一共被唤醒9次,导致程序冻结603ms,总共掉帧214帧。内存分配的请求导致的暂停,在Log中都以“GC_FOR_ALLOC”标记。 而ART承诺的垃圾回收性能的提升是极其巨大的。以下是ART在执行前面同样任务的对比: 07-01 16:00:44.531: I/art(198): Explicit concurrent mark sweep GC freed 700(30KB) AllocSpace objects, 0(0B) LOS objects, 792% free, 18MB/21MB, paused 186us total 12.763ms 07-01 16:00:44.545: I/art(198): Explicit concurrent mark sweep GC freed 7(240B) AllocSpace objects, 0(0B) LOS objects, 792% free, 18MB/21MB, paused 198us total 9.465ms 07-01 16:00:44.554: I/art(198): Explicit concurrent mark sweep GC freed 5(160B) AllocSpace objects, 0(0B) LOS objects, 792% free, 18MB/21MB, paused 224us total 9.045ms 07-01 16:00:44.690: I/art(801): Explicit concurrent mark sweep GC freed 65595(3MB) AllocSpace objects, 9(4MB) LOS objects, 810% free, 38MB/58MB, paused 1.195ms total 87.219ms 07-01 16:00:46.517: I/art(29197): Background partial concurrent mark sweep GC freed 74626(3MB) AllocSpace objects, 39(4MB) LOS objects, 1496% free, 25MB/32MB, paused 4.422ms total 1.371747s 07-01 16:00:48.534: I/Choreographer(29197): Skipped 30 frames! The application may be doing too much work on its main thread. 07-01 16:00:48.566: I/art(29197): Background sticky concurrent mark sweep GC freed 70319(3MB) AllocSpace objects, 59(5MB) LOS objects, 825% free, 49MB/56MB, paused 6.139ms total 52.868ms 07-01 16:00:49.282: I/Choreographer(29197): Skipped 33 frames! The application may be doing too much work on its main thread. 07-01 16:00:49.652: I/art(1287): Heap transition to ProcessStateJankImperceptible took 45.636146ms saved at least 723KB 07-01 16:00:49.660: I/art(1256): Heap transition to ProcessStateJankImperceptible took 52.650677ms saved at least 966KB ART与Dalvik的差别不能再大——ART在同样的情况下,停顿了12.364ms,前台调用4次GC,后台调用2次。在应用运行的全程中,内存的占用也并无增长,而在Dalvik中,内存的占用增加了4次。掉帧也减少到了63帧。 显然这是一个对于一个烂应用能发生的最坏的场景,在ART的情况下,程序依然会有些许的掉帧,但是坏的编程习惯——比如重载UI线程是Android更需要面对的问题。 ART减轻了以前垃圾回收器的很多负担,使执行过程中的暂停不再必要,第二类暂停也通过在暂停之前尽可能完成工作而极大减少——一种被叫做Packard预清除的技术得以应用,而暂停本身在一个简单的检查与校验的过程中完成。Google宣称他们做到了将暂停时间减小到了3ms,是相对Dalvik GC的极大提升。同时,不同于堆的“大对象空间”,Large Object Space,简称LOS,被引入,它依旧在应用程序内存中,它被用于更好的处理大的对象,比如图片。这些大的简单的对象如果使堆变得碎片化,将产生很严重的问题,导致在回收对象时更多的GC调用。在更加智能的内存分配方案下,GC调用频率大幅减少,同时内存的碎片化程度也有显著的降低。 另一个比较好的例子是Hangout的app,在Dalvik中,我们看到这样几次GC调用导致的暂停: 07-01 06:37:13.481: D/dalvikvm(7403): GC_EXPLICIT freed 2315K, 46% free 18483K/34016K, paused 3ms+4ms, total 40ms 07-01 06:37:13.901: D/dalvikvm(9871): GC_CONCURRENT freed 3779K, 22% free 21193K/26856K, paused 3ms+3ms, total 36ms 07-01 06:37:14.041: D/dalvikvm(9871): GC_FOR_ALLOC freed 368K, 21% free 21451K/26856K, paused 25ms, total 25ms 07-01 06:37:14.041: I/dalvikvm-heap(9871): Grow heap (frag case) to 24.907MB for 147472-byte allocation 07-01 06:37:14.071: D/dalvikvm(9871): GC_FOR_ALLOC freed 4K, 20% free 22167K/27596K, paused 25ms, total 25ms 07-01 06:37:14.111: D/dalvikvm(9871): GC_FOR_ALLOC freed 9K, 19% free 23892K/29372K, paused 27ms, total 28ms 我们可以看到所有GC调用的示例,明确的和并发的GC调用是GC通用的清理与维护的调用。for_alloc的调用是内存分配器试图分配内存但是发现并不匹配,于是GC启动以获得更多空间。在中间,我们看到了堆因为碎片化尺寸增加,而且不能装入大对象。总的暂停时间一共90ms。作为对比,以下是Android L预览版中的情况: 07-01 06:35:19.718: I/art(10844): Heap transition to ProcessStateJankPerceptible took 17.989063ms saved at least -138KB 07-01 06:35:24.171: I/art(1256): Heap transition to ProcessStateJankImperceptible took 42.936250ms saved at least 258KB 07-01 06:35:24.806: I/art(801): Explicit concurrent mark sweep GC freed 85790(3MB) AllocSpace objects, 4(10MB) LOS objects, 850% free, 35MB/56MB, paused 961us total 83.110ms 我们不是特别确定这样的记录代表什么,但是我们认为它们是重新为堆指定尺寸的过程。唯一的一次GC调用是在应用完成启动之后,耗时961us。我们没在这次GC之前看到任何类似的调用。比较有趣的事LOS的统计。我们看到LOS中有4个10MB的大对象,以前它们都会被分配在程序的堆中,但现在它们在分配的时候被忽略了,这成功的避免了GC的重复调用与可能拖慢Dalvik速度的碎片化内存。 内存分配系统自身也有提升。当ART自身提供相对Dalvik的25%速度提升时,Google并不是特别满意,并且引入了Linux内核中一个新的内存分配器,替换了当前使用的malloc分配器。 新的分配器叫rosalloc,全称是Rows of slots Allocator,为多线程Java应用程序设计。新的分配器有一个更加细粒度的结构,可以锁定独立的对象。在线程本地区域中的小对象也可以被一起锁定。 这使得分配速度的提升也极其巨大,多达10倍。 垃圾回收算法自身也被修订,用于提升用户体验与避免程序的中断。这些算法尚未完工,而Google最近只是发布了一个新的专用的算法,Moving Garbage collector,主要目的是整理后台程序堆的碎片。 64位支持 ART基于模块化的设计,面向不同的目标架构。因此,它面向目前最常见的架构提供了编译器后端,比如ARM,X86和MIPS,以及ARM64,x86-64和仍未实现的MIPS64。 当我们在iPhone5s的评测中讨论切换至64bit的优劣时,我们已经讨论得很深入了,主要的好处是在完全兼容已有32bit应用的同时,提升了可用的地址空间,提升了性能,以及极大提升的加密解密性能。 Google与Apple的一个很大的区别,至少是在虚拟机应用上,是Google使用了引用压缩避免通常64bit导致的内存膨胀,虚拟机依旧使用了32bit的引用。Google展示了部分跑分以对比ARM和x86切换至64bit的性能。x86的跑分在Intel的Bay Trail上执行,在不同的RenderScript跑分上展示了2-4.5倍的性能。在ARM这边,相比32bit提升的加密性能由A57/A53系统来展示。它们都不代表真实的使用情况,所以作为性能的预测并无意义。 然而Google也拿出了一些比较有趣的数字。Google内建的Panorama,我们可以看到32bit到64bit有着13-19%的性能提升。我们也可以看到,在64bit下,Cortex-A53的提升更为显著。 Google声称当前Play商店中85%的应用已经准备好立即切换至64bit——这意味着只有15%的应用含有部分本地代码需要开发者进行对64bit架构针对性的编译,在以往切换至64bit的过程中,Google也算是很成功的。 结语 从很多方面来说,Google已经给出了性能的巨大提升,并且解决了很多阻碍Android发展的短板。 ART补足了很多在运行非本地应用与内存管理过程中的缺陷。作为一名开发者,我无法要求更多。以前我必须通过机智的算法与特别的编程技巧解决的诸多性能问题,现在都不再是一个硬伤了。 这也意味着Android终于可以在应用程序的流畅性与性能上,与iOS有所一拼了。这是消费者的大胜利。 Google保证未来依旧会不断改进ART,而且现在的它已经与6个月前刚发布时有了很大的区别。而6个月之后Android L最终上市的时候,它也一定不会与现在完全一致。未来很光明,我已经等不及要看看Google还会拿ART做些什么了。
【自翻】深入了解Android L的ART from AnandTech 原文翻译自Anandtech:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fanandtech.com%2Fprint%2F8231%2Fa-closer-look-at-android-runtime-art-in-android-l&urlrefer=86f61f306cdb37c5479430df11cc6c81 自己翻译。如果有术语错误,请以原文为准。请谅解。 深入了解Android L的ART最近的I/O大会之后,google终于正式公开了它对Android新的运行环境的计划。Android RunTime,简称ART,用于执行Android上的Java代码的虚拟机,是取代Dalvik的继任者。我们已经在去年秋季上市的KitKat上对它稍有了解,但是对于它的术语和技术细节,Google并未言之过多。 对比其它的移动平台,比如iOS,Windows或者Tizen,它们都运行着针对特定硬件架构编译的本地代码,但绝大多数Android软件都基于通用的代码语言,将编译代码生成的ByteCode转化为设备自身的本机指令。 从最早的Android版本开始,Dalvik从一个不太复杂的虚拟机起步。但是随着时间推移,Google开始意识到让其性能跟上业界硬件脚步的重要性。Google在Android 2.2中加入了JIT编译器,加入了多线程功能,并且想逐步优化改进。 但是,在最近几年中,整个生态系统已经超过了Dalvik的发展过程,所以Google需要建立一个能够为以后打下坚实基础,能够适应今天与未来的八核处理器,大容量存储和大内存的新的虚拟机。 所以ART诞生了。 架构首先,ART的设计完全兼容Dalvik已有的字节码格dex(Dalvik executable)。所以从开发者的角度,在从Dalvik转移至ART的过程中,完全无需担心兼容性的问题并且代码无需任何改动。 ART带来最大的改变,就是用AOT(Ahead of time,运行前编译)取代了JIT(Just In Time,运行时编译)。ART将之前需要在每次应用运行时进行的编译,变成了只做一次。在之后所有的执行中,都会执行这一次编译完成的字节码。 当然,这些本地的转换使得应用程序会耗费更多存储空间,并且这个新的方案只有像现在这样Android设备的可用存储空间大幅提升了之后,才成为了可能。 这个转变使得以前很多无法实现的优化成为了可能:因为代码只被优化和编译一遍,所以将它优化到位是很重要的。Google宣称现在已经可以达到一个更高的针对整个程序代码的优化层次,而以前的JIT编译器只能进行本地方法块的优化。一般对代码检测异常的部分被大量的移除,并且方法和接口调用得到了显著的提速。新的"dex2oat"完成以上过程,取代以往Dalvik使用的"dexopt"。ART中也不需要odex文件(optimized dex,优化的dex),被ELF文件取代。 因为ART编译一个ELF可执行文件,所以内核现在可以处理代码分页——这将带来更好的内存管理与更少的内存使用。我很好奇KSM(Kernel same-page merging)会带来什么样的效果,这是绝对值得关注的。 对于电池续航,它的作用也是非常明显的——因为在应用运行时无需进行JIT的工作,直接减少了CPU的使用,降低功耗。 所有这一切带来的唯一坏处,就是一次编译需要更多时间。设备与应用的第一次启动时间,相比Dalvik都会明显变长。Google指出时间不会拉的太长,他们预期最终的正式版甚至会比Dalvik速度更快。相比Dalvik,ART的性能提升是显著的。如上图,基本上运行在虚拟机上的代码,都有了2倍的性能提升。 Google指出诸如Chessbench这样提升3倍的应用,更能代表真实情况下,Android L正式版所带来的提升。 垃圾回收(Garbage Collection, GC):理论与实践 Android的虚拟机依靠自动内存管理的模式,它作为Java编程范式的基础从一开始,就是Android的一部分。对自动内存管理这个概念不甚熟悉的人来说,一个比较通俗的解释就是,一个程序员既不手动申请物理内存,也不手动释放它。它不同于以手动管理内存为常态的底层编程。当然,自动管理的好处就是开发者无须担心内存管理问题,坏处就是开发者无法控制,无法自己进行优化。 Android与Dalvik深受Dalvik的GC方案之苦。每次当某一程序需要分配内存并且堆(heap, 一块应用专属的内存空间)无法分配的时候,GC将会启动。 GC的工作是仔细检查堆,枚举所有应用分配的对象,逐一标记仍在使用的对象,并且释放掉剩余的未标记对象。 在Dalvik中,这导致以下两种暂停——一种因枚举过程产生,另一种因标记产生。在这里,暂停指的是为了保证应用的完整性,该应用所有线程所有的代码执行都会停止。如果暂停过长,这将导致在渲染的过程中掉帧,这就是Android卡顿的来源。 Google宣称在Nexus 5上,这样的暂停平均耗时54ms,这导致了每次GC启动时,都会带来至少4帧的掉帧。 在我自己的体验与调查中,这个数字因具体程序不同而差异巨大。比如,官方的FIFA app就是一个十分鲜明的例子,GC进行的十分狂野如下: 07-01 15:56:14.275: D/dalvikvm(30615): GC_FOR_ALLOC freed 4442K, 25% free 20183K/26856K, paused 24ms, total 24ms 07-01 15:56:16.785: I/dalvikvm-heap(30615): Grow heap (frag case) to 38.179MB for 8294416-byte allocation 07-01 15:56:17.225: I/dalvikvm-heap(30615): Grow heap (frag case) to 48.279MB for 7361296-byte allocation 07-01 15:56:17.625: I/Choreographer(30615): Skipped 35 frames! The application may be doing too much work on its main thread. 07-01 15:56:19.035: D/dalvikvm(30615): GC_CONCURRENT freed 35838K, 43% free 51351K/89052K, paused 3ms+5ms, total 106ms 07-01 15:56:19.035: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 96ms 07-01 15:56:19.815: D/dalvikvm(30615): GC_CONCURRENT freed 7078K, 42% free 52464K/89052K, paused 14ms+4ms, total 96ms 07-01 15:56:19.815: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 74ms 07-01 15:56:20.035: I/Choreographer(30615): Skipped 141 frames! The application may be doing too much work on its main thread. 07-01 15:56:20.275: D/dalvikvm(30615): GC_FOR_ALLOC freed 4774K, 45% free 49801K/89052K, paused 168ms, total 168ms 07-01 15:56:20.295: I/dalvikvm-heap(30615): Grow heap (frag case) to 56.900MB for 4665616-byte allocation 07-01 15:56:21.315: D/dalvikvm(30615): GC_FOR_ALLOC freed 1359K, 42% free 55045K/93612K, paused 95ms, total 95ms 07-01 15:56:21.965: D/dalvikvm(30615): GC_CONCURRENT freed 6376K, 40% free 56861K/93612K, paused 16ms+8ms, total 126ms 07-01 15:56:21.965: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 111ms 07-01 15:56:21.965: D/dalvikvm(30615): WAIT_FOR_CONCURRENT_GC blocked 97ms 07-01 15:56:22.085: I/Choreographer(30615): Skipped 38 frames! The application may be doing too much work on its main thread. 07-01 15:56:22.195: D/dalvikvm(30615): GC_FOR_ALLOC freed 1539K, 40% free 56833K/93612K, paused 87ms, total 87ms 07-01 15:56:22.195: I/dalvikvm-heap(30615): Grow heap (frag case) to 60.588MB for 1331732-byte allocation 07-01 15:56:22.475: D/dalvikvm(30615): GC_FOR_ALLOC freed 308K, 39% free 59497K/96216K, paused 84ms, total 84ms 07-01 15:56:22.815: D/dalvikvm(30615): GC_FOR_ALLOC freed 287K, 38% free 60878K/97516K, paused 95ms, total 95ms 以上是这个程序运行之后几秒内的日志。垃圾回收器一共被唤醒9次,导致程序冻结603ms,总共掉帧214帧。内存分配的请求导致的暂停,在Log中都以“GC_FOR_ALLOC”标记。 而ART承诺的垃圾回收性能的提升是极其巨大的。以下是ART在执行前面同样任务的对比: 07-01 16:00:44.531: I/art(198): Explicit concurrent mark sweep GC freed 700(30KB) AllocSpace objects, 0(0B) LOS objects, 792% free, 18MB/21MB, paused 186us total 12.763ms 07-01 16:00:44.545: I/art(198): Explicit concurrent mark sweep GC freed 7(240B) AllocSpace objects, 0(0B) LOS objects, 792% free, 18MB/21MB, paused 198us total 9.465ms 07-01 16:00:44.554: I/art(198): Explicit concurrent mark sweep GC freed 5(160B) AllocSpace objects, 0(0B) LOS objects, 792% free, 18MB/21MB, paused 224us total 9.045ms 07-01 16:00:44.690: I/art(801): Explicit concurrent mark sweep GC freed 65595(3MB) AllocSpace objects, 9(4MB) LOS objects, 810% free, 38MB/58MB, paused 1.195ms total 87.219ms 07-01 16:00:46.517: I/art(29197): Background partial concurrent mark sweep GC freed 74626(3MB) AllocSpace objects, 39(4MB) LOS objects, 1496% free, 25MB/32MB, paused 4.422ms total 1.371747s 07-01 16:00:48.534: I/Choreographer(29197): Skipped 30 frames! The application may be doing too much work on its main thread. 07-01 16:00:48.566: I/art(29197): Background sticky concurrent mark sweep GC freed 70319(3MB) AllocSpace objects, 59(5MB) LOS objects, 825% free, 49MB/56MB, paused 6.139ms total 52.868ms 07-01 16:00:49.282: I/Choreographer(29197): Skipped 33 frames! The application may be doing too much work on its main thread. 07-01 16:00:49.652: I/art(1287): Heap transition to ProcessStateJankImperceptible took 45.636146ms saved at least 723KB 07-01 16:00:49.660: I/art(1256): Heap transition to ProcessStateJankImperceptible took 52.650677ms saved at least 966KB ART与Dalvik的差别不能再大——ART在同样的情况下,停顿了12.364ms,前台调用4次GC,后台调用2次。在应用运行的全程中,内存的占用也并无增长,而在Dalvik中,内存的占用增加了4次。掉帧也减少到了63帧。 显然这是一个对于一个烂应用能发生的最坏的场景,在ART的情况下,程序依然会有些许的掉帧,但是坏的编程习惯——比如重载UI线程是Android更需要面对的问题。 ART减轻了以前垃圾回收器的很多负担,使执行过程中的暂停不再必要,第二类暂停也通过在暂停之前尽可能完成工作而极大减少——一种被叫做Packard预清除的技术得以应用,而暂停本身在一个简单的检查与校验的过程中完成。Google宣称他们做到了将暂停时间减小到了3ms,是相对Dalvik GC的极大提升。同时,不同于堆的“大对象空间”,Large Object Space,简称LOS,被引入,它依旧在应用程序内存中,它被用于更好的处理大的对象,比如图片。这些大的简单的对象如果使堆变得碎片化,将产生很严重的问题,导致在回收对象时更多的GC调用。在更加智能的内存分配方案下,GC调用频率大幅减少,同时内存的碎片化程度也有显著的降低。 另一个比较好的例子是Hangout的app,在Dalvik中,我们看到这样几次GC调用导致的暂停: 07-01 06:37:13.481: D/dalvikvm(7403): GC_EXPLICIT freed 2315K, 46% free 18483K/34016K, paused 3ms+4ms, total 40ms 07-01 06:37:13.901: D/dalvikvm(9871): GC_CONCURRENT freed 3779K, 22% free 21193K/26856K, paused 3ms+3ms, total 36ms 07-01 06:37:14.041: D/dalvikvm(9871): GC_FOR_ALLOC freed 368K, 21% free 21451K/26856K, paused 25ms, total 25ms 07-01 06:37:14.041: I/dalvikvm-heap(9871): Grow heap (frag case) to 24.907MB for 147472-byte allocation 07-01 06:37:14.071: D/dalvikvm(9871): GC_FOR_ALLOC freed 4K, 20% free 22167K/27596K, paused 25ms, total 25ms 07-01 06:37:14.111: D/dalvikvm(9871): GC_FOR_ALLOC freed 9K, 19% free 23892K/29372K, paused 27ms, total 28ms 我们可以看到所有GC调用的示例,明确的和并发的GC调用是GC通用的清理与维护的调用。for_alloc的调用是内存分配器试图分配内存但是发现并不匹配,于是GC启动以获得更多空间。在中间,我们看到了堆因为碎片化尺寸增加,而且不能装入大对象。总的暂停时间一共90ms。作为对比,以下是Android L预览版中的情况: 07-01 06:35:19.718: I/art(10844): Heap transition to ProcessStateJankPerceptible took 17.989063ms saved at least -138KB 07-01 06:35:24.171: I/art(1256): Heap transition to ProcessStateJankImperceptible took 42.936250ms saved at least 258KB 07-01 06:35:24.806: I/art(801): Explicit concurrent mark sweep GC freed 85790(3MB) AllocSpace objects, 4(10MB) LOS objects, 850% free, 35MB/56MB, paused 961us total 83.110ms 我们不是特别确定这样的记录代表什么,但是我们认为它们是重新为堆指定尺寸的过程。唯一的一次GC调用是在应用完成启动之后,耗时961us。我们没在这次GC之前看到任何类似的调用。比较有趣的事LOS的统计。我们看到LOS中有4个10MB的大对象,以前它们都会被分配在程序的堆中,但现在它们在分配的时候被忽略了,这成功的避免了GC的重复调用与可能拖慢Dalvik速度的碎片化内存。 内存分配系统自身也有提升。当ART自身提供相对Dalvik的25%速度提升时,Google并不是特别满意,并且引入了Linux内核中一个新的内存分配器,替换了当前使用的malloc分配器。 新的分配器叫rosalloc,全称是Rows of slots Allocator,为多线程Java应用程序设计。新的分配器有一个更加细粒度的结构,可以锁定独立的对象。在线程本地区域中的小对象也可以被一起锁定。 这使得分配速度的提升也极其巨大,多达10倍。 垃圾回收算法自身也被修订,用于提升用户体验与避免程序的中断。这些算法尚未完工,而Google最近只是发布了一个新的专用的算法,Moving Garbage collector,主要目的是整理后台程序堆的碎片。 64位支持 ART基于模块化的设计,面向不同的目标架构。因此,它面向目前最常见的架构提供了编译器后端,比如ARM,X86和MIPS,以及ARM64,x86-64和仍未实现的MIPS64。 当我们在iPhone5s的评测中讨论切换至64bit的优劣时,我们已经讨论得很深入了,主要的好处是在完全兼容已有32bit应用的同时,提升了可用的地址空间,提升了性能,以及极大提升的加密解密性能。 Google与Apple的一个很大的区别,至少是在虚拟机应用上,是Google使用了引用压缩避免通常64bit导致的内存膨胀,虚拟机依旧使用了32bit的引用。Google展示了部分跑分以对比ARM和x86切换至64bit的性能。x86的跑分在Intel的Bay Trail上执行,在不同的RenderScript跑分上展示了2-4.5倍的性能。在ARM这边,相比32bit提升的加密性能由A57/A53系统来展示。它们都不代表真实的使用情况,所以作为性能的预测并无意义。 然而Google也拿出了一些比较有趣的数字。Google内建的Panorama,我们可以看到32bit到64bit有着13-19%的性能提升。我们也可以看到,在64bit下,Cortex-A53的提升更为显著。 Google声称当前Play商店中85%的应用已经准备好立即切换至64bit——这意味着只有15%的应用含有部分本地代码需要开发者进行对64bit架构针对性的编译,在以往切换至64bit的过程中,Google也算是很成功的。 结语 从很多方面来说,Google已经给出了性能的巨大提升,并且解决了很多阻碍Android发展的短板。 ART补足了很多在运行非本地应用与内存管理过程中的缺陷。作为一名开发者,我无法要求更多。以前我必须通过机智的算法与特别的编程技巧解决的诸多性能问题,现在都不再是一个硬伤了。 这也意味着Android终于可以在应用程序的流畅性与性能上,与iOS有所一拼了。这是消费者的大胜利。 Google保证未来依旧会不断改进ART,而且现在的它已经与6个月前刚发布时有了很大的区别。而6个月之后Android L最终上市的时候,它也一定不会与现在完全一致。未来很光明,我已经等不及要看看Google还会拿ART做些什么了。
其实吧 知乎举报不成功的 多半是因为0回复0关注 比如我 举报个评论人家管理员回复的就很快,你看,说是【不友善内容】人家2h就帮我删了 我虽然也有砖栏 但是想一想还是槽点太多写不出什么内容反驳 就算吧里集思广益写出来一份 贴出来。。。我的砖栏也没人关注一篇文挂了4个月至今点击率为0想必贴到我专栏里也只能把那哥们拉过来打嘴炮然后拉黑,也形不成更大影响力就先把那逗比晾那吧。 同时一点题外话说一下,不会太长: 互联网上本来没有什么高低贵贱之分,用整体的印象去代个别的情况,这就是耍流氓。没错。无论是[知乎用户=装逼]还是[贴吧用户=脑残水军]这两种印象都是耍流氓。说到最后就是看谁的嘴炮更响骂的字更脏而已。 这样的讨论没意义。 去翻一下 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fzhi.hu%2F3YAA&urlrefer=088f066cb3d46c716272c70e3f3234c7 下面的评论串,@78基佬 们都很有礼貌,至少大家都是就事论事讨论的。而那个逗比的回复,一句不和就妊娠攻击 确实咱们说到底不在意别人拉不拉黑咱们,不过因为大环境复杂了,现在利shui益jun相关方越来越多,基佬们在别的地方摆事实讲道理也难免被喷。就事论事讨论可以,妊娠攻击就只能激化矛盾了。 写到这我忘了我发这贴想说啥了写个78基佬防被扣帽子注意事项吧。 1 时间线上别空。我知道大家都是在贴吧水逼不怎么上逼乎,不过平时就点几个赞 关注几个问题还是不费劲的,找几个冷门问题关注下,不至于总是收到通知多了一堆回答还没几个有干货的挺烦。 2 关注几个用户个话题。这个就不说了。逼乎用户对0关注的用户都挺敏感的,基本上都是直接扣水军帽子了,挺神经质的,基佬们别太在意实在嫌逼格太高自己无法接近的话,咱们78基佬可以自己抱团啊,你看一片烂文炸出多少78基佬? 3 有理有节。人家说贴吧脑残水军五毛,别骂,咱们如果有理有节不脑残摆事实讲道理就是对他们最大的打脸。毕竟78也是摆事实讲道理文明理性讨论的地方。【谁跟我说78有嘴炮?在78打嘴炮的通通要吸进淋比才行!】 4 妊娠攻击的言论 举报到底。就像我这张图一样。 我不会吐槽那个逗比。因为大家都吐过了我都找不到槽点了。 以上。手机打的有点乱,见谅。
【自己翻译】Anandtech关于IMG的下一代光线追踪GPU架构:Wizard 首先说明,以下都是楼主的无责任翻译,我无法保证文中任何术语翻译的绝对准确,同时,本文不代表译者观点。 为了方便对照,贴完中文后我会贴原文,图我就只贴一遍了。如有异议,请以英文原文为准。 anandtech关于PowerVR 6XT Rogue的介绍与本文有关,地址是:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.anandtech.com%2Fshow%2F7793%2Fimaginations-powervr-rogue-architecture-exposed&urlrefer=84a00c2e0700922cac2c4a87407a69bd 原文废话很多,大家凑合着看。 在这周旧金山召开的2014Game Developer Conference(游戏开发者大会)中,尽管这不是一个硬件的展会,但是我们仍然在桌面与移动领域见到了不少与游戏有关的硬件。移动领域今年看起来也会相当繁忙。 Khronos在这周一(已经是半个月以前的事了)的展览中已经发布了OpenGLES 3.1,随后也有一大波发布会紧随其后。 也许其中最具开创性的就是IMG的发布会了。IMG在2014年的GDC中,发布了他们最新的GPU架构,Wizard。这是个前所未有的新GPU架构。【以上基本都是废话】首先,我们要知道,Wizard是什么? 简短地说,Wizard是IMG一直迫切想要推出的支持光线追踪的消费级GPU架构。 对于GPU,光线追踪并不陌生——它一直可以通过Shader不那么高效地实现,但是有了Wizard,IMG决定迈出更大的步伐。为此,IMG从2010年就已经开始发力,包括建立了OpenRLAPI(其中的R=ray,光线)和发布了独立的光线追踪卡。现在,他们已经准备好迈出下一步,向他们的消费级GPU架构中加入独立的光线追踪单元。 这些的结果就是Wizard GPU架构。基本上,Wizard可以理解为IMG已经发布了的PowerVR 6XT系列Rogue架构的一个扩展,以Rogue为基础,在这之上增加额外的光线追踪单元。这样做出来的GPU,在不损失传统像素渲染性能的前提下,还具有了光线追踪的能力。【这段也基本上都是废话】
作为能用党,深夜来讨论下能用党的续航标准 以下为楼主半夜脑洞大开之作,如有雷同请勿对号入座 说到手机的续航,基佬们是有人欢喜有人剁手,楼主作为一个相机瞅个亮,音质听个响,系统能有个反应就可以了的能用党,跟基佬们娱乐下,说说关于续航的底♂线吧。 视频,如果我在看b站新番,好歹得撑过1集吧?总不能我看个鱿鱼干没等到ed出来就没电吧?总不能我发个弹幕字还没打完就没电吧? 所以,在满电的状态下,以能瞅见的亮度看完一集24分钟左右的新番,这就是我对视频的续航底线,看完了没电没关系,充满电了还能看下一集,但是没看完一集,就自动关机了,这个让人接受不能。 再说说上网。基佬们上个网,无论是刷个空间还是上个贴吧还是发个微博朋友圈,或者是高端大气一点的吧友说了,我也逛个知乎啦,上个qoura什么的,你总得能看完你的那些动态吧? 有的基佬好友挺多,看完要费点时间的,没关系。刷贴吧总不能我还没打完挽尊就自动关机了吧?刷个网页总不能在我还看着进度条往前走呢就没电了吧?我上空间看个图总不能图没出来手机先跪了吧? 所以,这就是我对上网的续航的底线:网页,能有时间看完,在看完网页后没电,谁管你?充就是了。看贴吧,至少能给我点回帖的时间,刷微博,至少能给我把图加载出来,这就足够了。 有的基佬说了,我要聊QQ啊,那么快没电,怎么办啊?那我就要说了,说话的时候,不要扯那些有的没的,捡重点说!没用的话不说不就可以了?这样一来,时间长了,大家都会觉得你是个稳重而谨慎的人,慢慢都会高看你的。 还有的基佬说了,我跟人是打电话啊,怎么办啊?万一续航不给力咋整? 这我就得说你了电话也是交流,你得学会把话说的言简意赅,比如我给你举个例子: 我给人打电话:“喂,我电话快没电了,咱们见面再说。” 你看,这就言简意赅,既保证了不耽误正事,又用电话把该说的说到了,多好? 不过这是有前提的,就是电话的电量,得能撑到让你把“我没电了”这句话说完。 所以,这就是我对手机通话续航的底线。超过这个底线的手机,能用? 好,上面说完了基佬们最常用的三块功能,也就是视频上网和通话。 什么?你说游戏?好好好我们继续。 在讨论游戏之前,请别忘了我们是能用党。是连flappybird这种游戏卡了都能忍的能用党。咱们得先把这个话说开。 好,作为一个能用党,你的电池能撑到玩过50根管,这个游戏基本上就能玩了。其实50根管有点多了,那就1根管吧。别嫌少,万一你看着那个缺口就要飞过去结果没电了,请想象下那个时候你得有多想砸手机吧。所以玩游戏的底线,就是玩像素鸟至少能撑到过第一根管吧。 很好,我们现在基本上已经提到了手机使用的时候的方方面面。至于待机什么的,无所谓啦,反正晚上睡觉都能插电,也不会有手机没电了闹钟没叫起来的情况发生,所以这个其实对于能用党来说都是可以接受的啦。 以上基本说完了能用党对续航的一些标准。基佬们如有雷同可不要对号入座哦
GS5拿到工信部认证,看看工信部拟物画风下真实的GS5 今天,我们在工信部发现上述四款设备全部拿到了入网许可,因此我们才能确认SM-G9098并不是移动定制版的Galaxy S5。而三大运营商定制版的Galaxy S5在细节方面也和我们此前猜测的有一定出入。 具体配置方面,三大定制版均采用了骁龙801四核2.5GHz处理器,搭载5.1英寸1080p分辨率Super AMOLED显示屏,内置2GB内存和16GB机身存储空间,最大支持64GB micro SD卡扩展,提供一颗1600万像素后置摄像头和一颗200万像素前置摄像头,运行Android 4.4.2操作系统。 具体网络支持方面,电信版SM-G9009D支持cdma2000/CDMA 1X/GSM双卡双待双通,在国际及港澳台漫游时候则能够支持WCDMA网络。 移动版SM-G9008V支持TD-LTE/TD-SCDMA/GSM网络制式,在国际漫游以及港澳台漫游时候则能够支持LTE FDD/WCDMA网络。 联通版SM-G9006V支持TD-LTE/WCDMA/GSM制式,国际漫游以及港澳台漫游时候支持LTE FDD网络。 另外需要注意的是仅电信版支持双卡双待,移动/联通版均不支持双卡双待功能(至少工信部是这么说的),想要联通双卡版的朋友们这次估计要失望了。但移动五模版绝对可以说是神器,期待未来有大神能将其网络锁成功破解。 另外从外观上来看,联通版是最干净的,没有任何运营商标志,而移动版和电信版后壳上均有运营商Logo。 首先是移动版个联通版
1 下一页