Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Медленный код, как найти узкое место? / 17 сообщений из 17, страница 1 из 1
02.04.2016, 10:35
    #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
02.04.2016, 10:46
    #39206557
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
Я бы попробовал StringBuffer - append вместо += для склеивания строк. Не думаю, что радикально, но хоть немного поможет...
...
Рейтинг: 0 / 0
02.04.2016, 10:48
    #39206558
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
...
Рейтинг: 0 / 0
02.04.2016, 10:53
    #39206561
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
Hett,
можно попробовать распараллелить типа disruptora
...
Рейтинг: 0 / 0
02.04.2016, 10:58
    #39206564
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
Vladimir BaskakovЯ бы попробовал StringBuffer - append вместо += для склеивания строк. Не думаю, что радикально, но хоть немного поможет...

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

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

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

и еще, тут readline - довольно слабое место, в нем тоже есть копирование. Большие файлы лучше так не обрабатывать.
...
Рейтинг: 0 / 0
02.04.2016, 15:03
    #39206635
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
автору него матчер выключается после первого мача и включается снова после встречи class_end.
это наводит на мысль, что большую часть времени мачер выключен и проблема не в нем, хотя конечно зависит от данных
Именно так.
Всего там 12 тыс классов примерно идут друг за другом, так что матчер срабатывает относительно редко.
А нельзя какой-то профайл посмотреть, какая строчка сколько выполнялась суммарно?
...
Рейтинг: 0 / 0
02.04.2016, 15:57
    #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
02.04.2016, 16:37
    #39206672
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
Так больше нечему было. А там с конкатенацией - неявное создание и освобождение объектов.
...
Рейтинг: 0 / 0
04.04.2016, 17:57
    #39207788
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
HettТекстовый файл 11 млн строк, обрабатывается минут 15.
HettСделал так: ... Теперь секунд за 7 выполняется.
Хренасе разница! о_О
Простите меня за мой французский :)
...
Рейтинг: 0 / 0
04.04.2016, 19:40
    #39207868
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
А может быть такое, что файл закэшировался на уровне ОС ?
...
Рейтинг: 0 / 0
04.04.2016, 23:16
    #39207952
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
UsmanА может быть такое, что файл закэшировался на уровне ОС ?
не, это реальная разница
...
Рейтинг: 0 / 0
05.04.2016, 10:05
    #39208105
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
Подозреваю, что у него currentClassData вырастает до мегабайтов и/или десяток-сотен мегабайт. А он его на каждой итерации туда-сюда.
...
Рейтинг: 0 / 0
05.04.2016, 21:13
    #39208770
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный код, как найти узкое место?
Там всего 440 мегабайт файл. В нем 12000 классосв, некоторые пустые, некоторые большие, может мегабайт максимум.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Медленный код, как найти узкое место? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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