Почему производительность System.err значительно ниже, чем System.out в Java (в Windows)?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему производительность System.err значительно ниже, чем System.out в Java (в Windows)?

Сообщение Anonymous »

Я провожу тест на загрузку на System.out , System.err и logger.info (с использованием SLF4J + ROGACK) в среде Java 8 с Spring Boot 2.6.0 и ROSECACK 1.2.7. Я упаковал свой проект в исполняемую банку и запустил его в Windows 11, используя следующую команду: java -jar -xms256m -xmx256m. \ HappyTest -1.0.2 -snapshot.jar>. \ Logs \ HappyTest2.log 2> & 1 < /code>.

hase is api код: < /p>

api: < /p>

вот код API: < /p>

hase: < /p>

hase: < /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







< /code>
Я использую jmeter в другом компьютере, используйте режим CLI. Запустите этот план тестирования.

Обратите внимание, что каждый другой API просто изменяет путь запроса на тестирование. src = "https://i.sstatic.net/nexwbrpn.png"/>
на основе моего понимания, производительность system.out 
и system.err должна быть одинаковой и в целом ниже, чем logger.info из -за i -coduction ch.qos.logback.classic.asyncappender . />
Да, это сработало, как я ожидал. logger.info < /code> лучше. значительно медленнее.

Вот System.out reference. быстрее по сравнению с system.err .

после просмотра исходного кода системы. Java, я заметил, что System.out и System.err. Оба они буфериальны, не так, как некоторые утверждают, что система.

Код: Выделить всё

// 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>?

Спасибо за понимание! Я повторно подвергаю нагрузку в среде Ubuntu.

Есть некоторые изменения, чтобы «тест» успешно запустить.

the loop_count < /code> в коде API -кода на 500.

run project command: nohup java -jar -xms256 --xmx2566. > ./logs/happytest2.log 2> ./logs/happytest3.log & 
jmeter config, как ниже :


Затем запустите план тестирования.

Код: Выделить всё

System.out< /code> Результат теста:


System.err
Результат теста:


Это показывает производительность в ubuntu, system.out и system.err . Похоже, System.err < /code> производительность более низкой является причиной, основанной на среде пробежки. Я повторяю тест на загрузку в среде Windows.

моя тестовая последовательность, как ниже: < /p>

[*] Запуск проекта Java в компьютере Windows. < /Li>

Код: Выделить всё

System.out
загрузочный тест.


[*]

Код: Выделить всё

System.err
Загрузочный тест.


[*]

Код: Выделить всё

System.err
Загрузочный тест.

[*]

Код: Выделить всё

System.out
загрузочный тест.


[*]

Код: Выделить всё

System.out
Загрузочный тест.

Код: Выделить всё

System.err< /code> Загрузочный тест.

 < /li>
< /ol>
Каждый нагрузочный тест будет примерно 4 минуты. alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/iykyzm2w.png"/>
Однако, похоже, ничего не изменяется, System.err 
производительность еще более ниже.

Подробнее здесь: https://stackoverflow.com/questions/794 ... m-out-in-j
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»