Почему моя процедура потокового копирования постоянно ухудшается в производительности - PullRequest
3 голосов
/ 19 марта 2019

Этот код работает медленнее и медленнее при копировании больших файлов.Я делаю что-то не так?

    InputStream ms2 = new BufferedInputStream(new FileInputStream("/home/fedd/Videos/homevid.mp4"));
    OutputStream fos2 = new BufferedOutputStream(new FileOutputStream("testfile2.mp4", true));

    try {
        int byt;
        int i = 0;
        long time = System.currentTimeMillis();
        while ((byt = ms2.read()) != -1) {
            fos2.write(byt);
            i++;
            if (i > 100000) {
                i = 0;
                long took = System.currentTimeMillis() - time;
                System.out.println("100000 bytes took " + took + " milliseconds which means " + (100000000 / took) + " bytes per second");
            }
        }
        fos2.close();
        ms2.close();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

Мой Java:

openjdk 10.0.2 2018-07-17 Среда выполнения OpenJDK (сборка 10.0.2 + 13-Ubuntu-1ubuntu0.18.04.4)

Виртуальная 64-разрядная серверная виртуальная машина OpenJDK (сборка 10.0.2 + 13-Ubuntu-1ubuntu0.18.04.4, смешанный режим)

Ответы [ 2 ]

6 голосов
/ 19 марта 2019

Вам необходимо сбрасывать базовое «время» после каждого сравнения.Попробуйте использовать это:

if (i > 100000) {
    i = 0;
    long took = System.currentTimeMillis() - time;
    time = System.currentTimeMillis();
    System.out.println("100000 bytes took " + took + " milliseconds which means " + (100000000 / took) + " bytes per second");
}
5 голосов
/ 19 марта 2019

Ваша производительность ухудшается, потому что ваш расчет неверен.Для второго чанка вы вычисляете количество байтов в секунду из размера второго чанка, но по времени обоих чанков.Попробуйте добавить time = System.currentTimeMillis(); после long took = ...

...