性能优化

前端性能优化

扶醉桌前 提交于 2019-12-04 19:54:43
一、 网络层面优化 减少http请求,合并资源(js、css、img) 减少资源体积,压缩资源(js、css、img) 大量数据加载或大量图片加载时使用懒加载或预加载优化 使用按需加载,加快首屏渲染速度 利用http缓存机制,对资源进行缓存 网站用到很多域名时,可使用DNS预解析,提前解析域名 使用CDN给网站静态资源加速 二、 js 层面优化 尽量减少DOM操作,DOM操作尽量做到批量更新,减少页面回流和重绘 避免内存泄漏,及时清理已经没用的定时器、挂载的事件和其他引用 合理使用事件委托,避免给大量子元素添加相同事件 使用变量缓存多次使用的资源,避免每次使用都去获取或计算 频繁执行的函数使用节流或防抖进行优化 有大量数据需运算时,开启Web Worker多线程进行计算可避免js主线程阻塞 js文件引入放置在HTML body尾部,因为js的加载、执行会阻塞页面渲染 三 、css 层面优化 避免使用通配符(*) 避免选择器层级太多,提高解析匹配速度 对于css中可继承的属性,如font-size,尽量使用继承,少一点设置 提取公用样式增强可复用性 css文件引入放置在HTML head头部,因为css的加载、解析并不会阻塞 DOM解析,提前加载可以更快合成Render树 来源: https://www.cnblogs.com/asdfg----123/p/11880303.html

多库取数的性能优化方案

