|
|
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, К тому же, совершенно не понятно. ЗАЧЕМ это нужно. Один раз считать файл при загрузки приложение, что 0.5 сек, что 5 сек - роли большой иметь не должно. Нужна сверх скорость (близкая к ассемблеру) - перерабатывать постановку, делать нормальные форматы хранения данных и на диске и в памяти. Загонять миллионы объектов в LinkedList лично мне Java'у было бы жалко ))) Но я программировать учился на 286 с 1 Mb ОП и там ГИС писал (ГеоИнформационная система), т.ч. уже при словах LinkedList, миллион объектов мне компьютер и процессор жалко становится. Жалостливый я очень ))). Скажем так - всегда считал что это быстро , когда писал такой код - и не задумывался о том 0.5 или 5 сек. но когда решил проверить как такое же будет проходить в С++ или через простой awk - понял насколько медленно это делает JAVA ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 22:40 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Исходные данные: лям строк, 50 колонок, 421 Mb файл В общем, сильно зависит от heap'а. В пред. замерах при копи пасте кода автора ошибся, парсинг не шел. На СОВЕРШЕННО ПУСТОМ heap'е. Мой алгоритм 7 316 - 13 328 ms Старая реализация 7 174 - 10 077 ms На ЗАМУСОРЕННОМ heap'е. (результата предыдущего чтения файла остаются в памяти). Мой алгоритм 15 181 - 19 079 ms Старая реализация 18 856 - 19 914 ms Что и понятно ))) По результатам есть чувство: 1. что String.split написан на native коде. 2. Работа JIT компилятора штука совершенно не предсказуемая ((( Добавление вызова пустого метода внутрь цикла - резко портит скорость. 3. Разворачивания методов в inline JIT компилятор делает крайне странно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 22:42 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Насколько я помню по C++: все listы - бяки, деревья - еще большие бяки. Array'и намного лучше. Компактнее лежат в памяти, при больших объемах значительный выигрыш по памяти и соответственно по производительности. Такие задачи, обработка большого массива информации - сильно зависят от загаженности системы и настройки подсистемы памяти. IMHO (на истину не претендую): Если eden достаточный, то лишние объекты и копирование туда-сюда сильно больших проблем создавать не должно. А вот old-gen heap работает значительно медленнее. Для системы, если действительно нужно держать миллионы строк в памяти - я бы пытался хранить наиболее компактно. Java для этого, к сожалению, не самый лучший инструмент. ООП однако. Ну и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 22:50 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНу и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл?Да всякое бывает. Почитайте, например, чем занимается компания Splunk. У них как раз джавовский продукт, который должен максимально быстро перелопачивать именно текстовые данные. Ничего в этом странного нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 23:03 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev Ну и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл? Прилетел вам от клиента файл такого формата , строки с какой-то инфой разделенные табами... Ну удобно им в файл писать - в виде имя \t номер телефона \t дата \t почта \t адрес итд... и просят вас что то посчитать в этом файле - что то найти ... ну вот мне и интересно стало - показалось что медленно читает по строкам ... и действительно проверил : оставил только счетчик Код: java 1. 2. 3. 4. 5. 6. и аналогичный код на с++ через fopen и увидел что это в разы быстрее ... вот и задумался ... (Хотя к слову сказать - в C++ можно получить результаты отличающиеся в 2 раза - только используя более свежую версию компилятора, но в любом случае на порядок быстрее чем в java) чудеса. поэтому и решил спросить - так ли это ? может кто знает почему так медленно ? где тут потери? в чем ? на будущее чтобы знать ? и чтобы лучше понимать этот волшебный мир java ! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 23:09 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Всем спасибо! ответы тут : http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 23:29 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Atum1но когда решил проверить как такое же будет проходить в С++ или через простой awk - понял насколько медленно это делает JAVAAtum1и аналогичный код на с++ через fopen и увидел что это в разы быстрее ... Показывай полный код на java и полный аналогичный код на c++. P.S. Arrays.asList и так возвращает (фактически) ArrayList незачем здесь создавать ещё один ArrayList (и копировать в него все элементы..), readLine, split и LinkedList тоже плохие слова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 07:56 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПопробуй размер буфера побольше указать. Для больших файлов может помочь. В данном случае, для правильной оптимизации, ещё необходимо подобрать размер буфера кратный размеру строки в файле. При "неправильном" размере буфера эффект может оказаться отрицательным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 10:30 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
avp.mkПоказывай полный код на java и полный аналогичный код на c++. исходный файл на 1 млн строк вида ( размер порядка 65 Мб) : авторname date phone email cost Имя1 16.04.2014 07:16:15 79294595328 vrghjm0@gmail.com 110 Имя2 19.05.2014 06:48:26 79933782391 p25ghjgt1@ya.ru 23 имя2 08.06.2014 05:40:37 79812440379 h7ghgfh48@list.ru 15 ... JAVA лучшее время read file 899 ms Код: java 1. 2. 3. 4. 5. 6. 7. С++ 139 ms , компилятор gcc 4.7.2, ядро 3.2.0-4, debian 7, Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz total heap usage:1,000,023 allocs, 1,000,023 frees, 86,061,056 bytes allocated Код: plaintext 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. (Тут есть один нюанс - если читать в с++ файл построчно - не в массив ,то время будет в два раза лучше , чуть больше 65 ms) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 10:49 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Atum1 JAVA лучшее время read file 899 ms Код: java 1. 2. 3. 4. 5. 6. 7. Оформите в виде jmh бенча, иначе цифры ни о чем не говорят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 11:21 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
just_vladimirОформите в виде jmh бенча, иначе цифры ни о чем не говорят. тут все расписано ! http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly с 2008 года особо ничего не изменилось. Тему можно закрыть ! Всем спасибо за помощь и участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 11:26 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Atum1Leonid KudryavtsevНу и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл? Прилетел вам от клиента файл такого формата , строки с какой-то инфой разделенные табами... В чем принципиальный смысл требования "2-е секунды" ? Прилетел файл - обработали. 2 или 5 секунд думаю для оператора большой роли не играет. Если обработка на сервере и файлы летают туда-сюда... важна не абсолютная скорость, а возможность масштабирования решения, например возможность выполняться много-потокова на туевой куче процессоров... тут за Java Вы заплатите скоростью, но выиграете в простоте и отказоустойчивости (меньше багов) результирующего кода + поддержка со стороны application server'ов, плюс поддержка кодировок, плюс куча других плюшек Atum1Ну удобно им в файл писать - в виде имя \t номер телефона \t дата \t почта \t адрес итд... и просят вас что то посчитать в этом файле - что то найти ... Ну и нафига для того, что бы что-то подсчитать весь многомиллионный файл загонять в память. Пройтись, разпарсить, подсчитать. Тут Java и любое другое ООП-решение конечно будет резко проигрывать, просто за счет туевой кучи лишнего кода на абстракциях. Без ООП - банальный конечный автомат и почти нулевые требования по памяти (только буффер для чтения файла), при ООП - классы и создание объектов. При ООП подходе: Java обычно работает с память крайне быстро. Создание объектов в Java значительно БЫСТРЕЕ, чем в C++. Но и последующие проблемы с GC. Но здесь нужно память под приложение (не алгоритм, а приложение) настраивать. В продакшен системе крупного биллинга, после нормальной настройки eden области, у нас Full GC стал запускаться 2-а раза в сутки, вместо раз в 5-10 секунд. Но это нужно запускать JRE с нормальными настройками под задачу. AFAIK (выделение памяти замерял несколько лет назад, сейчас создавать тесты лениво). Задача создать в памяти 50 миллионов объектов, что бы было - совсем не понятна. Нафига? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 13:04 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Если метод подхватывается JIT-компилиром, время должно быть сравнимо. Если метод НЕ подхватывается JIT-компилиром, Java резко тормознутее. Что и понятно. Интерпретатор байт-кода. Куча и потери на GC. При миллионах строк и миллионах объектов - отнюдь не бесплатно. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 13:06 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Atum1Leonid KudryavtsevНу и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл? Прилетел вам от клиента файл такого формата , строки с какой-то инфой разделенные табами... Ну удобно им в файл писать - в виде имя \t номер телефона \t дата \t почта \t адрес итд... и просят вас что то посчитать в этом файле - что то найти ... ну вот мне и интересно стало - показалось что медленно читает по строкам ... Постановка немного абсурдна. Если вам "прилетел" файл - то пускай улетает обратно. В продуктиве нет таких постановок. В противном случае если "очень нуна" и срочно - бородатый unix-сисадмин возьмёт grep/sed/awk/find и найдет вам всё что нужно за приемлемое время. Если мощи утилит не хватит - то напишет на perl-е парсер. Всяко это будет быстрее чем делать в Java (Java проект - очень дорого стоит если стартовать его с нуля для подобных Превед-Медвед-миров). Кстати это (perl) должно быть отправной точкой при бенчмарках. В противном случае можно еще и усомниться в целесообразности Java вообще в подобной задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 13:38 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Я бы еще сказал, что еще крайне большая проблема - измерение производительности. Мною написанный парсер явно на JIT-компиляторе не компилировался. С учетом появившегося в 1.5 (не знал) class-data-sharing, любая сферическая реализация на стандартных классах в вакууме должна быть быстрее В продакшене, при загруженной системе и включившимся JIT-компиляторе, самопалный парсер должен ООП уделывать /надеюсь ))) / Плюс мониторинг/настройка JVM: память (раз в нее закачиваются больше объемы), JIT. ==== Задача поставлена сферически. Загнать файл (неизвестного объема!!!) в дебильную структуру в памяти. При дебильном формате файла (текст, х.з. что с кодировками, в задаче не уточнено). Нужна скорость, тогда в первую очередь: 1. Нормальный алгортм (для описанной задачи: пройтись один раз по файлу, разпарсить и обработать, сохранять в памяти и никакие LinkedList'ы даром не нужны). 2. Нормальные форматы хранения в памяти и на диске 3. Нормальная постановка, упрощение задачи. Универсальность решения VS самопал. Не универсально, но быстро. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:03 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Коллеги выкинтье из головы вообще все Arrays, Lists и вообще коллекции! У вас любая задача почему-то вырождается в Стебелёк! Занахрена вам вообще в памяти Java нужны эти гигбайтные списки и массивы? Что с ними дальше будете делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:08 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
LinkedList тут действительно не в тему - фичи, на которых он имеет преимущество (вставка и удаление в середине списка), по крайней мере, в приведенном коде, не используются. А вставка в конец и у ArrayList достаточно оптимально сделана, тем более, что можно сразу место зарезервировать, ориентируясь на размеры файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:10 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Для примера, создание и вставка 50 000 000 строк в LinkedList<String> и ArrayList<String>. На чистой 64 бит JVM. Наиболее показательны следующие вещи: 1. ОБЪЕМ который весь этот мусор занимает в памяти 2. Разница в объеме (компактность хранения) LinkedList vs ArrayList (> 20%) 3. Разница в скорости, при дефолтных параметрах JVM и запуск JVM с изначально выделенной памятью (!!!). Разница в скорость еще больше впечатляет, если смотреть на Task Manager ))), при дефолтных параметрах все мои 8 ядер под 100% заняты ))) Тестировал лет 10 назад, на ООП задачах (наплодить много объектов))) ), Java уделывает C++ ! Если бы C++ пример с парсингом в коллекцию был не такой сферический, не факт, что Java не вырвалась бы в отрыв AFAIK >java.exe -server -classpath .\classes test.CreateArray CreateArray time= 34488 totalMemory=6603407360 freeMemory=2434775960 usedMemory=4168631400 >java.exe -server -classpath .\classes -Xms8000m -Xmx8000m test.CreateArray CreateArray time= 6532 totalMemory=6873939968 freeMemory=2705308568 usedMemory=4168631400 >java.exe -server -classpath .\classes test.CreateList CreateList time=44889 totalMemory=7319060480 freeMemory=2230793400 usedMemory=5088267080 >java.exe -server -classpath .\classes -Xms8000m -Xmx8000m test.CreateList CreateList time=11226 totalMemory=6873939968 freeMemory=1785672888 usedMemory=5088267080 >java.exe -server -classpath .\classes -Xms12000m -Xmx12000m test.CreateList CreateList time=10848 totalMemory=12058624000 freeMemory=6970356920 usedMemory=5088267080 Кроме создания коллекции, еще и создаются 50 000 0000 строк через StringBuilder парой вложенных методов. Т.ч. в процессе создается и удаляется > 300 000 0000 StringBuilder'ов и куча промежуточных String. Записанные в файл, те же данные занимают "всего" 844 Mb /far/. Т.ч. осмысленность тащить для обработки большой объем данных в память - нет никакого. Потери (в том числе и времени) на хранения в виде "рыхлых" объектов, может быть больше, чем создания временных объектов в динамике. (Java ОЧЕНЬ быстро создает объекты, если JVM и GC работает в комфортном режиме). IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:37 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
А дальше-то что с данными происходит? Если только просмотр-анализ можно же просто прочитать весь файл одной длинной строкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 16:08 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Atum1avp.mkПоказывай полный код на java и полный аналогичный код на c++. исходный файл на 1 млн строк вида ( размер порядка 65 Мб) : авторname date phone email cost Имя1 16.04.2014 07:16:15 79294595328 vrghjm0@gmail.com 110 Имя2 19.05.2014 06:48:26 79933782391 p25ghjgt1@ya.ru 23 имя2 08.06.2014 05:40:37 79812440379 h7ghgfh48@list.ru 15 ... JAVA лучшее время read file 899 ms Код: java 1. 2. 3. 4. 5. 6. 7. С++ 139 ms , компилятор gcc 4.7.2, ядро 3.2.0-4, debian 7, Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz total heap usage:1,000,023 allocs, 1,000,023 frees, 86,061,056 bytes allocated Код: plaintext 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. (Тут есть один нюанс - если читать в с++ файл построчно - не в массив ,то время будет в два раза лучше , чуть больше 65 ms) Я может чего то не понимаю, как bufferedreader может быть быстрее filechannel? Вы не ошиблись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 16:10 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
ОзверинЯ может чего то не понимаю, как bufferedreader может быть быстрее filechannel? Вы не ошиблись? filechannel быстрее bufferedreader . (кажется по ссылке что я указал это как раз и описано ) а можно увидеть код построчного чтения файла? можно ли читать файл исключительно по следовательно по одной строке? (может быть через randomaccessfile) сразу обрабатывая текущую строку и переходя на след. не создавая буферов, массивов строк , коллекций итд ... будет ли это быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 22:28 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Atum1а можно увидеть код построчного чтения файла? Ничего интересного. ReadLine использует посимвольное чтение из буфера символов char[] cb в цикле и накапливает строку в StringBuffer. Кстати это яркий пример реализации конечного автомата. У него есть состояния. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/BufferedReader.java#BufferedReader.readLine(boolean) можно ли читать файл исключительно по следовательно по одной строке? (может быть через randomaccessfile) сразу обрабатывая текущую строку и переходя на след. не создавая буферов, массивов строк , коллекций итд ... будет ли это быстрее? Можно. Но при этом мы теряем возможность работать с канальными устройствами (stdin, pipes e.t.c) т.к. "режим открывания" файла становится более жёстким. Думаю что быстрее не будет. Вообще дисковый интерфейс спроектирован так что на любой чих HDD читает или пишет сектор (512 байт) или более крупный блок информации в зависимости от типа устройства. Поэтому чтение избирательными порциями - безсмысленно. Оно не приводит к особому убыстрению. Для вычитки строк можно просто вычитать "на будущее" char[] буфер поболее и работать с ним как в BufferedReader. Вычитывание по символам или по байтам - это просто софтварная надстройка на уровне OS API. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 23:01 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Самое интересное, что попытка в своем классе сделать простейший конечный автомат дает ужасную производительность. При этом все стопориться на if... или на switch.... Добавление даже одного if в код, тут же посимвольную обработку _резко_ замедляет ((( Теоретически, вроде все понятно. Практически, за 2-а дня я на самодельном конечном автомате только достиг скорости исходного алгоритма (правда при _значительно_ меньшем потребности к выделению на куче и к GC) при значительно большей простоте алгоритма (минус все преобразование символов, никаких StringBuilder'ов). В общем JIT-компилятор штука загодочная. Несмотря на то, что -XX:+PrintCompilation и -XX:+PrintInlining уверяют, что весь код откомпилирован. Рантайм библиотеки работают быстрее (или так же) самопального конечного автомата. Хотя... это теоретически... практически задача ИМХУ - сферический конь в вакууме. Чем скорость решения со split автора не устраивает - не понятно. Хотя, у него скорее всего вообще все на GC может стоять колом. У меня за 1.8-2 сек файл в 844 Mb парсится (без сохранения в LinkedList, только до String[]) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 23:35 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
Думаю что здесь уже нельзя достичь больше производительности по той простой причине что мы играем по правилам реализации java.lang.String. Можно было-бы читать byte[] договорившись что рассматриваем single-byte encoded file но на выхлопе не сможем получить String. Или сможем но опять будет трансформация кодировки со всеми накладными расходами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2014, 00:01 |
|
||
|
Быстрое чтение и разбор файла
|
|||
|---|---|---|---|
|
#18+
maytonДумаю что здесь уже нельзя достичь больше производительности по той простой причине что мы играем по правилам реализации java.lang.String. Можно было-бы читать byte[] договорившись что рассматриваем single-byte encoded file но на выхлопе не сможем получить String. Или сможем но опять будет трансформация кодировки со всеми накладными расходами.Без понимания того, в какой кодировке приходит файл, как он затем должен быть обработан и что впоследствии должно получиться, действительно можно гадать о том как улучшить производительность. Вполне может статься, что данные приходят в Win1251 кодировке, поэтому просто byte[] чтение с приведением к char[] вполне может решить исходную задачу. Но это как говорится только автору известно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2014, 07:22 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38564797&tid=2123129]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 331ms |

| 0 / 0 |
