Java Код резко снижает скорость с течением времени - PullRequest
0 голосов
/ 26 мая 2020

Я написал относительно простую Java программу, которая берет папку с изображениями, отбирает 2000 пикселей из каждой и отделяет цветные изображения от полутоновых. Общий код, который я использовал для каждого изображения (немного упрощенный и не обязательно полный, но основные части уже есть):

BufferedImage img = ImageIO.read([some File]);
int[] pix = new int[img.getWidth() * img.getHeight()];
pix = img.getRGB(0, 0, img.getWidth(), img.getHeight(), pix, 0, img.getWidth());
//Check 2000 values. If one color pixel is detected, rename the file to a new folder
pix = null;
img = null;
//Repeat for the next image file

Когда я отслеживаю производительность этого кода, я замечаю, что скорость резко падает после обрабатывается примерно 1000 файлов изображений (все изображения сопоставимы). Фактически, профиль скорости, по сути, показывает период нарастания, период максимальной производительности, а затем внезапное падение и производительность, подобную улитке. В частности, программа начинается с обработки около 40 изображений в секунду, увеличивается до 120 изображений в секунду, а затем, когда в общей сложности обрабатывается около 1000 изображений, уменьшается до 8 или меньше.

Насколько я могу скажите, использование ресурсов этой программы должно быть относительно постоянным. Он использует только 1 поток (за исключением потока, который я использовал для мониторинга производительности) и хранит очень ограниченное количество целочисленных переменных. Я даже go включил утверждения, показывающие, что pix и img имеют значение null после использования на всякий случай, если сборщик мусора этого не заметит.

Программа ведет себя так, как будто она хранит BufferedImages в куче и не выпускать их так быстро, как нужно. Действительно, диспетчер задач Windows показывает, что использование ОЗУ увеличивается, а затем достигает пика (хотя время не согласовано, оно достигает пика раньше, чем скорость падает). Есть ли у кого-нибудь предложения о том, почему происходит это дросселирование? Я благодарен всем, кто нашел время, чтобы прочитать мой вопрос, и благодарю вас за ваши ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...