首页 文章 精选 留言 我的

精选列表

搜索[优化],共10000篇文章
优秀的个人博客,低调大师

优化代码中的“坏味道”

“一颗老鼠屎,坏了一锅粥,代码也是如此。” 在我们的项目中,也许在刚开始开发的时候,大家都会遵从一些规范来实施,但是当业务进度催的紧,或者人员变动,随着时间的迁移,项目不断的迭代以后,这时的代码可能就会出现一些“坏味道”了。 “坏味道”代码的出现可能不会影响我们的业务逻辑,大家自然也就比较容易忽视掉了,但是这如同是给我们代码埋下的定时炸弹,当爆炸的那天,需要我们背锅处理的时候,就会后悔当初为何不去解决这些问题呢?下面我们来看一下有哪些“坏味道”代码可以提前处理的吧。 1、多此一举型代码。 if(a > b){ return true;}else{returnfalse;} 也许一些经验不那么老道的开发会觉得这段代码没问题呀,可以跑得通,确实,在逻辑上是没问题的,但是有更简洁明了的写法为何不用?if() 里面的条件是boolean ,然后我们的返回值也是boolean,所以可以改写成 returna>b; 2、瞎命名型代码。 int a;Stringwzbt;// 文章标题Stringfastdi;//fastdi快递。。中西结合... 以上只是不规范命名的实例的冰山一角,良好的命名除了见名知意以外,还可以在长时间以后回来阅读代码时,更快的回忆起业务逻辑,不至于在各种无解的命名中乱了手脚,为了一时的方便而随意命名是非常不值得的。 3、if完一定要加else型代码 if(condition){ //dosm}else{ return ;} if(condition){ //dosm}else{thrownewException();} ​​​​ while(xx){if(condition){//dosm}else{continue;}} 很多情况下,我们通过一些语句的前置类减少不必要的else,让代码看起来更简练清晰。 if(!condition){return;}//dosm if(!condition){thrownewException();}//dosm 4、复制粘贴型 举个例子,项目中A模块引入B模块的优惠券业务,此时C模块也要引入B模块的优惠券业务,由于此时的优惠券业务可能是B模块中的几行代码,很多人就为了贪图方便,直接复制这几行代码直接放到C模块了。so easy,代码完美运行。 看起来似乎又没什么毛病,此时程序员的天敌产品经理过来了,他说在要在优惠券逻辑前面加点限制条件,ok,那么此时就要改动A模块跟B模块2份代码,而且要保持一致性,这个需求就完成了。过了一个版本,D模块也要引用优惠券业务,此时你又愉快的复制过去,然后可爱的产品经理又过来跟你说,这个版本我们要砍掉前面的限制条件...这时候你就要同步三段代码...跟产品经理的一场大战估计在所难免了。 所以从上面的案例中,如果我们一开始不偷懒把公共逻辑抽取出来,在各个模块引用的话,不论怎么修改,我们只要维护一份逻辑就可以,不至于手忙脚乱。 5、又长又臭型代码 此类坏味道代码一般出现在“有历史“的代码中,经过不同开发人员的迭代,一个方法可能会出现几千行的情况,即使有注释,也会让人看得痛不欲生,这时候刚接手修改的人必然会说一句“WTF”了。 所以这就要求我们在平时写代码的过程中养成提炼的习惯,一般来说,当某块业务逻辑需要注释来说明的时候,一般都可以提炼成方法来调用,通过这种方式会使得阅读代码的时候逻辑更加清晰。 还有一种又长又臭情况是出现在方法的参数中,不断的迭代过程也会导致参数的增加或者修改,甚至有看过朋友公司的代码出现一个方法10多个参数的情况。一般来说,当参数超过5个的时候就要考虑封装到对象当中了。 6、无病呻吟型 //输出info日志logger.info("xxx");//定义num变量intnum=0;... 上面举例的是一些无关痛痒的注释,当代码中充斥着这些玩意的时候会让人觉得很臃肿,当你做到上面五点的时候,代码已经不需要太多注释了(滑稽),所以我们的注释要注释到痛点,具体可参考《阿里java开发规范手册》 细节决定成败,在我们工作的过程中,当然还有很多需要我们注意的细节,大家有什么心得可以留言交流一下~ 最后推荐一下<重构 改善代码的既有设计>这本书,比较详细的介绍有那些坏味道需要重构的地方。 喜欢的话,劳烦关注一下微信公众号《深夜里的程序猿》噢~

