代码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 ...
随机推荐
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- .net core 关键概念
startup startup asp.net core 的入口,在构造函数中完成环境参数的配置. 其中Configure 方法是用来控制如何respond一个http请求的, 例如配置l ...
- <八>JDBC_重构DAO查询方法
DAO类: import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import ...
- 【iCore3 双核心板_FPGA】实验二十五:NIOS II之UART串口通信实验
实验指导书及代码包下载: http://pan.baidu.com/s/1eRMZq18 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- Cannot instantiate the type AppiumDriver
I have added following jars in my projects build path: java-client-2.0.0 from http://appium.io/downl ...
- InnoDB杂记
一.InnoDB写数据流程(猜想) myisam是将索引放入内存缓存(Key Cache,大小有key_buffer_size设置) innodb时间索引和数据文件都放入内存缓存池(Buffer Po ...
- BZOJ 3365 Distance Statistics 点分治
这道题是一道点分治的题目,难度不大,可以拿来练手. 关键是对于找出来的重心的删除操作需要删掉这条边,这很重要. 还有每次找重心的时候,不但要考虑他的子节点的siz,还要考虑父节点的siz. 然后就A了 ...
- iOS 将一串字符里面的某个字符全部标志出来
NSMutableString * mutStr = [NSMutableString stringWithString:@"aaabbbbaaaccc"]; NSString * ...
- 用Apache生产csr申请证书
一. 安装Apache: 1.安装完成后将apache安装目录下 conf 文件夹中的"openssl.cnf"文件复制到bin文件夹中: 2.配置Apache支持ssl: 打开A ...
- 浅谈OC对象初始化的三种姿势
一.普通程序猿普通程序员使用最常见路人姿势等场.普普通通,纯属陆仁辈. 陆仁贾写法: // view 1 UIView *v1 = [UIView alloc] initWithFrame:CGRec ...