代码优化

常用的webpack优化方法

北战南征 提交于 2019-11-30 04:39:02
1. 前言 关于 webpack ,相信现在的前端开发人员一定不会陌生,因为它已经成为前端开发人员必不可少的一项技能,它的官方介绍如下: webpack 是一个模块打包器。webpack的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换(transform)、打包(bundle)或包裹(package)任何资源(resource or asset)。 在日常开发工作中,我们除了会使用 webpack 以及会编写它的配置文件之外,我们还需要了解一些关于 webpack 性能优化的方法,这样在实际工作就能够如虎添翼,增强自身的竞争力。 关于 webpack 优化的方法我将其分为两大类,如下: 可以提高 webpack 打包速度,减少打包时间的优化方法 可以让 Webpack 打出来的包体积更小的优化方法 OK,废话不多说,接下来我们就来分别了解一下优化方法。 2. 提高 Webpack 打包速度 2.1 优化Loader搜索范围 对于 Loader 来说,影响打包效率首当其冲必属 Babel 了。因为 Babel 会将代码转为字符串生成 AST ,然后对 AST 继续进行转变最后再生成新的代码,项目越大, 转换代码越多,效率就越低 。当然了,我们是有办法优化的。 首先我们可以 优化 Loader 的文件搜索范围 ,在使用

19-JDBC、代码优化

前提是你 提交于 2019-11-30 03:32:48
JDBC Java Database Connectivity,Java数据库连接 JDBC的本质是Java对所有关系型数据库进行连接操作所制定的一套规则,就是接口。 不同的数据库针对这套规则制定了相对应的实现类,我们需要使用这些已经做好的实现类,来使用Java对数据库进行连接和操作。 实现步骤: 1、导入jar包 在项目的根目录中创建lib文件夹 将mysql-connector-java-5.1.37-bin.jar复制到lib中 数据库驱动的版本一定要和数据的版本是对应的,如果版本差距过大是会报错的。 右键点击该jar包,选择Build Path,点击Add to Build Path 2、注册驱动 Class.forName("com.mysql.jdbc.Driver"); 3、获取连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名", "用户名", "密码"); 访问本地数据库路径的简写:jdbc:mysql:///库名 4、编写SQL语句 5、获取执行对象 Statement state = conn.createStatement(); 6、执行SQL语句 state.executeUpdate(sql) 实现增删改 state.executeQuery

手把手教你优化自己的代码