优秀的个人博客,低调大师

网站架构的逐步优化演变

一:建站之初 * 建站之初,站点流量非常小,可能低于十万级别。这意味着,平均每秒钟也就几次访问。请求量比较低,数据量比较小,代码量也比较小,几个工程师,很短的时间搭起这样的系统,甚至没有考虑“架构”的问题。站点架构特点是“ALL-IN-ONE”: 这是一个单机系统,所有的站点、数据库、文件都部署在一台服务器上。工程师每天的核心工作是CURD,浏览器端传过来一些数据,解析GET/POST/COOKIE中传过来的数据,拼装成一些CURD的sql语句访问数据库,数据库返回数据,拼装成页面,返回浏览器。相信很多创业团队的工程师,初期做的也是类似的工作。 比如:微软技术体系这条路:Windows、iis、SQL-Sever、C# 推荐选择LAMP体系。 为什么选择LAMP? LAMP无须编译,发布快速,功能强大,社区活跃,从前端+后端+数据库访问+业务逻

优秀的个人博客,低调大师

Unity C#编程优化——枚举

考虑下面关于行星枚举的这个例子:public enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO // Pluto is a planet!!!}起初,这样的定义还算好,直到需要产生一个行星的质量。所以我们做这样的事情:// Returns the mass of the planet in 10^24 kgpublic float GetMass(Planet planet) { switch(planet) { case Planet.MERCURY: return 0.330; case Planet.VENUS: return 4.87f; case Planet.EARTH: return 5.97f; ... case Planet.PLUTO: return 0.0146f; }} 行星直径又如何? 另一个switch语句? 密度怎么样? 重力? 逃跑速度? 只要想想你将要维护的switch语句的数量。 你可以争辩说,你可以使用一个Dictionary,但仍然笨重。 每个数据的Dictionary都要映射?没门。有一个更好的方法,我会告诉你如何。 这可能已经是非Unity程序员的常识,但我想在我的博客中再次提出这个冗余的主题,对于那些可能不知道这一点的人来说,特别是初学者。 我也想保持简单。基本上,你可以使用类作为枚举。 为什么用类? 这确实表现的更好 您可以存储任意数量的任意数据。 您甚至可以存储例程或功能。 你可以做很多事情。 唯一的要求是它是不可变的,这意味着类一个实例的状态在整个程序期间都不能改变。以下是Planet枚举用类表示的一个版本:public class Planet { // The different values public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f); public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f); public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f); public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f); public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f); public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f); public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f); public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f); public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f); // Use readonly to maintain immutability private readonly int id; private readonly float mass; // in 10^24 kg private readonly int diameter; // in km private readonly int density; // in kg/m^3 private readonly float gravity; // in m/s^2 // We use a private constructor because this should not be instantiated // anywhere else. private Planet(int id, float mass, int diameter, int density, float gravity) { this.id = id; this.mass = mass; this.diameter = diameter; this.density = density; this.gravity = gravity; } public int Id { get { return id; } } public float Mass { get { return mass; } } public int Diameter { get { return diameter; } } public int Density { get { return density; } } public float Gravity { get { return gravity; } } }为了保持不变性,所有成员变量应该是只读的。 一旦他们被分配,他们将不能再被改变。 这很重要,因为作为枚举,它的内部值不应该改变。 然后将每个枚举值实现为该类的静态只读实例。这是怎么用的? 与正常枚举是一样的,如下使用:// Use it like an enumship.TargetPlanet = Planet.NEPTUNE;// Want to know the target planet's mass?float mass = ship.TargetPlanet.Mass;// Density?int density = ship.TargetPlanet.Density;我们已经消除了切换语句或字典来维护不同行星信息的需要。 想要一个新的行星状态? 只需添加一个新的成员变量并在实例化上指定它们。如何从其他数据类型转换? 喜欢说从int id转换为Planet实例? 这很容易 通常我为这些转换添加了一个公共和静态方法。 例如:public class Planet { // The different values public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f); public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f); public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f); public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f); public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f); public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f); public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f); public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f); public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f); // This can be used to loop through all planets public static Planet[] ALL = new Planet[] { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO }; // Converts the specified id to a Planet instance public static Planet Convert(int id) { for(int i = 0; i < ALL.Length; ++i) { if(ALL.Id == id) { return ALL; } } // return ALL[id] could also work here but what if a non sequential id is used? throw new Exception("Cannot convert {0} to a Planet.".FormatWith(id)); } ...}// UsagePlanet planet = Planet.Convert(someIntPlanet);想从字符串ID转换? 添加将保存此值的字符串成员变量。 而不是使用诸如ALL []的数组,您可以使用如下所示的Dictionary:private static Dictionary<string, planet="" style="color: rgb(34, 34, 34); font-family: 微软雅黑; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">ALL = new Dictionary<string, planet="">() { { MERCURY.TextId, MERCURY }, { VENUS.TextId, VENUS }, { EARTH.TextId, EARTH }, ... { PLUTO.TextId, PLUTO },};// Converts the specified string to a Planet instancepublic static Planet Convert(string id) { return ALL[id];}您可以支持您喜欢的任何类型的转换。还有更多的你可以做。 您现在可以添加功能。 你可以这样做:Planet currentPlanet = Planet.VENUS;currentPlanet.ApplyGravity(ship);The coolest thing for me is you can specify different actions or behavior to the enum values. Something like this (It’s very contrived but you get the idea.):public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f, delegate(Ship ship) { // Actions on land of ship ship.AddFood(1000); ship.RetireCrew(); ship.RecruitNewCrew();});public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f, delegate(Ship ship) { // Actions on land of ship ship.DeductFood(50); ship.Research(); ship.Mine();});通过简单地将你的枚举变成一个类,你已经将它升级到更有组织的东西,而且更加功能强大。 您也可以使用反射和继承等先进功能,但大多数情况下,您不需要。 更多unity2018的功能介绍请到paws3d学习中心查找。

