代码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 ...
随机推荐
- ZeroMQ接口函数之 :zmq_tcp – 使用TCP协议的ØMQ网络单播协议
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-tcp zmq_tcp(7) ØMQ Manual - ØMQ/4.1.0 Name zmq_t ...
- java 输入年月,获取日历表
/* 做日历作业: 输入一个时间如: 2016-11 就显示2016年11月的日历显示 */ import java.util.*; class calendar { public static vo ...
- Vuforia图像追踪,动态创建的对象隐藏显示的坑
刚做的一个项目,使用Unity3D的Vuforia插件进行图像识别,其中有动态生成的游戏对象模型,地形模型放在ImageTarget下,作为ImageTarget的子物体. 动态生成的敌人则有Pref ...
- Git 恢复某个文件指定版本
1. git reflog 找到comit id 2. git reset edf92f a.txt 3. git commit -m "ssss" 4. git checkou ...
- 函数式中的 currying
currying 是函数式语言中经常遇到的一个概念,翻译成 柯里化,不是库里化. currying 指的是将接收多个参数的函数变换成接收一个单一参数,并且返回接收余下的参数而且返回结果的新函数的技术. ...
- bmp图片的有关操作
读取bmp图片 并生成新的bmp图片 #include "stdafx.h"#include <windows.h>#include <cmath>#inc ...
- 点击input时,里面默认字体消失显示
点击input时,点击input里面默认字体消失显示: <input type="" name="" id="" value=&quo ...
- Java局部变量
局部变量是在方法被执行时创建,在方法执行结束时被销毁.局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误. 在相互不嵌套的作用域中可以同时声明两个名称,类型相同的局部变量, public ...
- typealias和泛型接口
typealias 是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰.使用的语法也很简单,使用 typealias 关键字像使用普通的赋值语句一样,可以将某个已经存在的类型赋值为 ...
- Java反射使用技巧
1. 通过setAccessible关闭安全检查,关闭的目的不是因为访问的field/method是私有的,而且因为关闭后访问公有方法也不会再有安全检查. SomeObject someObject ...