2016-04-25 4 views
4

У меня есть простая программа, которую я получил из своей книги по программированию на Java, просто добавила немного к ней.System.out.print, вызывающий латентность?

package personal; 

public class SpeedTest { 
    public static void main(String[] args) { 
    double DELAY = 5000; 
    long startTime = System.currentTimeMillis(); 
    long endTime = (long)(startTime + DELAY); 
    long index = 0; 

    while (true) { 
     double x = Math.sqrt(index); 
     long now = System.currentTimeMillis(); 
     if (now >= endTime) { 
     break; 
     } 
     index++; 
    } 
    System.out.println(index + " loops in " + (DELAY/1000) + " seconds."); 
    } 
} 

Это возвращает 128478180 loops in 5.0 seconds.

Если добавить System.out.println(x); до если утверждение, то мое число петель в 5 секунд идет вниз к 400,000s, является то, что из-за задержки в System.out.println()? Или это просто, что x не рассчитывался, когда я не распечатывал его?

+8

Печать на консоль должна быть худшей вещью, которую вы можете сделать с точки зрения производительности. Операции ввода-вывода занимают много времени. – Tunaki

+0

System.out.println - операция ввода-вывода, и да, это может повлиять на производительность любой программы. – Sanjeev

+6

Хорошо заданный вопрос, я не понимаю нисходящие точки. Просто потому, что для вас это тривиально, это не значит, что вы должны понижать уровень. – Maroun

ответ

0

В любое время вы «сделать вывод» в очень занята петле, в любого языка программирования вообще, вы ввести два, возможно, очень значимые задержки:

  1. Данных должен быть преобразован в печатаемые символы, затем записывается на любой дисплей/устройство, которое оно может собираться ... и ...
  2. «Акт вывода ничего» обязывает процесс синхронизировать себя с любым процессом, который может также генерировать выход.

Одна альтернативная стратегия, которая часто используется для этой цели, представляет собой «таблицу трассировки». Это массив в памяти, определенного фиксированного размера, который содержит строки. Записи добавляются в эту таблицу в режиме «круглой формы»: самая старая запись постоянно заменяется самой новой. Эта стратегия обеспечивает историю без необходимости выход. (Единственное требование, что остается в том, что любой, который добавляет запись в таблицу, или чтение из него, необходимо синхронизировать их деятельность например с помощью мьютекса.)

Процессы, которые хотят дисплей содержимое трассировочная таблица должна захватывать мьютексы, делать копию содержимого содержимого, находящуюся в памяти, а затем отпускать мьютекс перед подготовкой их вывода. Таким образом, различные процессы, которые вносят записи в таблицу трассировки, не будут задерживаться источниками задержки, связанными с I/O.

Смежные вопросы