2014-07-21 6 views
0

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

Я сделал эти 3 аналогичные программы с незначительной разницей в тексте, но огромная практическая разница.

import java.util.Random; 
import java.io.PrintStream; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class RandomCharInfinity 
{ 
    public static void main(String[] args) throws FileNotFoundException 
    { 
     PrintStream save = new PrintStream(new File("virus.txt")); 
     Random r = new Random(); 

     while(true) 
     { 
      save.print((char)(r.nextInt(26)+'a')); 
     } 
    } 
} 

Этот код сгенерировал файл virus.txt размером 45 МБ всего за 30 секунд.

import java.util.Random; 
import java.io.PrintStream; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class RandomCharInfinity 
{ 
    public static void main(String[] args) throws FileNotFoundException 
    { 
     PrintStream save = new PrintStream(new File("virus.txt")); 
     Random r = new Random(); 
     while(true) 
     { 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
      save.print((char)(r.nextInt(26)+'a')); 
     } 
    } 
} 

Этот код сгенерировал файл virus.txt размером около 15 мб за 30 секунд.

import java.util.Random; 
import java.io.PrintStream; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class RandomCharInfinity 
{ 
    public static void main(String[] args) throws FileNotFoundException 
    { 
     PrintStream save = new PrintStream(new File("virus.txt")); 
     Random r = new Random(); 
     char ch = (char)(r.nextInt(26)+'a') 
     while(true) 
     { 
      save.print(ch); 
     } 
    } 
} 

Этот файл также генерирует virus.txt с 15 МБ за 30 секунд.

Теперь мой вопрос: в последней программе я беру один случайный символ и просто печатаю его бесконечно.

В средней программе, я печатаю 10 случайных символов за один раз с одной проверкой цикла.

В первой программе, я печатаю случайный символ, и каждый раз, когда я должен проверять цикл while.

Почему эти программы отличаются друг от друга размерами и что тоже огромная разница?

+0

Как вы измерить пропускную способность? –

+3

Все три программы должны иметь довольно идентичную производительность. Как вы измеряете? –

+2

Я собираюсь использовать «случайные различия в кешировании ОС». – chrylis

ответ

0

Вы не можете рассчитывать на размеры файлов, если вы не закрываете файл должным образом из вашей программы, поэтому ваши выводы были сделаны с недопустимыми данными.

Перепишите свои программы, чтобы генерировать определенный объем вывода, и измерьте, сколько времени потребовалось с помощью System.currentTimeMillis().

(Также обратите внимание, что IO обычно много медленнее, чем работа процессора, так что лучший способ ускорить выход вверх, чтобы буфер OutputStreams - который PrintStream может быть уже делают)

+0

Можете ли вы предоставить примерный код для этого? – CordlessBrain

+0

Подсчитайте байты, которые вы пишете и остановитесь, например. 640 миллионов. Задайте JVM в текущее время в миллисекундах при запуске, а когда вы остановитесь и вычтите два числа, чтобы получить приблизительное значение количества милисекунд, вам потребовалось написать эти байты. Напишите это стандартно. –