evgeniy8705
@evgeniy8705
Повелитель вселенной

Как оптимизировать фильтр потоков ввода вывода?

Написал метод который будет фильтровать входной поток от нулей и будет записывать отфильтрованные данные в выходной поток (в файл).

Можно ли как то увеличить скорость работы данного метода? Почитал про буфферизированные потоки и сжатие GZIP, но чет скорость примерно такая же остается, бывает даже больше. Хотя по идеи GZIP должен сжимать хорошо, так как данные двух типов, либо 0, либо 1.

Подскажите пожалуйста, может быть я как то не так использовал данные декораторы. Как можно ускорить данный метод?

И еще вопрос. Я использовал для чтения метод read с параметром буффера, сам создавал массив для буфферизации. Это тоже самое что и использовать декоратор BufferedInputStream()?

import java.io.*;
import java.util.Arrays;
import java.util.Random;

public class App {
    public static void main(String[] args) throws IOException {
        byte[] arr = new byte[10000];

        for (int i = 0; i < arr.length; i++) {
            arr[i] = (byte) (Math.random() * 2);
        }

        try (InputStream is = new ByteArrayInputStream(arr); OutputStream fos = new FileOutputStream("c://outfile.txt")) {
            long startTime = System.nanoTime();

            Filters.zeroFilter(is, fos, 1024);

            long deltaTime = System.nanoTime() - startTime;

            System.out.println("Скорость работы: " + deltaTime); // примерно 10.000.000
        }

        try (InputStream is = new ByteArrayInputStream(arr)) {
            int value;

            while ((value = is.read()) != -1) {
                System.out.print(value);
            }
        }
    }
}

class Filters {
    public static void zeroFilter(InputStream src, OutputStream dst, int buffSize)  throws IOException {
        final byte STATE_ZERO = 0;
        final byte STATE_NUMBERS = 1;

        int count;
        byte[] buffer = new byte[buffSize];

        while ((count = src.read(buffer)) != -1) {
            byte state = STATE_ZERO;
            int fromIndex = -1;

            for (int index = 0; index < count; index++) {
                byte elem = buffer[index];

                switch (state) {
                    case STATE_ZERO:
                        if (elem == 0) {
                            state = STATE_ZERO;
                        } else {
                            state = STATE_NUMBERS;

                            fromIndex = index;
                        }

                        break;
                    case STATE_NUMBERS:
                        if (elem == 0) {
                            state = STATE_ZERO;

                            dst.write(Arrays.copyOfRange(buffer, fromIndex, index));
                        } else {
                            state = STATE_NUMBERS;
                        }
                }
            }

            if (state == STATE_NUMBERS) {
                dst.write(Arrays.copyOfRange(buffer, fromIndex, buffer.length));
            }
        }
    }
}
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 1
AxianLTD
@AxianLTD
У вас запись в цикле по элементам. Вынесите за пределы цикла по index. Добавьте для этого выходной буфер.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы