代码优化

编译到底做了什么(***.c -> ***.o的过程)

戏子无情 提交于 2020-01-05 00:45:00
(第一次写博客,好激动的说.......) 我们知道,一个程序由源代码到可执行文件往往由这几步构成: 预处理(Prepressing)-> 编译(Compilation)-> 汇编(Assembly)-> 链接(Linking)。 编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分。那么,这个核心部分究竟做了什么呢。 各位看官容我挽起袖子,且听我娓娓道来。 编译器做了什么? 从最直观的角度来说,编译器就是将高级语言翻译成机器语言的一个工具。 以 C语言为例,解释一下 ***.c -> ***.o 的过程。 假设test.c有下面一段代码 array[index] = (index + 4) * (2 + 6); 下面就来谈谈这个表达式是如何翻译成机器语言的过程。 这个过程主要有如下五步,看起来好长的样子,看官需静下心来慢慢看。。。。 1.词法分析 -- 将源代码字符序列分割成一系列的记号 源代码程序被输入到扫描器(Scanner)。 扫描器的任务就是:运用一种有限状态机(Finite State Machine)的算法,将源代码字符序列分割成一系列的记号(Token)。还有一些其他工作(将标识符放到符号表,将数字、字符串放到文字表中) 如下图(因为表格换页了,所以拍出来是这个样子,望海涵)

QT项目性能调优小记

笑着哭i 提交于 2020-01-04 22:46:54
最近的项目用到了QT 5.5,项目在运行过程中出现了一段时间CPU占用率持续25%,并频繁断网的情况,遂决定对项目性能进行优化。 优化工具也是VS2010自带的性能分析工具,具体的使用方法参见: http://www.cnblogs.com/smark/archive/2011/10/12/2208039.html 其中可以选择“just my code”过滤出自己编写的代码。 通过性能分析工具可以找到占用CPU时间较多的函数,然后按照占有时间多少进行优化->再分析->再优化的步骤,多次优化后,将CPU占用率降到了2%以下。下面将对性能优化提升较大的几个优化步骤进行记录: 1.优化字符串格式化方法。 项目中有将QByteArray中的二进制数如”123”格式化成”31, 32, 33”的功能,使用的代码如下: 1 QByteArray msg = xxx 2 3 QString str; 4 5 foreach (quint8 b, msg) 6 7 { 8 9 str.append(QString().sprintf(“%02X”, b)); 10 11 } View Code 当msg中包含6,7w个字符时,在lz酷睿2代i5的机器上,这段代码需要执行4到5s,因为其中的QString会调用new函数6,7w此,对性能影响极大。优化后的代码如下: 1 QString

Java并发编程核心概念一览

戏子无情 提交于 2020-01-04 05:14:49
作者博客地址 https://muggle.javaboy.org。 并行相关概念 同步和异步 同步和异步通常来形容一次方法的调用。同步方法一旦开始,调用者必须等到方法结束才能执行后续动作;异步方法则是在调用该方法后不必等到该方法执行完就能执行后面的代码,该方法会在另一个线程异步执行,异步方法总是伴随着回调,通过回调来获得异步方法的执行结果。 并发和并行 很多人都将并发与并行混淆在一起,它们虽然都可以表示两个或者多个任务一起执行,但执行过程上是有区别的。并发是多个任务交替执行,多任务之间还是串行的;而并行是多个任务同时执行,和并发有本质区别。 对计算机而言,如果系统内只有一个 CPU ,而使用多进程或者多线程执行任务,那么这种情况下多线程或者多进程就是并发执行,并行只可能出现在多核系统中。当然,对 Java 程序而言,我们不必去关心程序是并行还是并发。 临界区 临界区表示的是多个线程共享但同时只能有一个线程使用它的资源。在并行程序中临界区资源是受保护的,必须确保同一时刻只有一个线程能使用它。 阻塞 如果一个线程占有了临界区的资源,其他需要使用这个临界区资源的线程必须在这个临界区进行等待(线程被挂起),这种情况就是发生了阻塞(线程停滞不前)。 死锁\饥饿\活锁 死锁就是多个线程需要其他线程的资源才能释放它所拥有的资源,而其他线程释放这个线程需要的资源必须先获得这个线程所拥有的资源

C#性能优化实践

旧城冷巷雨未停 提交于 2020-01-04 03:40:50
性能主要指两个方面:内存消耗和执行速度。性能优化简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。 本文以.NET平台下的控件产品MultiRow为例,描述C#性能优化的实践。 性能优化原则 · 理解需求 MultiRow的一个性能需求是:“百万行数据绑定下平滑滚动。”整个MultiRow项目的开发过程一直在考虑这个目标。 · 理解瓶颈 99%的性能消耗是由于1%的代码造成的。大部分性能优化都是针对这1%的瓶颈代码进行的。具体实施也就分为两步:“发现瓶颈”和“消除瓶颈”。 · 切忌过度 性能优化本身是有成本的。这个成本不单单体现在做性能优化所付出的工作量,还包括为性能优化而写出复杂的代码导致额外的维护成本,比如引入新的Bug,额外的内存开销等。性能优化常常需要在收益和成本之间做出权衡。 如何发现性能瓶颈 性能优化的第一步是发现性能瓶颈,下面是一些定位性能瓶颈的实践。 · 如何获取内存消耗 以下代码可以获取某个操作的内存消耗。 long start = GC.GetTotalMemory(true); // 在这里写需要被测试内存消耗的代码,例如,创建一个GcMultiRow var gcMulitRow1 = new GcMultiRow(); GC.Collect(); // 确保所有内存都被GC回收 GC

PHP 性能分析第三篇: 性能调优实战

做~自己de王妃 提交于 2020-01-04 03:38:05
性能调优 不用运行的代码才是绝好的代码。其他只是好的代码。所以,性能调优时,最好的选择是首先确保运行尽可能少的代码。 OpCode 缓存 首先,最快且最简单的选择是启用 OpCode 缓存。OpCode 缓存的更多信息可以在 这里 找到。 在上图,我们看到启用 Zend OpCache 后发生的情况。最后一行是我们的基准,也即没有启用缓存的情况。 在中间行,我们看到较小的性能提升,以及内存使用量的大幅减少。小的性能提升(很可能)来自 Zend OpCache 优化,而非 OpCode 缓存。 第一行是优化和 OpCode 缓存后结果,我们看到很大的性能提升。 现在,我们看看 APC 之前和之后的变化。如上图所示,跟 Zend OpCache 相比,随着缓存的建立,我们看到初始(中间行)请求的性能下降,在消耗时长与内存使用量方面的表现都明显下降。 接着,随之 opcode 缓存的建立,我们看到类似的性能提升。 内容缓存 第二件我们能做的事是缓存内容——这对 WordPress 而言小菜一碟。它提供了许多安装简便的插件来实现内容缓存,包括 WP Super Cache。WP Super Cache 会创建网站的静态版本。该版本会在出现诸如评论事件时依照网站设置自动过期。(例如,在非常高负载情况下,您可能会想禁止任何原因造成的缓存过期)。 内容缓存只能在几乎没有写操作时有效运行

WebView性能、体验分析与优化

落爺英雄遲暮 提交于 2020-01-04 03:27:14
在App开发中,内嵌WebView始终占有着一席之地。它能以较低的成本实现Android、iOS和Web的复用,也可以冠冕堂皇的突破苹果对热更新的封锁。 然而便利性的同时,WebView的性能体验却备受质疑,导致很多客户端中需要动态更新等页面时不得不采用其他方案。 以发展的眼光来看,功能的动态加载以及三端的融合将会是大趋势。那么如何克服WebView固有的问题呢?我们将从性能、内存消耗、体验、安全几个维度,来系统的分析客户端默认WebView的问题,以及对应的优化方案。 性能 对于WebView的性能,给人最直观的莫过于:打开速度比native慢。 是的,当我们打开一个WebView页面,页面往往会慢吞吞的loading很久,若干秒后才出现你所需要看到的页面。 这是为什么呢? 对于一个普通用户来讲,打开一个WebView通常会经历以下几个阶段: 交互无反馈 到达新的页面,页面白屏 页面基本框架出现,但是没有数据;页面处于loading状态 出现所需的数据 如果从程序上观察,WebView启动过程大概分为以下几个阶段: 如何缩短这些过程的时间,就成了优化WebView性能的关键。 接下来我们逐一分析各个阶段的耗时情况,以及需要注意的优化点。 WebView初始化 当App首次打开时,默认是并不初始化浏览器内核的;只有当创建WebView实例的时候,才会创建WebView的基础框架。

WebView性能、体验分析与优化

一个人想着一个人 提交于 2020-01-04 03:26:56
育新 徐宏 嘉洁 · 2017-06-09 20:03 在App开发中,内嵌WebView始终占有着一席之地。它能以 较低的成本 实现Android、iOS和Web的复用,也可以冠冕堂皇的突破苹果对 热更新 的封锁。 然而便利性的同时,WebView的性能体验却 备受质疑 ,导致很多客户端中需要动态更新等页面时不得不采用其他方案。 以发展的眼光来看,功能的动态加载以及 三端的融合将会是大趋势 。 那么如何克服WebView固有的问题呢? 我们将从性能、内存消耗、体验、安全几个维度,来系统的分析客户端默认WebView的问题,以及对应的优化方案。 性能 对于WebView的性能,给人最直观的莫过于: 打开速度比native慢 。 是的,当我们打开一个WebView页面,页面往往会慢吞吞的loading很久,若干秒后才出现你所需要看到的页面。 这是为什么呢? 对于一个普通用户来讲,打开一个WebView通常会经历以下几个阶段: 交互 无反馈 到达新的页面, 页面白屏 页面基本框架出现,但是没有数据; 页面处于loading状态 出现所需的数据 如果从程序上观察,WebView启动过程大概分为以下几个阶段: 如何 缩短这些过程的时间 ,就成了优化WebView性能的关键。 接下来我们逐一分析各个阶段的耗时情况,以及需要注意的优化点。 WebView初始化 当App首次打开时

你不可不知的HTML优化技巧

余生颓废 提交于 2020-01-04 03:20:46
如何提升Web页面的性能,很多开发人员从多个方面来下手如JavaScript、图像优化、服务器配置,文件压缩或是调整CSS。 很显然HTML 已经达到了一个瓶颈,尽管它是开发Web 界面必备的核心语言。HTML页面的负载也是越来越重。大多数页面平均需要40K的空间,像一些大型网站会包含数以千计的HTML 元素,页面Size会更大。 如何有效的降低HTML 代码的复杂度和页面元素的数量,本文主要解决了这个问题,从多个方面介绍了如何编写简练,清晰的HTML 代码,能够使得页面加载更为迅速,且能在多种设备中运行良好。 在设计和开发过程中需要遵循以下原则: 结构分离:使用HTML 增加结构,而不是样式内容; 保持整洁:为工作流添加代码验证工具;使用工具或样式向导维护代码结构和格式 学习新语言:获取元素结构和语义标记。 确保可访问: 使用ARIA 属性和Fallback 属性等 测试: 使网站在多种设备中能够良好运行,可使用emulators和性能工具。 HTML,CSS 和JavaScript三者的关系 HTML 是用于调整页面结构和内容的标记语言。HTML 不能用于修饰样式内容,也不能在头标签中输入文本内容,使代码变得冗长和复杂,相反使用CSS 来修饰布局元素和外观比较合适。HTML元素默认的外观是由浏览器默认的样式表定义的,如在Chrome中h1标签元素会渲染成32px的Times

volatile变量

て烟熏妆下的殇ゞ 提交于 2020-01-04 02:55:07
volatile 的作用是: 作为指令 关键字 ,确保本条指令不会因 编译器 的优化而省略,且要求每次直接读值. 简单地说就是防止编译器对代码进行优化.比如如下程序: ? 1 2 3 4 XBYTE[2]=0x55; XBYTE[2]=0x56; XBYTE[2]=0x57; XBYTE[2]=0x58; 对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入 volatile ,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码). 来源: https://www.cnblogs.com/heiming/p/5804271.html

[JavaScript]项目优化总结

≯℡__Kan透↙ 提交于 2020-01-04 00:55:25
前端时间对公司已有项目 JavaScript 代码进行优化,本文的是对优化工作的一个总结,拿出来与大家分享。当然我的优化方式可能并不是最优的,或者说有些不对的地方,请指教。 目录 JavaScript 优化总结分为以下几点 ... 1 模块化(类编程) ... 2 静态类 ... 3 实例类 ... 5 JavaScript 压缩 / 合并 ... 8 Uglifyjs 安装 ... 9 UglifyJS 使用 ... 11 JavaScript 文件合并 ... 13 文档生成 ... 13 YUIDoc 安装与使用 ... 13 YUIDoc 标签 ... 14 公共类库说明 ... 16 目录结构 ... 16 自动合并、压 缩脚本 ... 17 文档说明 ... 18 参考链接、进一步阅读 ... 20 JavaScript 优化总结分为以下几点 优化前后对比 优化前 优化后 代码混乱,同样功能的函数重复出现在多个地方。如果需要修改实现,需要找到所有的地方。牵一发而动全身 模块化,提取公共接口组织为库、结构清晰、方便代码重用、并且能够游戏防止变量污染问题。 JavaScript 文件未压缩, size 比较大加载消耗网络耗时,阻塞页面渲染 JavaScript 公共库文件使用 UglifyJS 压缩: n Size 比较小优化了网络加载时间 n 压缩混淆了代码