`

What is the fastest way of (not) logging?

    博客分类:
  • java
 
阅读更多
http://www.slf4j.org/faq.html#logging_performance



logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

第二种方式将比第一种方式有30%的性能提升
但是,第二种写法是怎么实现的性能提升?


引用

What is the fastest way of (not) logging?

    SLF4J supports an advanced feature called parameterized logging which can significantly boost logging performance for disabled logging statement.

    For some Logger logger, writing,

    logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

    incurs the cost of constructing the message parameter, that is converting both integer i and entry[i] to a String, and concatenating intermediate strings. This, regardless of whether the message will be logged or not.

    One possible way to avoid the cost of parameter construction is by surrounding the log statement with a test. Here is an example.

    if(logger.isDebugEnabled()) {
      logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    }

    This way you will not incur the cost of parameter construction if debugging is disabled for logger. On the other hand, if the logger is enabled for the DEBUG level, you will incur the cost of evaluating whether the logger is enabled or not, twice: once in debugEnabled and once in debug. This is an insignificant overhead because evaluating a logger takes less than 1% of the time it takes to actually log a statement.

    Better yet, use parameterized messages

    There exists a very convenient alternative based on message formats. Assuming entry is an object, you can write:

    Object entry = new SomeObject();
    logger.debug("The entry is {}.", entry);

    After evaluating whether to log or not, and only if the decision is affirmative, will the logger implementation format the message and replace the '{}' pair with the string value of entry. In other words, this form does not incur the cost of parameter construction in case the log statement is disabled.

    The following two lines will yield the exact same output. However, the second form will outperform the first form by a factor of at least 30, in case of a disabled logging statement.

    logger.debug("The new entry is "+entry+".");
    logger.debug("The new entry is {}.", entry);

    A two argument variant is also available. For example, you can write:

    logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);

    If three or more arguments need to be passed, you can make use of the Object... variant of the printing methods. For example, you can write:

    logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);

    This form incurs the hidden cost of construction of an Object[] (object array) which is usually very small. The one and two argument variants do not incur this hidden cost and exist solely for this reason (efficiency). The slf4j-api would be smaller/cleaner with only the Object... variant.

    Array type arguments, including multi-dimensional arrays, are also supported.

    SLF4J uses its own message formatting implementation which differs from that of the Java platform. This is justified by the fact that SLF4J's implementation performs about 10 times faster but at the cost of being non-standard and less flexible.

    Escaping the "{}" pair

    The "{}" pair is called the formatting anchor. It serves to designate the location where arguments need to be substituted within the message pattern.

    SLF4J only cares about the formatting anchor, that is the '{' character immediately followed by '}'. Thus, in case your message contains the '{' or the '}' character, you do not have to do anything special unless the '}' character immediately follows '}'. For example,

    logger.debug("Set {1,2} differs from {}", "3");

    which will print as "Set {1,2} differs from 3".

    You could have even written,

    logger.debug("Set {1,2} differs from {{}}", "3");

    which would have printed as "Set {1,2} differs from {3}".

    In the extremely rare case where the the "{}" pair occurs naturally within your text and you wish to disable the special meaning of the formatting anchor, then you need to escape the '{' character with '\', that is the backslash character. Only the '{' character should be escaped. There is no need to escape the '}' character. For example,

    logger.debug("Set \\{} differs from {}", "3");

    will print as "Set {} differs from 3". Note that within Java code, the backslash character needs to be written as '\\'.

    In the rare case where the "\{}" occurs naturally in the message, you can double escape the formatting anchor so that it retains its original meaning. For example,

    logger.debug("File name is C:\\\\{}.", "file.zip");

    will print as "File name is C:\file.zip".

分享到:
评论

相关推荐

    Practical+Python+AI+Projects-Apress(2018).pdf

    • What is the best way to produce cars to maximize profit? • What is the best way to carry groceries home: paper or plastic? • Which is the best school for my kid? • Which is the best fuel to ...

    Android.Programming.The.Easy.Way

    The Fastest and Easiest Way for Beginners to Develop Android Apps What’s Stopping You From Making Your Own Android Apps? The mobile phone app market is worth more than $25 billion and is expected ...

    河南省虞城县第一初级中学八年级英语上册 Unit 4 What’s the best movie theater?复习检测题(无

    - **你可以以最快的速度在市电影院买到票.**:You can buy tickets the fastest at the city cinema. - **到目前为止你认为它怎样?**:How do you think of it so far? - **我仍然对周围的情况不是很清楚.**:I'm...

    C.Programming.The.Ultimate.Way.to.Learn.C.1500481114

    This book is the fastest way to get comfortable with C, one incredibly clear and easy step at a time. You’ll learn all the basics: how to organize programs, store and display data, work with ...

    2018秋八年级英语上册Unit4What’sthebestmovietheater第2课时导学案无答案新版人教新目标版

    - 句型2:用于对比,如:“Town Cinema is closer to home and you can buy tickets the fastest there.” 【自研自探】 - 句子翻译: 1. "What's the best movie theater to go to?" The answer is Town Cinema. ...

    Android代码-Google 放出的依赖注入框架,Tiger,速度是最大优势。

    DISCLAIMER: This is not an official Google product. Google's production ...It is the fastest! Not faster, but the fastest! I have tried it on a big project with ~200 modules. While it takes hundreds of

    微软内部资料-SQL性能优化5

    Another way to say this is that the data itself is part of the clustered index. A clustered index keeps the data in a table ordered around the key. The data pages in the table are kept in a doubly ...

    Windows.10.for.the.Internet.of.Things.epub

    Windows 10 for the Internet of Things is for developers and enthusiasts wanting to take their skills in Windows development and jump on board one of the largest and fastest growing trends to hit the ...

    CATIA PORTABLE SCRIPT CENTER VERSION 1.5

    My intention was to create a collection... Also, if you would like to share some other codes with us, you can contact me to add them in this help file (reusing code is the fastest way to solve problems).

    Catch That Cow

    上帝王牌 Description Farmer John has been informed of the location ...The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.

    Exploring Swift Playgrounds

    Exploring Swift Playgrounds: The Fastest and Most Effective Way to Learn to Code and to Teach Others to Use Your Code by Jesse Feiler English | 26 May 2017 | ISBN: 1484226461 | 192 Pages | PDF | 7.27 ...

    internet of things for architects

    The Internet of Things (IoT) is the fastest growing technology market. Industries are embracing IoT technologies to improve operational expenses, product life, and people’s well-being. An ...

    73认识鼠标和键盘.doc

    A: What do you think is the best way of travelling is? B: I think aeroplane is by far the best way. A: Why do you think so? B: Because it is the fastest and the safest. A: Of course it is when you are...

    Windows 10 Absolute Beginner's Guide pdf 无水印 0分

    This book is the fastest way to take control of Windows 10, and use it to create, connect, and discover… simplify and organize your whole life… learn more, play more, do more, live better!...

    semantic_hash.pdf

    than locality sensitive hashing, which is the fastest current method. By using semantic hashing to filter the documents given to TF-IDF, we achieve higher accuracy than applying TF-IDF to the entire...

    understanding machine learning

    Machine learning is one of the fastest growing areas of computer science, with far-reaching applications. The aim of this textbook is to introduce machine learning, and the algorithmic paradigms it ...

    C.Programming.Step.By.Step.Beginners.To.Experts.Edition.B011EXMV7Q

    This book is the fastest way to get comfortable with C, one incredibly clear and easy step at a time. You’ll learn all the basics: how to organize programs, store and display data, work with ...

    Amazon

    It is parsed every time a book record is retrieved, so the output rendering is the fastest possible. http://www.php9.com/php/source/amazon_layout.phps Here you have the full package zipped. ...

    C# 2010捷径教程

    C# 2010 offers powerful new features, and this book is the fastest path to mastering them—and the rest of C#—for both experienced C# programmers moving to C# 2010 and programmers moving to C# from ...

Global site tag (gtag.js) - Google Analytics