1 package ch.qos.logback.classic.pattern; 2 3 import java.io.IOException; 4 import java.nio.file.Files; 5 import java.nio.file.Paths; 6 import java.util.Arrays; 7 import java.util.List; 8 import java.util.stream.Collectors; 9 10 import org.junit.jupiter.api.AfterEach; 11 import org.junit.jupiter.api.BeforeAll; 12 import org.junit.jupiter.api.BeforeEach; 13 import org.junit.jupiter.api.Disabled; 14 import org.junit.jupiter.api.Test; 15 import org.slf4j.Logger; 16 import org.slf4j.LoggerFactory; 17 18 import ch.qos.logback.classic.ClassicTestConstants; 19 import ch.qos.logback.classic.LoggerContext; 20 import ch.qos.logback.classic.testUtil.Gaussian; 21 import ch.qos.logback.core.status.OnConsoleStatusListener; 22 23 @Disabled 24 public class LoggerNameConverterPerfTest { 25 26 static final String NAMES_FILE = ClassicTestConstants.INPUT_PREFIX + "fqcn.txt"; 27 28 static List<String> NAMES_LIST; 29 30 static int SIZE; 31 static double MEAN; 32 static double DEVIATION; 33 static Gaussian G; 34 35 LoggerContext loggerContext = new LoggerContext(); 36 LoggerConverter loggerConverter = new LoggerConverter(); 37 38 LoggerNameOnlyLoggingEvent event = new LoggerNameOnlyLoggingEvent(); 39 40 Logger logger = LoggerFactory.getLogger(this.getClass()); 41 42 @BeforeAll 43 static public void loadClassNames() throws IOException { 44 45 NAMES_LIST = Files.lines(Paths.get(NAMES_FILE)).collect(Collectors.toList()); 46 47 SIZE = NAMES_LIST.size(); 48 MEAN = SIZE / 2; 49 DEVIATION = MEAN / 8; 50 G = new Gaussian(MEAN, DEVIATION); 51 System.out.println("names list size=" + SIZE); 52 } 53 54 @BeforeEach 55 public void setUp() { 56 OnConsoleStatusListener ocsl = new OnConsoleStatusListener(); 57 ocsl.setContext(loggerContext); 58 ocsl.start(); 59 loggerContext.getStatusManager().add(ocsl); 60 loggerConverter.setOptionList(Arrays.asList("30")); 61 loggerConverter.setContext(loggerContext); 62 loggerConverter.start(); 63 } 64 65 @AfterEach 66 public void tearDown() { 67 68 } 69 70 @Test 71 public void measureAbbreviationPerf() { 72 for (int i = 0; i < 10 * 1000; i++) { 73 performAbbreviation(); 74 } 75 for (int i = 0; i < 10 * 1000; i++) { 76 performAbbreviation(); 77 } 78 final int runLength = 1000 * 1000; 79 System.out.println("Start measurements"); 80 long start = System.nanoTime(); 81 for (int i = 0; i < runLength; i++) { 82 performAbbreviation(); 83 } 84 long end = System.nanoTime(); 85 long diff = end - start; 86 double average = diff * 1.0D / runLength; 87 logger.atInfo().addArgument(average).log("Average = {} nanos"); 88 int cacheMisses = loggerConverter.getCacheMisses(); 89 90 logger.atInfo().addArgument(cacheMisses).log("cacheMisses = {} "); 91 logger.atInfo().addArgument(runLength).log("total calls= = {} "); 92 93 double cacheMissRate = loggerConverter.getCacheMissRate() * 100; 94 logger.atInfo().addArgument(cacheMissRate).log("cacheMiss rate %= {} "); 95 96 } 97 98 public void performAbbreviation() { 99 String fqn = getFQN(); 100 event.setLoggerName(fqn); 101 loggerConverter.convert(event); 102 } 103 104 private String getFQN() { 105 while (true) { 106 int index = (int) G.getGaussian(); 107 if (index >= 0 && index < SIZE) { 108 return NAMES_LIST.get(index); 109 } else { 110 continue; 111 } 112 } 113 } 114 115 }