2016-04-10 2 views
0

Я начал с нескольких тестов, чтобы увидеть разницу в скорости между записью в файл и печатью на консоль, и какая разница между SSD и HDD. Моя программа просто выводит число 0-10,000,000Почему выполнение вычислений в цикле замедляет запись печати на консоль, но не записывается в файл?

Console: 6.089 file: 4.269

Я побежал этот тест до ста миллионов и последовательно видел одни и то же соотношение времен. Я также проверял изменение порядка испытаний и не видел изменения скорости.

Вот где это странно. Я изменил как printlns на .println(i*i+42/7*9-89*2%400/2);

после выполнения этого я получил

Console: 8.586 
file: 4.475 

Где время консоли значительно увеличилось, но время файла не сделало. В качестве окончательной странности я изменил ее на .println((i*i+42/7*9-89*2) %400/2), и в этом случае я действительно увидел скорость в выводе консоли.

Console: 4.352 
file: 4.66 

Может ли кто-нибудь объяснить эти странности? Кажется, я не могу найти причин для резких изменений скорости. Я думаю, возможно, это просто изменение количества бит, которое нужно записать, но я не могу объяснить, почему это влияет только на скорость консоли.

Любая помощь или ответы очень ценятся! Эта проблема беспокоила меня какое-то время, поэтому я подумал, что попрошу экспертов!

+0

Вычисление почти ничего не сравнимо с IO. Если вы видите разницу, скорее всего, это проблема разминки или информация о данных, которые вы пишете. –

+0

Я считал это, но, как я уже сказал, я провел более крупные тесты и видел такое же увеличение времени в консоли, и я также получил то же время, изменив порядок двух тестов. –

ответ

1

Настоящим объяснение, почему печать на консоль происходит медленнее, чем файл (взято с why is system out println so slow).

println не медленно, это лежащую в основе PrintStream, что связано с консолью, предоставленный хостинг операционной системы происходит медленно, потому что:

  1. байты должны быть отправлены в консольное приложение (должно быть достаточно быстро)
  2. Каждый символ должен быть визуализирован с использованием (обычно) шрифта истинного типа (это довольно медленно, выключение сглаживания может улучшить производительность, кстати)
  3. Отображаемая область, возможно, придется прокручивать, чтобы добавить новая строка к видимой области (лучший случай: бит-бит nsfer operation, худший случай: повторная рендеринг полной текстовой области)

Неожиданное увеличение скорости из-за разных расчетов Я не могу дать объяснений. Первоначально я думал о том, чтобы кастинг от int до double, и т. Д., Но это должно относиться и к println.

Это результат, который печатается дольше, чем ширина вашей консоли?

+1

Первый println эффективно печатает некоторое число вокруг 'i * i', а второе эффективно выводит' (i * i + x)% 200'. Для i в 0-10 000 000 это намного меньше. – makadev

+0

Нет, все результаты едва занимают четверть ширины консолей. У меня были некоторые идеи, почему консоль была медленнее, но спасибо за объяснение! Я до сих пор не могу понять, почему будет такая резкая разница во времени для довольно небольших вычислений, особенно для консоли. –