首页 文章 精选 留言 我的

精选列表

搜索[主线化],共10020篇文章
优秀的个人博客,低调大师

谷歌计划将其 Propeller 性能优化工具合并进 LLVM 主线

近日,谷歌编译器团队公开提出希望将其开发的 Propeller 性能优化工具纳入上游 LLVM 编译器项目的主代码库。 Propeller 是一个基于配置数据的后链接优化(Post-Link Optimization, PLO)框架,用于提升大型软件项目的运行效率。它建立在 LLVM 编译基础之上,通过对函数和基本代码块的布局进行精细调整,从而减少指令缓存未命中等性能损失。 目前谷歌的 Propeller 工具还托管在单独的代码仓库中,使用时需要额外引入这个外部项目。谷歌工程师希望将名为 llvm-propeller 的工具迁移到 LLVM 的官方源码树(llvm/tools 目录),与 Clang、LLD 等其他 LLVM 工具一起发布。这样做的目的是: 简化开发者使用流程:无需依赖外部仓库就能使用 Propeller; 提升工具可用性:与 LLVM 的 Profile Guided Optimization (PGO) 基础设施整合,更加统一; 改善分布式构建支持:Propeller 的 relinking 方法相比传统的二进制重写工具(如 BOLT),在大规模和增量构建场景下更具扩展性。 谷歌的内部数据表明,在 Linux 内核等大型代码库中结合使用 AutoFDO(自动反馈驱动优化)和 Propeller,可以实现大约 5%–10% 的性能提升,这类优化提升规模相当于常见的硬件升级带来的性能提升。 此次提案如果成功,将让 LLVM 用户更容易直接利用 Propeller 带来的性能优化能力,并推动低层编译性能优化技术的普及。谷歌团队希望在 2026 年实现这一上游合并。

优秀的个人博客,低调大师

Android app主线程UI更新间歇性崩溃的问题

对App进行开发测试时,偶尔出现app崩溃的问题。日志如下: 10-25 18:44:52.935 15290-15290/com.zzq.cnblogs E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.zzq.cnblogs, PID: 15290 java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(16908298, class com.handmark.pulltorefresh.library.PullToRefreshListView$InternalListViewSDK9) with Adapter(class android.widget.HeaderViewListAdapter)] at android.widget.ListView.layoutChildren(ListView.java:1555) at android.widget.AbsListView.onLayout(AbsListView.java:2089) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4631) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2026) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1783) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1039) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5648) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:544) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.j 其中 The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. 由异常的提示可以看出,在一个后台线程更新了UI界面,而UI界面必须由UI线程进行更新。然而,Android提供了几种更新UI线程的方法。下面用Handler的方式更新UI,做个简单的修改即可。更多关于UI线程更新的方法见:http://gqdy365.iteye.com/blog/2112471 1、添加一个Handler属性 private Handler handlerListView = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle bundle = (Bundle) msg.obj; int refreshType = (int) bundle.get("refreshType"); LinkedList<Article> list = (LinkedList<Article>) bundle.get("article"); for (Article article : list){ if (REFRESH_TYPE_UP == refreshType){ listData.add(article); }else if (REFRESH_TYPE_DOWN == refreshType){ listData.add(0, article); } } pullToRefreshView.onRefreshComplete(); adapter.notifyDataSetChanged(); } }; 2、将直接更新UI内容的部分 pullToRefreshView.onRefreshComplete(); adapter.notifyDataSetChanged(); 改成 Message msg = new Message(); Bundle bundle = new Bundle(); bundle.putInt("refreshType", refreshType); bundle.putSerializable("article", addList); msg.obj = bundle; handlerListView.sendMessage(msg); 将修改的数据发给handler去处理,而不是直接操作listview的adapter。 此外还可以考虑使用activity的runOnUiThread方法进行更新。 本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/4910575.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册