当前位置: 首页 > 科技观察

[Facebook]面试官:你做过性能优化的工作吗?您将从哪里开始进行性能优化?

时间:2023-03-15 00:51:10 科技观察

作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多童鞋,这里提供一个开源框架地址:https://github.com/sunshinelyz/mykit-delay写在前面随着互联网的高速发展,互联网行业也慢慢进入了DT时代来自IT时代。对Java程序员的要求越来越高,但仅仅掌握CRUD并不足以胜任互联网公司的相关职位。大量的招聘岗位表明,如果是面试中高级Java岗位,基本需要了解性能优化的相关知识。今天来聊一道经典的面试题:你做过性能优化的工作吗?你从哪里开始性能优化?问题分析题目问了两个问题,一个是你有没有做过性能优化的工作,一个是从哪里开始做性能优化。对于第一个问题,我们可以直接回答是或否。相信大家都希望自己做过性能优化的工作。如果答案是肯定的,那么我们应该如何回答第二个问题呢?首先,对于第二个问题,我们会问哪些方面?开始。这个问题没有固定的答案。你可以根据你过去的经验来回答这个问题,但是在回答这个问题之前,你需要理清思路,明确你想表达的意思。接下来说说第二个问题:性能优化会从哪些方面入手?我们可以从性能优化的几个方面来回答。接下来说一下可以进行哪些方面的性能优化。性能优化包括哪些方面?这里结合自己平时工作中的总结,我将性能优化总结如下图。换句话说,我们可以从数据聚合优化、资源冲突优化、算法优化、JVM优化、复用优化、计算优化和快速实施等方面进行回答。接下来,我们对每一点进行解释。数据聚合优化数据聚合优化主要针对数据集成和传输的优化。比如:我们从数据库中查询到的数据,是由程序聚合后返回给客户端的,而不是客户端调用多个接口分别获取数据。再比如:我们在项目中使用的Nginx一般都会开启GZIP压缩,让传输的数据更加紧凑,同时减少传输的数据量。细心的朋友会发现,我们对数据聚合的优化主要是为了让传输的数据量变小。因此,我们在使用SQL语句查询数据库中的数据时,尽量查询需要的字段,不需要的字段直接忽略,避免SQL语句中的select*resource冲突。优化在我们平时的工作中,尤其是在高并发场景下,经常会出现锁冲突,而锁冲突是资源冲突的典型场景。关于锁,我们可以想到数据库中的行锁、表锁、synchronized和Java中的Lock等。如果对应到操作系统层面,就会有CPU命令层面的锁,JVM指令层面的锁,操作系统内部的锁等等。这里需要小伙伴们注意一点:资源冲突只会发生在并发场景。也就是说:同一时间,只有一个请求才能获取请求的资源,解决冲突的方式就是加锁。算法优化在一个大型的互联网项目中,往往会涉及到分布式、微服务等技术,同时也会用到大量的数据结构和算法。算法的优化可以显着提高系统的性能。与糟糕的实施相比,良好的实施可以在系统性能的改进方面产生巨大差异。比如作为List的实现,LinkedList和ArrayList在随机访问性能上差了几个数量级;又如CopyOnWriteList采用了??copy-on-write的方式,在读多写少的场景下可以显着减少锁冲突。而什么时候使用同步,什么时候线程安全,对我们的编码能力也有很高的要求。因此,我们在平时的工作中需要积累大量的数据结构和算法方面的知识。JVM优化JVM调优,不用多说,这是每个Java工程师都必须掌握的标准技能。所有的Java程序最终都是在JVM中运行的,优化JVM也可以提高Java程序的性能。但是需要注意的是,如果在优化JVM时参数设置不当,可能会导致内存溢出等严重问题。目前广泛使用的垃圾收集器是G1,它可以通过很少的参数配置来高效回收内存。CMS垃圾收集器在Java14中被移除。由于其GC时间不可控,因此应尽可能避免。ReuseoptimizationReuse优化,这个从名字就可以知道,说白了就是可以重用。估计很多小伙伴都有这样的经历。写代码的时候,可以把很多重复的代码抽象出来,做成公共方法。这样就不用每次都写重复的逻辑代码了。这是代码级别的重用。如果是在数据层面,我们可以使用缓冲和缓存来复用数据。在这里,小伙伴们需要注意一个知识点:缓冲主要是写操作,缓存主要是读操作。复用优化的另一个典型场景是池化技术,例如:数据库连接池、线程池等。计算优化对于计算优化,我们可以从以下几个小方面进行阐述。并行计算不难理解,就是同时进行多项计算。在这里,并行计算可以分为:多机并行计算、多进程并行计算和多线程并行计算。多机并行计算:将一个大的计算任务拆分成N个小的计算任务,分布到不同的机器上进行处理。一个典型的场景是Hadoop的MapReduceextreme。多进程计算:例如Nginx采用的NIO模型,采用进程调度策略。Master进程调度Worker进程,Worker处理具体的请求。多线程计算:对于多线程计算,也是我们平时接触最多的一种计算方式。我们可以利用多线程技术,将复杂的逻辑计算拆分成小的计算任务,分发到不同的线程中。执行。同步转异步同步和异步的区别是:同步需要等待返回结果,异步不需要等待返回结果。如果我们在业务程序中不需要等待返回结果数据,我们可以将同步调用优化为异步调用,从而提高我们系统的性能。延迟加载最典型的场景就是Spring中的延迟加载。只有在第一次获取bean时,才会创建bean实例。快速实施快速实施,不仅包括我们需要使用相关的程序框架来快速开发我们想要的业务,还需要我们在技术选型时尽量使用一些性能优异的组件。比如做网络开发,尽量选择Netty,结合轻量级数据传输,不要使用WebService等技术。很多公司喜欢使用适配器模型,在一些已有的开源组件之上抽象出一层自己的组件,这样就可以切换底层组件,而感受不到上层应用。本文转载自微信公众号“冰河科技”,可通过以下二维码关注。转载本文请联系冰川科技公众号。