讲讲你不知道的System.out.println

在开发或者调试bug的过程中,有些同学经常用到System.out.println语句,输出到控制台,用来查看数据是否正常。

开发或者调试完毕,很可能就忘记删除,直接就发布到生产中去了。

在一些对性能要求比较高的项目当中,忘记删除的这些代码,就成为将为需要清除优化的对象了。

System.out.println 这个语句 对性能有影响吗?  答案是肯定的,下面用实例给大家验证一下:

废话不多说,上代码:

public class Test01 {
    public static void main(String[] args) {
        long startTime1 = System.currentTimeMillis();
        for (int i = 0; i <100000; i++) {
            System.out.println("i="+i);
        long endTime1 = System.currentTimeMillis();
        System.out.println("使用System.out.print输出语句的耗时为:"+(endTime1-startTime1));
        long startTime2 = System.currentTimeMillis();
        for (int i = 0; i <100000; i++) {
        long endTime2 = System.currentTimeMillis();
        System.out.println("不使用System.out.print输出语句的耗时为:"+(endTime2-startTime2));

输出结果:

从打印结果我们可以看到,循环10w次的打印时间需要耗时1619毫秒,没有打印的循环几乎等于0毫秒。

原理分析:

为什么System.out.println语句会这么耗费性能呢?

我们看一下System.out.println语句的源码就知道答案了。

 public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();

从源码可以看到,在一开始就使用synchronized同步锁给锁起来了,所以System.out.println是一个同步方法,在高并发的情况下,会严重影响性能。

在日常开发或者调试的过程中,尽量使用log4j2或者logback这些异步的方法,进行日志的统一收集,少用甚至是禁止用System.out.println.

项目上线前也要进行全局扫描,防止有人误提交带有System.out.println的代码。

最后扩展几个知识点:

1.System.out.println会输出到tomcat容器的catalina.out文件中吗?

答:默认是不输出到tomcat的日志文件中的,但是如果想要输出到tomcat的日志文件中,可以修改tomcat的配置文件,

conf-web.xml中,把defult-value的值改为1(默认不输出的时候值为0)。

2.System.out.println在error级别的日志中,会输出日志吗?

我测试的时候使用的是logback,在配置文件中把日志级别设置为error,控制台是有输出的。

3.System.out.println在IDEA中的快捷键符号是啥?

讲讲你不知道的System.out.println在开发或者调试bug的过程中,有些同学经常用到System.out.println语句,输出到控制台,用来查看数据是否正常。开发或者调试完毕,很可能就忘记删除,直接就发布到生产中去了。在一些对性能要求比较高的项目当中,忘记删除的这些代码,就成为将为需要清除优化的对象了。System.out.println 这个语句 对性能有影响吗? 答案是肯定的,下面用实例给大家验证一下:废话不多说,上代码:public class ...
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World");
Freebencher 是一个极其灵活易用的性能测试工具。之所以灵活,是因为你可以用任意 Java 代码来写性能测试用例,你可以测试任何可以用 Java 代码来表示的行为,你可以用任何你自己喜欢的方式在测试时获取你的测试数据。 生成的结果类似于 apache ab 的结果, 使用你喜欢的 concurrency,qps 等概念。 你可以通过 Maven 把 freebencer 迅速导入到你的项目中,调用你自己的业务方法,而不是像 Jmeter 一样,把你的类文件别扭地复制到它的目录中。 例:    @Test     public void testLogin() {         final List userList = new ArrayList();         ...//preparing userList to be used as test data.         FbJobResult result = Freebencher.benchmark(new FbTarget() { //the behavior             @Override             public boolean invoke() {                 User user = userList.get(RandomUtils                         .nextInt(userList.size()));                 int statusCode = remoteServiceToTest.doLogin(user.getUsername(), user.getClearPassword());                 return statusCode == 200;         }, 5, // concurrency,                 50 // number of tests to run         System.out.println(result.report());     }得到结果:Test started. Awaiting termination... Test completed. Concurrency:             5 Time taken for tests:    119ms Successful tests:        50 Failed tests:            0 Tests per second:        420.16806722689074 Mean time per test:      11.38ms Percentage of the test finished within a certain time (ms) 50%:                     11 60%:                     12 70%:                     12 80%:                     13 90%:                     14 95%:                     14 98%:                     14 99%:                     16 100%:                    16 标签:freebencher  性能测试
//@Test 查询基本类型 public void testObject() throws Exception{ Finder finder=new Finder("select id from [Users] where 1=1 "); finder.append("and userId=:userId").setParam("userId", 6); Integer id = baseFangService.queryForObject(finder, Integer.class); System.out.println(id); //@Test 查询日期 public void testObjectDate() throws Exception{ Finder finder=new Finder("select cteateTime from Users where id=6 order by id"); Date id = baseFangService.queryForObject(finder, Date.class); System.out.println(id); //@Test 查询一个对象 public void testObjectUser() throws Exception{ Finder finder=new Finder("select * from Users where id=6 order by id"); Users u = baseFangService.queryForObject(finder, Users.class); System.out.println(u.getName()); //@Test 查询分页 public void testMsSql() throws Exception{ Finder finder=new Finder("select * from Users order by id"); List<Users> list = baseFangService.queryForList(finder, Users.class, new Page(2)); System.out.println(list.size()); for(Users s:list){ System.out.println(s.getName()); //@Test 调用数据库存储过程 public void testProc() throws Exception{ Finder finder=new Finder(); finder.setParam("unitId", 0); finder.setProcName("proc_up"); Map queryObjectByProc = (Map) baseFangService.queryObjectByProc(finder); System.out.println(queryObjectByProc.get("#update-count-10")); //@Test 调用数据库函数 public void testFunction() throws Exception{ Finder finder=new Finder(); finder.setFunName("fun_userId"); finder.setParam("userId", 6); String userName= baseFangService.queryForObjectByByFunction(finder,String.class); System.out.println(userName);
System.out.println()标准输出方法性能影响一窥#以前在写功能性代码的时候就知道,代码功能性的强大往往意味着性能的丢失。那么非常好用支持任何格式输出到控制台的System.out.println()标准输出方法究竟是如何工作的呢?做一个简单的测试public class TestOut { private static long timeOut = System.curren
初学者一般在开发中或者调试bug的时候,都会习惯性的使用System.out.println语句,输出到控制台中,观察数据是否正常。开发或者调试完毕,很可能就忘记删除,直接就发布到生产中去了。 有童鞋会说,那有啥关系的,不就是控制台多打印一些日志嘛。那今天老师就和童鞋们分析一下,System.out.println输出语句对服务性能影响。 假如你的服务对性能要求极高,...
List list = new ArrayList&lt;Object&gt;(); long t = System.currentTimeMillis(); for (int i = 0; i &lt; 100000; i++) { list.add("sssss-:" + i); long t1 = System.currentTimeMillis();
  在项目开发中,查看输出值,简单调试或许会用到System.out.println()方法。但是正式上线项目,切记不要闲来无事写几个System.out.println(),轻则会使性能影响重则让服务器瘫痪。直接上代码 &lt;textarea readonly="readonly" name="code" class="Java"&gt; * Prints a String and ...
这两天在验证问题的时候, 突然发现一个问题System.out.println( ) 会影响测试的准确性, 因为System.out.println( ) 本来性能就很差!!!!!!\ 所以特意做了个性能测试. 二.测试代码
问题:在java项目中使用system.out来打印调试信息很方便,项目上线时QA说system.out非常影响服务性能,建议全去掉。 原因:system.out 和java运行程序运行在同一线程,也就是说,业务程序会等待system.out的动作,导致资源被占用。 解决办法:改用log4j 等工具进行调试信息的打印。这类工具是异步线程的,不会使程序处于等待状态。 参考:System.out...
讲讲你不知道的System.out.println 在开发或者调试bug的过程中,有些同学经常用到System.out.println语句,输出到控制台,用来查看数据是否正常。 开发或者调试完毕,很可能就忘记删除,直接就发布到生产中去了。 在一些对性能要求比较高的项目当中,忘记删除的这些代码,就成为将为需要清除优化的对象了。 System.out.println 这个语句 对性...
public void update() { logger.info("开始测试修改"); // 使用日志工具代替 System.out.println() Student student = studentDao.getById(3); // 先查询此数据是否存在 if (student != null) { studentDao.batchUpdate(studentList); // 批量更新 解决idea启动项目报错:Unable to open debugger port(127.0.0.1:62405):java.net.SocketException"socket closed 26444 解决idea启动项目报错:Unable to open debugger port(127.0.0.1:62405):java.net.SocketException"socket closed