优秀的个人博客,低调大师

MaxCompute小文件问题优化方案

小文件背景知识 小文件定义 分布式文件系统按块Block存放,文件大小比块大小小的文件(默认块大小为64M),叫做小文件。 如何判断存在小文件数量多的问题 查看文件数量 desc extended + 表名 判断小文件数量多的标准 1、非分区表,表文件数达到1000个,文件平均大小小于64M2、分区表: a) 单个分区文件数达到1000个,文件平均大小小于64M, b) 整个非分区表分区数达到五万 (系统限制为6万) 产生小文件数量多的主要原因 1、表设计不合理导致:分区多导致文件多,比如按天按小时按业务单元(假如有6个业务单元BU)分区,那么一年下来,分区数将会达到365246=52560。2、在使用Tunnel、Datahub、Console等数据集成工具上传上传数据时,频繁Commit,写入表(表分区)使用不合理

优秀的个人博客,低调大师

阿里云Elasticsearch性能优化实践

Elasticsearch是一款流行的分布式开源搜索和数据分析引擎,具备高性能、易扩展、容错性强等特点。它强化了Apache Lucene的搜索能力,把掌控海量数据索引和查询的方式提升到一个新的层次。本文结合开源社区和阿里云平台的实践经验,探讨如何调优Elasticsearch的性能提高索引和查询吞吐量。 一. Elasticsearch部署建议1.选择合理的硬件配置,尽可能使用SSD Elasticsearch最大的瓶颈往往是磁盘读写性能,尤其是随机读取性能。使用SSD(PCI-E接口SSD卡/SATA接口SSD盘)通常比机械硬盘(SATA盘/SAS盘)查询速度快5~10倍,写入性能提升不明显。 对于文档检索类查询性能要求较高的场景,建议考虑SSD作为存储,同时按照1:10的比例配置内存和硬盘。对

优秀的个人博客,低调大师

高并发下linux ulimit优化

