代码优化

性能优化之代码优化

末鹿安然 提交于 2019-12-06 10:26:51
写于2017-10-11 背景:面试时我喜欢问候选人的一个问题是:是否有性能优化的经历与案例可以分享。大多数候选人一上来就说sql优化,甚至直接谈起如何建索引。诚然多数的性能问题是由于不合适的sql/索引引起,但是代码级别的优化,就真的没有可挖之处了吗? 本文笔者将根据实际项目中碰到的部分案例浅析代码优化那点事 1、Map实现Code2Name,减少时间复杂度 案例:已有学生信息列表,班级信息列表,翻译每个学生(只知道班级ID,不知道班级名称)所在的班级名 @Data public class Student { private int name; private int classId; //扩展属性 private String className; } @Data private class ClassInfo{ private int classId; private String ClassName; } public void translateClassName(List<Student> studentList, List<ClassInfo> classInfoList){ for(Student student : studentList){ for(ClassInfo classInfo : classInfoList){ if(student

【转】90%的人会遇到性能问题,如何用1行代码快速定位

白昼怎懂夜的黑 提交于 2019-12-06 09:40:28
90%的人会遇到性能问题,如何用1行代码快速定位? 原创: 齐光 阿里技术 阿里妹导读:在 《如何回答性能优化的问题,才能打动阿里面试官? 》 中,主要是介绍了应用常见性能瓶颈点的分布,及如何初判若干指标是否出现了异常。 今天,齐光将会基于之前列举的众多指标,给出一些常见的调优分析思路,即:如何在众多异常性能指标中,找出最核心的那一个,进而定位性能瓶颈点,最后进行性能调优。整篇文章会按照代码、CPU、内存、网络、磁盘等方向进行组织,针对对某一各优化点,会有系统的「套路」总结,便于思路的迁移实践。 1. 代码相关 遇到性能问题,首先应该做的是检查否与业务代码相关——不是通过阅读代码解决问题,而是通过日志或代码,排除掉一些与业务代码相关的低级错误。 性能优化的最佳位置,是应用内部。 譬如,查看业务日志,检查日志内容里是否有大量的报错产生,应用层、框架层的一些性能问题,大多数都能从日志里找到端倪(日志级别设置不合理,导致线上疯狂打日志);再者,检查代码的主要逻辑,如 for 循环的不合理使用、NPE、正则表达式、数学计算等常见的一些问题,都可以通过简单地修改代码修复问题。 别动辄就把性能优化和缓存、异步化、JVM 调优等名词挂钩,复杂问题可能会有简单解,「二八原则」在性能优化的领域里里依然有效 。当然了,了解一些基本的「代码常用踩坑点」,可以加速我们问题分析思路的过程,从 CPU、内存

代码优化-多态代替IF条件判断

落爺英雄遲暮 提交于 2019-12-06 06:47:59
场景描述 在开发的场景中,常常会遇到打折的业务需求,每个用户对应的等级,他们的打折情况也是不一样的。例如普通会员打9折,青铜会员打8.5折,黄金会员打8折等等。在一般开发中最简单的就是判断用户的等级,然后对订单作对应的打折处理。 场景示例 写了一个简单的小示例,如下所示: //1 代表学生 2老师 3校长 int type = 1; if (1 == type) { System.out.println("学生笑嘻嘻的说话"); } else if (2 == type) { System.out.println("老师开心的说话"); } else { System.out.println("校长严肃的说话"); } 上面的代码,是我们经常的做法,代码少的时候,看起来非常清晰,但是代码多起来或者有了更多的判断条件,那上面的代码会更加的混乱,如果每次有修改,都要改动这部分代码。 解决方法 可以把上面的代码改成多态方式,创建三个类,学生Student,老师Teacher,校长HeadMater,父类为Person,这三个类都实现父类的方法say,如下所示: Person.class package me.xueyao.service; /** * @author Simon.Xue * @date 2019-12-01 14:31 **/ public interface

Java编码技巧与代码优化

狂风中的少年 提交于 2019-12-06 04:54:16
本文参考整理自 https://mp.weixin.qq.com/s/-u6ytFRp-ZAqdLBsMmuDMw 对于在本文中有所疑问的点可以去该文章查看详情 常量&变量 直接赋值常量值, 禁止声明新对象,如 Long i = new Long(1L); 当成员变量值 无需改变 时, 尽量定义为 静态常量 尽量使用基本数据类型, 避免自动装箱和拆箱 如果变量会 被覆盖 就 没必要赋初值 尽量使用 函数内 的 基本类型临时变量 函数内 , 基本类型 的参数和临时变量都保存在 栈 中, 访问 速度较快 . 对象类型 的参数和临时变量和引用都保存在栈中, 而 内容都保存在堆 中, 访问 速度较慢 在类中 , 任何类型 的成员变量都保存在 堆 中 尽量不要在循环体外定义变量, 避免延长 大对象 生命周期 导致 延缓回收 问题 不可变的静态常量和成员变量, 尽量使用非线程安全类 对象&类 禁止使用JSON转化对象 , 应该手动包装来转化对象 先转化为JSON字符串再转为对应对象可以实现转化对象, 但是性能上存在问题 尽量不使用通过 反射赋值 对象, 会造成 性能下降 , 比如DTO取值赋值到VO 匿名内部类采用 Lambda表达式 , 因为Lambda表达式在大多数虚拟机中采用 invokeDynamic 指令实现, 效率会比匿名内部类更高 尽量 避免定义不必要的子类

ASP.NET(C#) 面试总结面试题大全

冷暖自知 提交于 2019-12-06 02:52:40
一、对于 Web 性能优化,您有哪些了解和经验吗? 出现指数:五颗星 主要考点:这道题是博主在博客园的新闻里面看到的,回想之前几年的面试经历,发现此题出现概率还是比较高的。因为它的考面灰常广,可以让面试官很快了解你的技术涉及面以及这些技术面的深度。 参考答案:这个问题可以分前端和后端来说。 1、前端优化 (1)减少 HTTP 请求的次数。我们知道每次发送http请求,建立连接和等待相应会花去相当一部分时间,所以在发送http请求的时候,尽量减少请求的次数,一次请求能取出的数据就不要分多次发送。 (2)启用浏览器缓存,当确定请求的数据不会发生变化时,能够直接读浏览器缓存的就不要向服务端发送请求。比如我们ajax里面有一个参数能够设置请求的时候是否启用缓存,这种情况下就需要我们在发送请求的时候做好相应的缓存处理。 (3)css文件放 在<head>里面,js文件尽量放在页面的底部。因为请求js文件是很花费时间,如果放在<head>里面,就会导致页面的 DOM树呈现需要等待js文件加载完成。这也就是为什么很多网站的源码里面看到引用的文件放在最后的原因。 (4)使用压缩的css和js文件。这个不用多说,网络流量小。 (5)如果条件允许,尽量使用CDN的方式引用文件,这样就能减少网络流量。比如我们常用的网站http://www.bootcdn.cn/。 (6)在写js和css的语法时

Java内存模型原理

妖精的绣舞 提交于 2019-12-06 00:51:39
这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对 Java 内存模型体系产生一个相对清晰的理解,知其然知其所以然。 内存模型产生背景 在介绍 Java 内存模型之前,我们先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。 物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机的解决方案对虚拟机的实现有相当的参考意义。 物理机的并发问题 硬件的效率问题 计算机处理器处理绝大多数运行任务都不可能只靠处理器“计算”就能完成,处理器至少需要与内存交互,如读取运算数据、存储运算结果,这个 I/O 操作很难消除(无法仅靠寄存器完成所有运算任务)。 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,为了避免处理器等待缓慢的内存完成读写操作,现代计算机系统通过加入一层读写速度尽可能接近处理器运算速度的高速缓存。 缓存作为内存和处理器之间的缓冲: 将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。 缓存一致性问题 基于高速缓存的存储系统交互很好的解决了处理器与内存速度的矛盾,但是也为计算机系统带来更高的复杂度,因为引入了一个新问题:缓存一致性。 在多处理器的系统中(或者单处理器多核的系统),每个处理器(每个核)都有自己的高速缓存,而它们有共享同一主内存(Main

luajit官方性能优化指南和注解

[亡魂溺海] 提交于 2019-12-05 22:18:38
转自: https://blog.csdn.net/qq_35624156/article/details/77455670 一、什么是lua&luaJit lua(www.lua.org)其实就是为了嵌入其它应用程序而开发的一个脚本语言, luajit(www.luajit.org)是lua的一个Just-In-Time也就是运行时编译器,也可以说是lua的一个高效版。 二、优势 1)lua是一个免费、小巧、简单、强大、高效、轻量级的嵌入式的脚本语言,lua当前的发行版本5.3.1只有276k。 2)它是用C语言开发的项目,所以可以在大部分的操作系统上运行 3)lua是目前速度最快的脚本语言,既可以提升语言的灵活性还可以最大限度的保留速度 4)其语法非常简单,没有特例 5)lua还可以作为C的API来使用 三、不足和不同 1)lua没有强大的库,所以很多功能实现起来没有python、perl、ruby等脚本语言简洁 2)lua的异常处理功能饱受争议,虽然其提供了pcall和xpcall的异常处理函数 3)lua原生语言中没有提供对unicode编码的支持,虽然可以通过一些折中的办法实现 http://www.cppblog.com/darkdestiny/archive/2009/04/25/81055.html 4)没有提供在C++中应用很广泛的a?b:c的三元运算符操作 5

《程序员的自我修养》读书笔记 第二章 编译和链接

戏子无情 提交于 2019-12-05 20:51:15
2.1 被隐藏了的过程 在平常的应用程序开发中一般都不需要关注编译和链接过程,因为在IDE开发环境中一般都将编译和链接合到一起一步完成,直接生成可执行文件;通常将这个过程称为 构建(Buil) 。 对于最经典的C语言版"Hello World"的代码: #include <stdio.h> int main() { printf("Hello World\n"); return 0; } 我们在Linux下使用GCC来编译该代码时,只需使用几行简单的命令就完成对上述代码的编译等一系列过程(假设源码文件名为hello.c),生成可直接运行的的程序: $gcc hello.c $./a.oout Hello World 事实上,上述过程可分解为4个步骤,分别是 预处理(preprocess) 、 编译(compilation) 、 汇编(assembly) 和 链接(linking) ,其中前三个阶段都是文本形式的处理,如下图所示: 下面分别大致介绍下各个步骤的作用。 预编译 预编译过程主要处理那些源代码文件中以“#”开始的预编译指令。比如“#include”、“#define”等,常见的处理规则如下: 将所有的“#define”删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如“#if”、“#ifdef”、“#endif”等。 处理“#include”预编译指令

一条 SQL 在 Apache Spark 之旅

喜夏-厌秋 提交于 2019-12-05 16:42:10
转载自过往记忆大数据 https://www.iteblog.com/archives/2561.html Spark SQL 是 Spark 众多组件中技术最复杂的组件之一,它同时支持 SQL 查询和 DataFrame DSL。通过引入了 SQL 的支持,大大降低了开发人员的学习和使用成本。目前,整个 SQL 、 Spark ML、Spark Graph 以及 Structured Streaming 都是运行在 Catalyst Optimization & Tungsten Execution 之上的,如下图所示: 所以,正常的 SQL 执行先会经过 SQL Parser 解析 SQL,然后经过 Catalyst 优化器处理,最后到 Spark 执行。而 Catalyst 的过程又分为很多个过程,其中包括: Analysis:主要利用 Catalog 信息将 Unresolved Logical Plan 解析成 Analyzed logical plan; Logical Optimizations:利用一些 Rule (规则)将 Analyzed logical plan 解析成 Optimized Logical Plan; Physical Planning:前面的 logical plan 不能被 Spark 执行,而这个过程是把 logical plan

C++程序的耦合性设计

大憨熊 提交于 2019-12-05 16:28:01
声明:本文部分采用和参考《代码里的世界观-通往架构师之路》中内容,可以说是该书中耦合性一章的读后感,感谢该书的作者余叶老师的无私分享。 1.什么是耦合? 耦合其实就是程序之间的相关性。 程序之间绝对没有相关性是不可能的,否则也不可能在一个程序中启动,如下图: 这是一个Linux中socket TCP编程的程序流程图,在图中的TCP服务器端,socket()、bind()接口、listen()接口、accept()接口之间肯定存在着相关(就是要调用下一个接口程序必需先调用前一个接口),也就是耦合,否则整个TCP服务器端就建立不起来,以及改变了bind()中的传入的数据,比如端口号,那么接下来的listen()监听的端口,accept()接收连接的端口也会改变,所以它们之间有很强的相关性,属于紧耦合。所以耦合就是代码的相关性,如果还不明白,也没关系,继续看下去,相信你会懂的,哈哈。 2.耦合的形式 (1)数据之间耦合 在同一个结构体或者类中,如: typedef struct Person { int age; char* name; }Person; class Person { private: int age_m; bool namePresent_m; std::string name_m; }; 在上面的结构体和类中,年龄和名字两个基本数据单元组合成了一个人数据单元