Микровыключатель выводит высокие колебания - PullRequest
0 голосов
/ 16 февраля 2012

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

    FileInputStream fis = new FileInputStream("/path/to/binary/file");
    BufferedInputStream in = new BufferedInputStream(fis);

    FileOutputStream fos = new FileOutputStream("/path/to/save/new/binary/file");
    BufferedOutputStream out = new BufferedOutputStream(fos);

    long before = System.currentTimeMillis();
    int data = 0;

    while ((data = in.read()) != -1) {
        out.write(data);
    }

    in.close();
    out.close();

    int seconds = (int) (System.currentTimeMillis() - before / 1000) % 60;

    System.out.println("Took " + seconds);

Буферизованный или небуферизованный вывод, где-то от 3 до 64 мс.Я бы ожидал более близкого диапазона, скажем, 40-50 или 10-20 или 30-40.В чем причина этого сильного колебания?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

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

Повысьте значимость ваших измерений, выполнив следующие шаги.

  • Запуск нескольких тестов за один раз.
  • Использование System # nanoTime () для измерений.
0 голосов
/ 16 февраля 2012

Файловый ввод / вывод может включать много «случайностей»:

  • Это системный вызов, поэтому вы в основном ждете, пока планировщик ввода-вывода решит обработать ваш запрос
  • Это может быть на жестком диске, который требует времени для чтения с
  • Может кэшироваться в памяти, что быстро (э-э)
  • Какой-то другой процесс может выполнять тяжелый ввод / вывод
  • Какой-то другой процесс может монополизировать процессор

Посмотрите на cheeken советы о том, как с этим справиться.

...