powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Медленный код, как найти узкое место?
17 сообщений из 17, страница 1 из 1
Медленный код, как найти узкое место?
    #39206552
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текстовый файл 11 млн строк, обрабатывается минут 15. Как найти узкое место?


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    public static void loadClasses(BufferedReader br, Boolean log) throws IOException {
        String s;
        Pattern openClassPattern = Pattern.compile("class \\d+ (\\w+) : [\\w()]+");

        String currentClassName = "";
        String currentClassData = "";
        boolean classIsOpen = false;

        while ((s = br.readLine()) != null) {
            if(!classIsOpen) {
                Matcher openClassMatcher = openClassPattern.matcher(s);
                if (s.length() > 5 && openClassMatcher.matches()) {
                    //open class
                    currentClassName = openClassMatcher.group(1);
                    classIsOpen = true;
                }
            }

            currentClassData += s + "\r\n";

            if (s.equals("class_end")) {
                classes.put(currentClassName, currentClassData);
                if(log)
                    System.out.println("Found class " + currentClassName);
                currentClassData = "";
                currentClassName = "";
                classIsOpen = false;
            }
        }
    }
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206557
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы попробовал StringBuffer - append вместо += для склеивания строк. Не думаю, что радикально, но хоть немного поможет...
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206558
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206561
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,
можно попробовать распараллелить типа disruptora
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206564
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovЯ бы попробовал StringBuffer - append вместо += для склеивания строк. Не думаю, что радикально, но хоть немного поможет...

У меня был опыт,правда не на андроиде а на большой java...
StringBuffer именно радикально решила проблему с производительностью.
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206595
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,
регулярные выражения стоят относительно дорого, я бы попробовал написать код без нид них.
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206597
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще для поиска узких мест нужно пользоваться профайлером.
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirА вообще для поиска узких мест нужно пользоваться профайлером.
Уже есть бухтелка в адрес профайлера. От Романа Елизарова. Вот нагуглю - приаттачу.

Профайлер нужен когда у вас есть очень много кода и вы ничего не знаете о метриках отклика.
В данном примере System.nanoTime() будет точнее и юзабельнее. Есть точка входа и точка
выхода и 1 цикл с циклическим исполнением .matcher() который может и является основным
тормозом.
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206626
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у него матчер выключается после первого мача и включается снова после встречи class_end.
это наводит на мысль, что большую часть времени мачер выключен и проблема не в нем, хотя конечно зависит от данных

помимо StringBuilder можно предложить вместо s.equals("class_end") сначала сравнивать hashcode, и только потом equals

и еще, тут readline - довольно слабое место, в нем тоже есть копирование. Большие файлы лучше так не обрабатывать.
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206635
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автору него матчер выключается после первого мача и включается снова после встречи class_end.
это наводит на мысль, что большую часть времени мачер выключен и проблема не в нем, хотя конечно зависит от данных
Именно так.
Всего там 12 тыс классов примерно идут друг за другом, так что матчер срабатывает относительно редко.
А нельзя какой-то профайл посмотреть, какая строчка сколько выполнялась суммарно?
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206654
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
    public static void loadClasses(BufferedReader br, Boolean log) throws IOException {
        String s;
        Pattern openClassPattern = Pattern.compile("class \\d+ (\\w+) : [\\w()]+");

        String currentClassName = "";
        StringBuilder currentClassData = new StringBuilder();
        boolean classIsOpen = false;

        while ((s = br.readLine()) != null) {
            if(!classIsOpen) {
                Matcher openClassMatcher = openClassPattern.matcher(s);
                if (s.length() > 5 && openClassMatcher.matches()) {
                    //open class
                    currentClassName = openClassMatcher.group(1);
                    classIsOpen = true;
                }
            }

            currentClassData.append(s);
            currentClassData.append("\r\n");

            if (s.equals("class_end")) {
                classes.put(currentClassName, currentClassData.toString());
                if(log)
                    System.out.println("Found class " + currentClassName);
                currentClassData.setLength(0);
                currentClassName = "";
                classIsOpen = false;
            }
        }
    }



Теперь секунд за 7 выполняется. Все таки узким местом была конкатенация строк :)
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39206672
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так больше нечему было. А там с конкатенацией - неявное создание и освобождение объектов.
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39207788
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettТекстовый файл 11 млн строк, обрабатывается минут 15.
HettСделал так: ... Теперь секунд за 7 выполняется.
Хренасе разница! о_О
Простите меня за мой французский :)
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39207868
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может быть такое, что файл закэшировался на уровне ОС ?
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39207952
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanА может быть такое, что файл закэшировался на уровне ОС ?
не, это реальная разница
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39208105
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подозреваю, что у него currentClassData вырастает до мегабайтов и/или десяток-сотен мегабайт. А он его на каждой итерации туда-сюда.
...
Рейтинг: 0 / 0
Медленный код, как найти узкое место?
    #39208770
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там всего 440 мегабайт файл. В нем 12000 классосв, некоторые пустые, некоторые большие, может мегабайт максимум.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Медленный код, как найти узкое место?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]