对着背影说爱祢 提交于 2019-11-29 21:49:44
今天看到一个帖子, 阿里员工教你优化java代码 讲述的是日常开发中我们经常忽略的一些编程规范,有时候我们经常会忽略这些细节问题,但是一个好的工程,应该需要每一个环节每一个步骤,做到最好,所以记录下来,分享给大家。 1 让代码性能更高 需要 Map 的主键和取值时,应该迭代 entrySet() 当循环中只需要 Map 的主键时,迭代 keySet() 是正确的。但是,当需要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值性能更佳。 反例: Map<String, String> map = ...; for (String key : map.keySet()) { String value = map.get(key); ... } 正例: Map<String, String> map = ...; for (Map.Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); ... } 应该使用Collection.isEmpty()检测空 使用 Collection.size() 来检测空逻辑上没有问题,但是使用 Collection.isEmpty(

MQTT Broker 选型

夙愿已清 提交于 2019-11-29 21:42:55
broker的主要职责是接受发布者发布的所有消息,并将其过滤后分发给不同的消息订阅者。 如今有很多的broker,下面就是一张关于各种broker对比的图片: image 目前我用过的有mosquitto和emqttd(2.0版本后改叫EMQ),因为目前的需求是希望做每秒10万以上的数据接入,所以需要考虑建立集群。但是在使用mosquitto的过程中发现他不支持集群,所以就放弃了,转投emqttd。 在使用mosquitto过程中发现了一些问题: 在使用mosquitto时,如果想使用集群的话,可能会需要进行二次开发。目前只支持桥接。并且他在遍历时的效率非常低,使得他无法支持大量的客户端或者操作过于频繁的操作(比如十万或百万级别的客户端同时发送数据) emqttd有以下优点: 可靠传输。MQTT可以保证消息可靠安全的传输,并可以与企业应用简易集成。 消息推送。支持消息实时通知、丰富的推送内容、灵活的Pub-Sub以及消息存储和过滤。 低带宽、低耗能、低成本。占用移动应用程序带宽小,并且带宽利用率高,耗电量较少。 是中国人写的一个开源的项目,所以使用起来学习成本比较低,容易上手。 EMQ 2.0 (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源 MQTT

C++编辑编译链接运行

痴心易碎 提交于 2019-11-29 21:23:52
  从写一个简单的“hello world!”到完成一个大型程序,当程序从编辑完成到执行成功都会经过5个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)、链接(Linking)和执行(Executing)。了解这五个过程中所做的工作,对我们理解头文件、库文件等在程序中的作用是有帮助的,而且如果能够清楚的了解编译链接过程,在编程时定位错误,纠正错误,以及编程时手动调整编译器以通过调试有很大帮助。 1.预处理 预处理器,进行预处理。预处理过程主要处理那些源代码文件以“#”开始的预编译指令。比如“#include”、“#define”和条件预编译指令,如“#if”、“#ifdef”等。预处理时,将所有的“#define”删除,展开所有的宏定义,并且替换掉“#include”。    (1)宏定义指令 ,如#define a b。对于这种伪指令,预编译所要做的是将程序中的所有a用b替换,还有#undef,则将取消对某个宏的定义,使以后该串的出现不再被替换。    (2)条件编译指令 ,如#ifdef,#ifndef,#else,#elif,#endif等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。    (3) 头文件包含指令 ,如

干翻线段树——指令集优化指北

余生长醉 提交于 2019-11-29 13:18:55
前言 在我们刷题的时候,总会碰到一些关于 区间操作/修改 的题目。这些题目往往要求我们维护一段区间,支持对一段区间进行查询/修改操作。这些题目有如 树状数组1 一般的 简单题 ,也有如[无聊的数列][2]一般,线段树、树状数组能够完成,但是码量长,可读性差,思考难度大的 较难题 。这种题目对时间的要求非常严格, 询问/查询次数 与 序列长度 均在 \(10^5\) 级别或以上,能够使 \(O(n^2)\) 的暴力算法望屋窃叹。那么,有没有什么方法,可以通过数据,代码又易于实现呢? 指令集优化 今天我要讲的 指令集优化 ,就是对这个问题的最佳解答。那么,什么是指令集?指令集优化又能干什么? 什么是指令集? 指令集是存储在CPU内部,对CPU运算进行指导和优化的指令集合。 简单来说,我们写的程序,无论是C, C++, Java, Python,还是其它高级语言,CPU都是看不懂的。这个时候,我们的编译器(解释器)把这些语言翻译为汇编代码,进而翻译01编码,即CPU能看得懂的 指令集命令 。 但是,由于高级语言的特性,在向下翻译的过程中,为了保证其 正确性 与 兼容性 ,编译器会产生大量冗余代码。这些代码的存在使程序运行的速度变得慢了许多。 那我能不能把那些冗余代码删掉啊? 通常情况下,这些冗余代码是不能完全弄掉的。比较特殊的方法是开启编译器优化,也就是我们常说的 吸氧(-o2),吸臭氧

网易互娱我来辣

岁酱吖の 提交于 2019-11-29 12:32:55
static的作用: 1.第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏 2.static的第二个作用是保持变量内容的持久 3.static的第三个作用是默认初始化为0 虚函数,具体怎么实现 https://blog.csdn.net/weixin_40237626/article/details/82313339 指针和引用的区别: 内存分配: 指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。 初始化: 引用在定义的时候必须进行初始化 , 并且不能够改变。 指针在定义的时候 不一定要初始化 , 并且指向的空间可变。 使用级别:有多级指针,但是没有多级引用,只能一级引用。 自增运算:指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时引用的变量值加1) 使用sizeof时: 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小。 直接与间接访问: 引用访问一个变量是直接访问

JVM性能优化, Part 1 ―― JVM简介

浪子不回头ぞ 提交于 2019-11-29 05:27:05
众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚拟机的运行机制做简单介绍,内容包括“一次编写,到处运行”的利弊、垃圾回收的基本原理、常用垃圾回收算法的示例和编译器优化等。后续的系列文章将会JVM性能优化的内容进行介绍,包括新一代JVM的设计思路,以及如何支持当今Java应用程序对高性能和高扩展性的要求。 如果你是一名程序员,那么毫无疑问,你肯定有过某种兴奋的感觉,就像是当一束灵感之光照亮了你思考方向,又像是神经元最终建立连接,又像是你解放思想开拓了新的局面。就我个人来说,我喜欢这种学习新知识的感觉。我在工作时就常常会有这种感觉,我的工作会涉及到一些JVM的相关技术,这着实令我兴奋,尤其是工作涉及到垃圾回收和JVM性能优化的时候。在这个系列中,我希望可以与你分享一些这方面的经验,希望你也会像我一样热爱JVM相关技术。 这个系列文章主要面向那些想要裂解JVM底层运行原理的Java程序员。文章立足于较高的层面展开讨论,内容涉及到垃圾回收和在不影响应用程序运行的情况下对安全快速的释放/分配内存。你将对JVM的核心模块有所了解:垃圾回收、GC算法、编译器行为,以及一些常用优化技巧。此外,还会讨论为什么对Java做基准测试(benchmark)是件很困难的事,并提供一些建议来帮助做基准测试。最后

web性能优化

情到浓时终转凉″ 提交于 2019-11-29 04:20:15
前端是庞大的,包括 HTML、 CSS、 Javascript、Image 、Flash等等各种各样的资源。前端优化是复杂的,针对方方面面的资源都有不同的方式。那么,前端优化的目的是什么 ?   1. 从用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。   2. 从服务商角度而言,优化能够减少页面请求数、或者减小请求所占带宽,能够节省可观的资源。   总之,恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用。   前端优化的途径有很多,按粒度大致可以分为两类,第一类是页面级别的优化,例如 HTTP请求数、脚本的无阻塞加载、内联脚本的位置优化等 ;第二类则是代码级别的优化,例如 Javascript中的DOM 操作优化、CSS选择符优化、图片优化以及 HTML结构优化等等。另外,本着提高投入产出比的目的,后文提到的各种优化策略大致按照投入产出比从大到小的顺序排列。    一、页面级优化     1. 减少 HTTP请求数   这条策略基本上所有前端人都知道,而且也是最重要最有效的。都说要减少 HTTP请求,那请求多了到底会怎么样呢 ?首先,每个请求都是有成本的,既包含时间成本也包含资源成本。一个完整的请求都需要经过 DNS寻址、与服务器建立连接、发送数据、等待服务器响应、接收数据这样一个 “漫长” 而复杂的过程

Java并发编程核心概念一览

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