系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。 ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。 ulimit 指令参数: 选项 [options] 含义 -H 设置硬资源限制,一旦设置不能增加。 -S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 -a 显示当前所有的 limit 信息。 -c 最大的 core 文件的大小, 以 blocks 为单位。 -d 进程最大的数据段的大小,以 Kbytes 为单位。 -f 进程可以创建文件的最大值,以 blocks 为单位。 -l 最大可加锁内存大小,以 Kbytes 为单位。 -m 最大内存大小,以 Kbytes 为单位。 -n Linux操作系统对一个进程可以打开最大文件描述符的数量。 -p 管道缓冲区的大小,以 Kbytes 为单位。 -s 线程栈大小,以 Kbytes 为单位。 -t 最大的 CPU 占用时间,以秒为单位。 -u 用户最大可用的进程数。 -v 进程最大可用的虚拟内存,以 Kbytes 为单位。 在我的centos 6.3 32位系统输入 ulimit -a 结果如下 这边重点描述下红色部分 ulimit -n 问题:Can’t open so many files对于linux运维的同学们,相信都遇到过这个问题。 在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。系统默认设置成1024,但是这个数字对于服务器特别是大并发的远远是不够的,所以,我们需要结合实际情况修改成一个更大更合理的值。 修改方法 vim /etc/security/limits.conf # 确认包含下面的内容: * soft nofile 65536 * hard nofile 65536 保存,然后重启 注:65536 是我这边的设定值,读者也可以自行设置一个合适的值,* 代表针对所有用户 同时还有个要注意的值file-max是设置 系统所有进程一共可以打开的文件数量 ,可以通过如下方法进行修改 echo 6553560 > /proc/sys/fs/file-max 或修改 /etc/sysctl.conf, 加入 fs.file-max = 6553560 重启生效 另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量 ulimit -u 比如我们在模拟大规模http并发测试的时候,客户端会报一个无法fork new proc异常,原因是受到了最大进程1024的限制 解除 Linux 系统的最大进程数 方法如下 vim/etc/security/limits.d/90-nproc.conf # 添加如下的行 * soft nproc 10240 root soft nproc unlimited

优秀的个人博客,低调大师

java或判断优化小技巧

写业务代码的时候,我们经常要做条件判断,有的时候条件判断的或判断长达20多个。reg.equals("1") || reg.equals("2") || reg.equals("3")||.....是不是很奔溃 1,这个时候代码维护不好维护,字段一多对字段就会出错。 2,在最差情况下,执行语句要对这20个判断都判断一下才知道最终的结果,在高性能业务下发挥并不好。 这个时候我们可以用map或set来进行判断,因为hashmap是一个hash桶,查找的效率是比较快的,不管判断任何值他的查询效率基本稳定。 当然最好指定hashmap的长度和判断的元素一样多,这样就避免对某一个桶内衍生出链表了。 例子如下,大家可以试一试。 /** * @author:YangLiu * @date:2018年3月22日 上午10:06:25 * @describe: */ public class ifMap { public static Map<String, String> ISJACARD = new HashMap<String, String>(20) { { put("1", ""); put("2", ""); put("3", ""); put("4", ""); put("5", ""); put("6", ""); put("7", ""); put("8", ""); put("9", ""); put("11", ""); put("12", ""); put("13", ""); put("14", ""); put("15", ""); put("16", ""); put("17", ""); put("18", ""); put("19", ""); put("21", ""); put("22", ""); put("23", ""); put("24", ""); put("25", ""); put("26", ""); put("27", ""); put("28", ""); put("29", ""); } }; public static void main(String[] args) { String reg = "13"; long start = System.currentTimeMillis(); for (int i = 0; i < 100000000; i++) { if (reg.equals("1") || reg.equals("2") || reg.equals("3") || reg.equals("4") || reg.equals("5") || reg.equals("6") || reg.equals("7") || reg.equals("8") || reg.equals("9") || reg.equals("19") || reg.equals("18") || reg.equals("17") || reg.equals("16") || reg.equals("15") || reg.equals("14") || reg.equals("13") || reg.equals("12") || reg.equals("11")) { } } System.out.println(System.currentTimeMillis() - start); start = System.currentTimeMillis(); for (int i = 0; i < 100000000; i++) { if (ISJACARD.containsKey(reg)) { } } System.out.println(System.currentTimeMillis() - start); } } 作者: intsmaze(刘洋) 出处: http://www.cnblogs.com/intsmaze/ 老铁,你的--->推荐,--->关注,--->评论--->是我继续写作的动力。 微信公众号号:Apache技术研究院 由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充! 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册