代码review之 isInfoEnable()
上周没事扫扫系统原来的代码,突然发现这样一段代码:
if(log.isInfoEnable())
{
log.info("ID"+userID+"pwd"+userPwd);
}
因为之前写的日志类都是公司内部自己的日志类,对log4j用的并不多。当时看了这段代码觉得很奇怪,代码意思我是明白的,log本身就可以根据打印权限,判断当前是否打印呀,为什么专门要加上这样一条判断呢?后来查了一下,发现是由于性能方面考虑的。
如果直接写入这样一段话
log.info("ID"+userID+"pwd"+userPwd);
当打印等级为“info”之上时,系统并不会智能的跳过这句话,而是会进这句话的内部,那么进去之前第一件事,必定就是计算参数。
那么这里就会拼接字符串了。
一般来说,日志的打印等级越低,打印的内容就越详细(越趋于调试和跟踪代码),这时出现字符串拼接或者参数计算的东西就会越来越多,也就越耗费性能。此时如果我们设定当前的打印等级非常高,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )如ERROR等级,那么debug和info 级别的日志就不会打印,但是由于debug和info的打印语句非常多,组装参数所耗费的性能也就非常大,所以我们这时候把判断能否打印的语句放在外边先进行判断,虽然乍一看会觉得多此一举,其实当debug和info的日志越多时,越能节约无谓的性能开销。
很多网上很多人说这里不能为了代码的易读性而使用封装,因为在调用封装的方法时,其实已经开始计算参数了,反而显得很可笑,如下:
public void info(String msg)//当前msg其实已经是拼接后的字符串了
{
if(log.isInfoEnable())
{
log.info("ID"+userID+"pwd"+userPwd);
}
}
总结后的反思
1:很多人觉得,不封装就会破坏代码的易读性,很难看,如果封装了,又会起到反效果,所以压根就不要节约这点性能好了,将时间和精力放置在数据库连接查询,数据加载排序等等这些更耗费性能的事情上,其实我也是赞同的,我觉得做性能优化就要一层层的做,没必要从一开始就扣住所有细节,当然遵守一定的编码制度是很好的。但是倘若一开始就从所有 细节(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )着手,反而会影响其它重要的大的优化点。
2:对于这种写法上我个人想了一下觉得如下的写法既能保证代码的可读性,也能体现出这种判断的性能优势,但是会多出一个创建数组的性能开销
public void info(String... args)//使用可变参数
{
if(log.isInfoEnabled())
{
StringBuilder sb=new StringBuilder();
for (int i = 0; i < args.length; i++)
{
sb.append(args[i]);
}
log.info(sb.toString());
}
}
}
代码review之 isInfoEnable()的更多相关文章
- 部署代码review和CI
公司原先搭了一个代码Review的服务器,由于历史原因,装的是一个32bit的Ubuntu系统,后来由于需要,需要安装gitlab,由于gitlab需要64位系统,所以临时凑合了个vagrant,本质 ...
- 前端代码质量保障之代码review
经验丰富的程序员和一般程序员之间的最大区别,不仅体现在解决问题的能力上, 还体现在日常代码的风格上.掌握一门技术可能需要几月,甚至几周就够了. 好的习惯风格养成却需数年. 团队成员之间需要合作,代码需 ...
- 由学习《软件设计重构》所想到的代码review(一)
前言 对于一个程序猿来讲怎样来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我常常接触的一些程序猿来看,他们买了非常多技术重构类书籍.可是看完后代码编写能力并没有显著提 ...
- 对于近阶段公司代码 review 小结
来新公司,给公司的SDK review了一下.发现了不少小问题,在此总结一下. (我下面说明问题可能是很简单,但是搞清楚某些问题还是花了些时间的,大家引以为戒吧) 先谈谈处理的问题: 1.某天QA说有 ...
- 代码review的流程
以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...
- 研发团队如何借助Gitlab来做代码review
代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现有工具在团队内部形成代码revie ...
- Gitlab来做代码review
Gitlab来做代码review 代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现 ...
- 代码review
对于代码review个人也有些小小的看法: 1.首先我觉得我们所有开发人员要弄明白 现在Code Review 的目的 ,凡事不弄明白目的,无法做好完成一件事情,个人觉得有以下一些目的: a)可以在项 ...
- Gerrit代码Review实战
代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略.在实践中,给大家推荐一款免费.开放源代码的代码审查软件Gerri ...
随机推荐
- jQuery的封装方式与JS中new的实现原理
function jQuery() { return new jQuery.fn.init(); } jQuery.fn = jQuery.prototype = { init: function() ...
- 目录的文件权限-X
所有目录务必保持具有X权限(可执行权限)!!,否则无法进入该目录及子目录,且无法读取该目录及子目录下的文件或子目录
- Bootstrap个人总结
Bootstrap框架 1.以栅栏式布局,分12列,16列,24列和32列,常用12列. 2.整个页面必须在container容器内部 3.移动端以 <meta name="viewp ...
- linux常用命令(二)
文件处理命令接上一篇 cat concatenate and display fils 查看小文件 more分页显示文件 空格或者f翻页,回车下一行,Q或q退出. head –num num代表行数 ...
- 后台树状菜单,js实现递归无限分类
//新闻类别管理 public function new_classify() { $arr = M('news_classify')->where("fid = 0")-& ...
- 视频直播点播nginx-rtmp开发手册中文版
2016年8月18日12:42:35 参照官方文档https://github.com/arut/nginx-rtmp-module/wiki/Directives 请注意这个是粗翻译版,仅供参考,不 ...
- soui使用wke时,设置js回调注意事项
wke响应网页js函数调用时注意: 必须等网页加载完成后,才能通过SetJsFunc设置js函数与c++回调的对应.网页未加载就设置,不会响应c++函数. 示例代码: wkeJSData* data ...
- Sublime Text 3 杂记
Sublime Text 是一个功能强大的代码编辑器(收费,但可无限期试用).由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的Vim.Sublime T ...
- C#中文件多选 批量下载
public class MyNameTransfom : ICSharpCode.SharpZipLib.Core.INameTransform { #region INameTransform 成 ...
- C语言 ---- 指针 iOS学习-----细碎知识点总结
内存的访问形式:1.直接访问:通过变量名进行访问.2.间接访问:先找到变量存放的地址,然后根据地址去访问对应的内存空间. 指针--- // 定义一个整形指针变量,用来存储num1在内存中的地址 ...