Вот код API: < /p>
Код: Выделить всё
@RestController
@RequestMapping("/log")
public class LogController {
private static final Logger logger = org.slf4j.LoggerFactory.getLogger(LogController.class);
private static final int LOOP_COUNT = 100;
@GetMapping("/system-out")
public String logSystemOut() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < LOOP_COUNT; i++) {
System.out.println("hello world");
}
long endTime = System.currentTimeMillis();
return "Logged messages in " + (endTime - startTime) + " ms";
}
@GetMapping("/system-err")
public String logSystemErr() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < LOOP_COUNT; i++) {
System.err.println("hello world");
}
long endTime = System.currentTimeMillis();
return "Logged messages in " + (endTime - startTime) + " ms";
}
@GetMapping("/info")
public String logInfo() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < LOOP_COUNT; i++) {
logger.info("hello world");
}
long endTime = System.currentTimeMillis();
return "Logged messages in " + (endTime - startTime) + " ms";
}
}
< /code>
my recoverback.xml Конфигурация ниже: < /p>
logs/happyTest.log
logs/happyTest.%d{yyyy-MM-dd}.log
30
%msg%n
0
8192
Обратите внимание, что каждый разные API просто изменяют путь запроса на тестирование.
на основе моего понимания, производительность system.out и system.err должна быть аналогичной и Как правило, ниже, чем logger.info из -за I настройки ch.qos.logback.classic.asyncappender в restabback.xml.
Да, это сработало, как я ожидал. logger.info < /code> лучше. >
Вот System.err < /code> производительность. значительно медленнее.
Вот система .out Выработка. быстрее по сравнению с system.err .
После просмотра исходного кода System.java я заметил, что различные из System.out и System.err только дескриптор Encode и File. Оба они буфериальны, не так, как некоторые утверждают, что система.
Код: Выделить всё
// java.lang.System
// ... other code
public final static PrintStream out = null;
public final static PrintStream err = null;
// ... other code
private static void initializeSystemClass() {
// ... other code
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn));
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));
// ... other code
}
// ... other code
private static PrintStream newPrintStream(FileOutputStream fos, String enc) {
if (enc != null) {
try {
return new PrintStream(new BufferedOutputStream(fos, 128), true, enc);
} catch (UnsupportedEncodingException uee) {}
}
return new PrintStream(new BufferedOutputStream(fos, 128), true);
}
< /code>
Итак, почему производительность system.err < /code> значительно ниже, чем System.out < /code>?
Спасибо за понимание ! < /p>
2025.2.22.
, чтобы узнать больше информации. Я повторно перепроектирует нагрузочный тест в среде Ubuntu.
Есть некоторые изменения, чтобы «тест» успешно запустил. .
запустить команду использования проекта: nohup java -jar -xms256m -xmx256m ./happytest-1.0.2-snapshot.jar > ./logs/happytest2.log 2> ./logs/happytest3.log &
Затем запустите план тестирования.
Код: Выделить всё
System.out< /code> Результат теста:
System.err< /code> Результат теста:
это показывает Производительность в Ubuntu, System.out
моя тестовая последовательность, как показано ниже: < /p>
[*] Запуск проекта Java в компьютере Windows. < /Li >
Код: Выделить всё
System.out
[*]
Код: Выделить всё
System.err
[*]
Код: Выделить всё
System.err
[*]
Код: Выделить всё
System.out
[*]
Код: Выделить всё
System.out
[*]
Код: Выделить всё
System.err
< /ol>
Каждый тест на загрузку будет распределен примерно на 4 минуты. alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/iykyzm2w.png"/>
Однако, похоже, ничего не изменилось, System.err производительность - это Еще более ниже.
Подробнее здесь: https://stackoverflow.com/questions/794 ... m-out-in-j