拟墨画扇 提交于 2019-12-04 19:54:34
当数据库表数据量较大时,报表性能往往不高,此时仅针对 SQL 或报表端进行优化,效果往往不明显。这种情况下要显著提升性能,可以考虑采用并行多库的方式,即采用一定规则(如时间)将数据分库分段存储,而报表同时访问多个数据库进行数据计算,最后在报表中进行汇总展现。 不过,一般报表工具并不具备这种并行取数汇总的能力,因此访问多个数据库读取分段数据就需要借助 Java 等高级语言完成,而使用 Java 编写这样的并行程序也并不简单,更何况 Java 本身也缺乏对批量数据计算的基础支持,不支持表达式参数和动态数据结构。凡此种种,使得一般报表工具难以直接使用并行多库的方式提升性能。 本文介绍的润乾报表内置了专门用于数据计算的集算引擎,所提供的并行计算能力允许用户从多个数据库中同时读取数据并在报表端进行汇总展现,从而简单快捷地提升报表性能。 (注:并行多库功能需要结合集算器实现。) 下面通过一个例子简单说明并行多库的使用方法(以 mysql 为例),更多实现细节可以参考润乾报表的相关文档资料: 某电信企业为了提高报表性能,计划将用户服务使用信息按照统计地区分库存储在 4 个 mysql 数据库中,信息统计报表根据指定时间段、品牌等条件过滤查询后,汇总数据。使用润乾报表进行并行分库查询的步骤如下: 1 使用集算器编写并行脚本,实现从多个数据库取数后汇总结果。 并行脚本: A B 1 [mysql1

报表性能优化方案之数据集缓存与共享

♀尐吖头ヾ 提交于 2019-12-04 17:07:25
1. 问题描述 对于大数据量报表,若每次直接从数据库中查询数据,不仅增加数据库服务器的压力,也极大的影响了取数的速度从而降低了报表的执行速度,为此FineReport提供了数据集缓存与共享功能。 FineReport可先将其数据集查询的结果缓存下来,对于缓存下来的数据,再次使用到相同数据集时,无需再次连接数据库重新查询数据,直接使用缓存下来的结果,即使用FineReport的数据集共享机制,达到资源复用,减少取数时间从而提高了报表的展现速度。 2. 数据集缓存 缓存分为缓存至内存和缓存至磁盘。 2.1 缓存至内存 设置方法:默认的就是使用内存缓存即所有数据都保存在内存中,在数据库查询窗口可以看到,如下图: 设置后的效果:当执行数据集时就会在将此记过缓存至内存中,下次在执行此数据集时,会直接从内存缓存中取数。 优缺点:空间资源有限,但效率很高,取数速度快。 什么情况使用:一般使用率高,且数据量不算太大的报表,可直接使用内存缓存。 2.2 缓存至磁盘 设置方法:点击下拉框选择缓存至磁盘当记录大于,并设置行数,如下: 缓存至磁盘,即将数据缓存到服务器的磁盘中,默认是在C:\Documents and Settings\Administrator\.FineReport8.0\cache(windows操作系统)下。 注:如启用了磁盘缓存,发现系统目录下没有cache文件夹,不要感到惊讶

报表性能优化方案之善用参数注入

对着背影说爱祢 提交于 2019-12-04 17:06:52
1. 问题描述 对于多数据集关联报表,当数据很大时报表的展现速度就会很慢,或通过写sql语句又很复杂。为此FineReport提供一种,既可加快报表的展现速度,又不用编写复杂的sql语句的方案。即使用动态参数注入功能。 2. 原理 动态参数注入,是通过注入的值对数据库中的数据进行操作的,只是取对应的数据,所以会提高报表的性能。 3. 示例 新建模板 展现多个关联数据表的数据 SQL语句,ds1:SELECT * FROM [订单] SQL语句,ds2:SELECT * FROM 订单明细 报表样式 传统做法:先定义多个数据集,然后在报表中设置过滤条件,或使用连接将多个数据表定义成一个sql,但这两种方案会产生的一系列问题(具体下面有介绍)。而使用动态参数注入的功能可解决大数量报表展现的速度,下面对比看下这三种做法。 3.1 设置过滤 此方法是定义两个数据集查询出所有数据,然后在报表中设置过滤条件。 分页预览query_like.cpt,从日志中可看出,是将第二个数据集中的数据全部取出了,如下所示: 注:对于数据量大的报表,若将数据全部取出会降低报表的性能,因此会降低报表的展现速度。 3.2 定义sql 若是采用将两个数据集定义成一个数据集,则SQL语句为:select a.订单ID,订购日期,到货日期,发货日期,产品ID,单价,数量,进价,折扣 from 订单 a,订单明细 b

报表性能优化方案之单数据集分页SQL实现层式报表

淺唱寂寞╮ 提交于 2019-12-04 17:05:48
1、概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql 和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分页SQL。 下面以Access 数据库为例介绍需要写分页SQL的数据库怎样利用行式的引擎实现层式报表。 解决方案提供工具:报表开发工具FineReport 2、解决思路 对于mysql 这类可以直接使用行式的引擎实现层式报表的数据库来说,如果勾选了行式引擎,程序会自动生成分页sql,如,我新建了一个数据集ds1,来源于mysql数据库,基本sql语句为: SELECT * FROM 订单明细 如果不定义分页sql ,勾选行式引擎选项,预览报表时,程序会将上面的sql语句转化为下面的语句来取一页的数据: SELECT COUNT(*)AS totalRowCount FROM (SELECT * FROM 订单明细) t 如果数据库是上面所说的access 一类的无法直接生成分页sql的数据库,那么就需要编写分页SQL。 3、操作步骤 以FRDemo 内置的sqlite为例,说明sqlite如何写分页查询。 注:sqlserver2005 和sqlite操作步骤一样。 3.1新建数据集 新建数据集ds1 : SELECT * FROM 订单明细 。 3.2添加分页查询SQL 语句

报表性能优化方案之报表取数

扶醉桌前 提交于 2019-12-04 17:04:39
1. 取数原理 设计器拼出最终的SQL,将SQL语句传给数据库,数据库执行,将数据返回给设计器。 由于计算过程首先要通过SQL语句从数据库中取数据,我们可以通过控制数据量的大小和对数据的提前预处理来提高报表的性能。下面是一些优化的方法。 2. 优化SQL FineReport报表的数据集采用的是表模型,也就是说通过SQL这种DSL语言,从数据库通过简单查询或各种组合关联查询得到一个关系表,而这部分SQL查询根据各种数据库产商长时间的优化(比如建立索引),已经非常成熟。数据集一般要通过FineReport报表模型的复杂处理才能生成最终的表样。因此,从数据库SQL查询取出数据量越少,FineReport报表模型需要做的复杂处理和计算就越少,所花的时间和内存就少,从而可以提高性能。 2.1 SQL语句取具体的字段 我们一般会用select * from 这样的形式将一个数据库表中所有的字段都取出来,而其中一些字段是报表中不需要用到的,例如报表中只需要用到三个字段,但是数据库中实际的表有十个字段,一些初学者习惯性的用select * from table1,这样相当于把十个字段的数据都取到报表服务器端,增加了报表服务器端的内存占用以及减慢了运算速度,所以SQL语句中尽量不要用“*”号,而是写上具体的字段,能够减少报表服务器端的内存占用,加快报表的运算速度。 2.2

Web性能优化的一些方法

六眼飞鱼酱① 提交于 2019-12-04 16:44:49
据调查(?),当网页打开需要超过6秒时,绝大多数的访客都会退出,一般最好的体验是在1~2秒左右,当网页打开速度越慢时,访客对该网页就会越不信任。 Web的性能优化,其实就是想尽一切办法,将网页的加载速度提升到最快 。 从哪些方面可以做到Web性能优化? 由于需要将网页的加载速度提升到最快,可以模拟以下场景:从访客在地址栏中输入想要访问的地址,敲下回车,到网页加载完毕。在这其中发生在浏览器背后的流程,将其列出来,应该是这样的: 查找缓存 DNS查询 建立TCP连接 发送HTTP请求 后台处理请求 接收后台响应 接收响应完成 -> HTML 查看Doctype html/html5/xml 逐行解析(阅读代码) 看到标签 在页面中渲染该标签(Firefox浏览器会这么做) 所有的CSS下载完成后,再渲染该标签(Chrome浏览器会这么做) 看到CSS -> 下载CSS -> 同时下载下一个CSS -> 可以同时下载4个(或8个,取决于浏览器)CSS,即下载并行,解析串行 看到JS -> 下载JS -> 同时下载下一个JS -> 可以同时下载4个(或8个,取决于浏览器)JS,即下载并行,解析串行,并且JS会阻塞HTML的加载 以上就是从敲下回车,到网页加载完毕的全过程。 Web性能优化的方法 减少DNS查询 假设网页里的5个CSS文件,来自5个不同的网站

PHP 性能优化 - php.ini 配置

橙三吉。 提交于 2019-12-04 15:46:12
内存 默认设置 memory_limit = 128M 单个进程可使用的内存最大值,这个值的设定可以从以下几点考虑: 应用的类型。如果是内存集中型应用,可增加该值; 单个 PHP 进程平均消耗的内存,该值可通过多次运行同一个脚本来计算平均值; 能负担多少个 php-fpm 进程;该值等于分配的总内存除以单个 PHP 进程平均消耗的内存; 文件上传 默认设置 file_uploads = On max_file_uploads = 20 upload_max_filesize = 2M max_execution_time = 30 值 为 0 代表没有限制 设置 max_file_uploads 来决定同时允许多少个文件上传; 设置 upload_max_filesize 来决定每个文件上传的最大值; 如果是长时间任务,尽量使用队列来处理,因此,可适当缩短 max_execution_time 的值; 注意, Web 服务器也可以设置文件上传大小及超时时间,不能仅仅以 php.ini 的设置为准; 会话 PHP 的会话默认是保存在硬盘中 session.save_handler = files 在实际应用中,应当将会话保存在内存中。可使用 Memcached 或者 Redis。这样做主要有两个好处: 提高速度; 有助于后期的扩展,如果会话数据存储在硬盘中,不便于增加额外的服务器

报表性能优化方案之巧用相邻连续分组

半世苍凉 提交于 2019-12-04 13:10:36
1. 问题描述 在数据显示方式章节内容中,我们已介绍分组的两个不同使用场景:普通分组和相邻连续分组。但其使用相邻连续分组功能,更主要原因是能够提高其报表的性能。 示例报表开发工具:FineReport 2. 原理 相邻连续分组的操作,是将数据集中连在一起的相同数据才进行合并的。尤其是,在配合SQL中已排好序的列,对其实现的分组时,使用此分组方式其性能比普通分组快些。如下简单示例,查看其报表执行数据信息,可看出其分组方式比普通分组方式更能提高其报表的性能。 3. 实现步骤 3.1 新建报表 3.2 表样设计 设计好报表的基本框架,如下: 3.3 新建数据集 新建数据集名为ds1,对应的SQL语句: SELECT Classno,StudentNO,Name,Sex,Course,Grade FROM STSCORE order by Grade,Classno ASC 3.4 绑定数据列 如下将数据集的字段拖入对应的单元格内: 3.5 分别设置分组 设置为普通分组情况: 将A2单元格设置为普通分组,预览报表并查看日志,报表执行的数据信息如下: 设置为相邻连续分组情况: 将A2单元格设置为相邻连续分组,同样再预览报表,查看日志信息,报表执行的数据信息如下: 来源: oschina 链接: https://my.oschina.net/u/2365939/blog/507964

android 内存优化 性能优化

大兔子大兔子 提交于 2019-12-04 12:42:03
最近做一个android 的应用程序 总是出现内存高 和cpu高的问题困扰了好多天。 下面为自己从网上总结的和自己找到的问题。 1. WebView 控件: 使用了 WebView 控件一定要注意清理缓存 destroy() 方法,但之前必须调用 removeAllViews() 要不然有时出错 myWebView.removeAllViews(); myWebView.destroy(); 2. 线程 在退出活动窗口时一定要注意开启的线程是否已经关闭,可以在debug查看线程的开启情况。 如果只是刷新Ui线程 建议不用线程可以使用 Handler 来刷新 方法如下。这种方法只能做简单的操作,复杂操作建议使用线程。 private Handler _ui_handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0://下面你可以写你需要处理的代码 _ui_handler .sendEmptyMessageDelayed(0,1000)//1000 为延时发送的时间 单位是毫秒 break; } } } 3 sqlite 使用sqlite是一定要注意 关闭当前指针 和数据库连接 下面为注意内存溢出的问题 http://rayleeya