Парсинг PTS скиллов

ну и не стоит забывать, что parseInt:int(примитив), а valueOf:Integer(объект), при этом valueOf(int):Integer использует parseInt(String):int.

В общем, после нескольких суток танцев с бубном, когда вроде бы как все должно было заработать, выяснилось - что некоторые скиллы записаны без соблюдения шаблона. То есть, например 1298 (Масс Слоу) имеет параметр cast_range=500. только вот перед знаком "=" стоит \t. Соответственно мой ̶с̶у̶п̶е̶р̶_̶к̶л̶а̶с̶с̶н̶ы̶й̶_̶п̶а̶р̶с̶е̶р̶ ломается к е**ням. Как корейцы парсят это дерьмо?
У вас значит скрипт не чистый, а после шаловливых ручек...Не вижу проблемы внести изменения своими руками, для замени табуляции между = на пробел:)
 
Последнее редактирование модератором:

В общем, после нескольких суток танцев с бубном, когда вроде бы как все должно было заработать, выяснилось - что некоторые скиллы записаны без соблюдения шаблона. То есть, например 1298 (Масс Слоу) имеет параметр cast_range=500. только вот перед знаком "=" стоит \t. Соответственно мой ̶с̶у̶п̶е̶р̶_̶к̶л̶а̶с̶с̶н̶ы̶й̶_̶п̶а̶р̶с̶е̶р̶ ломается к е**ням. Как корейцы парсят это дерьмо?
Корейцы скорее всего пользуются старым добрым поиском по строке. Т.е. где-то хранишь все эти строки "skill_name", "skill_id" и т.д. и вместо сплита по \t начинаешь для каждой строчки выискивать каждый из параметров. Получение значения тоже примерно так: поиск по "=", задаем начало для чтения значения, отбрасывая лишние символы (судя по всему первым символом может быть "[", "{", цифра или латиница. С окончанием чтения значения тоже аналогично. Единственный момент - комментарии: либо избавляться от них перед парсингом, либо же сделать проверку, является ли найденная строка комментарием.

Хотя возможно они читают все же посимвольно. В таком случае с комментариями чуть проще в плане того, что задается метка isComment и если она true, значит просто игнорим, пока не дойдем до */.
 
Последнее редактирование:
skill_data := {skill}
skill := 'skill_begin' {param} 'skill_end' new-line
param := word '=' value
struct := '{' [value {;' value}] '}'
value := number | string | word | struct
string := '[' {any-char-except-newline} ']'
word := letter {allowed-word-char}
number := ['-'] digit {digit} ['.' digit {digit}]

Не включая коментарии, но коментарии можно лексером отбросить, это не большая проблема, как отдельные токены.

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

В птс использует yacc, можно выдрать правила, из таблицы строк просто в ida.

забыл учесть ссылочные типа начинающиеся с @
но это простое правило
value = number | word | reference | string | struct
....
reference = '@' word
 
Последнее редактирование модератором:
птс с4 загрузка 2 минуты сервер + нпц
 
  • Мне нравится
Реакции: risi
skill_data := {skill}
skill := 'skill_begin' {param} 'skill_end' new-line
param := word '=' value
struct := '{' [value {;' value}] '}'
value := number | string | word | struct
string := '[' {any-char-except-newline} ']'
word := letter {allowed-word-char}
number := ['-'] digit {digit} ['.' digit {digit}]

Не включая коментарии, но коментарии можно лексером отбросить, это не большая проблема, как отдельные токены.

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

В птс использует yacc, можно выдрать правила, из таблицы строк просто в ida.
Вот я бы про это почитал. Я смотрел как клиент парсит датки (тоже самое по сути), там просто перебор строки был.

PTS hf от AdvExt тоже так грузит npc
Это привет fastenterworld. Но на стоке есть свои баги.

птс с4 загрузка 2 минуты сервер + нпц
А можно поглядеть? Интересно как добился этого (ну вангую перенос многопоточной загрузки нпс сервера с финала+).
 
Последнее редактирование модератором:
My eyes is bleeding. Вы тут совсем охренели, спеки хотя бы почитали перед тем, как писать.

данные которые помещаются в byte/short и не переходят в int, сидят в byte/short...
Иди и учи спеки JVM. Твои byte/short будут подвержены выравниванию и они будут занимать в любом случае 4 байта. Ах да, можно еще почитать спецификацию байткода JVM, очень рекомендую, для ознакомления, какой байткод есть для работы с такими типами данных и какой есть для работы с int. Откроешь много нового для себя, что многие операции с byte/short автоматически кастуют значение к 4х байтовому типу на стеке.

Как корейцы парсят это дерьмо?
Целых 0.0001 секунды при старте сервера мало, что дадут.
Насколько я помню, он просто идет по строке.
Там используются лексеммы. ANTLR или похожее дерьмо в помощь. Об этом уже писали выше.

В общем, после нескольких суток танцев с бубном, когда вроде бы как все должно было заработать, выяснилось - что некоторые скиллы записаны без соблюдения шаблона. То есть, например 1298 (Масс Слоу) имеет параметр cast_range=500. только вот перед знаком "=" стоит \t.
Для мастеров костылинга и говнокодинга есть \s в регулярных выражениях, который означает любой символ whitespace.

Ведь он умеет ложить значения -128 127 в кэш, не копируя каждый раз.
Размер кеша меняется через параметр JVM. Можно увеличить и вообще все делать через это redlol.

ПТС с НПС за 29 секунд? мммм) что-то новенькое. Как добились успеха?)
Многопоточная загрузка сервера. Поддерживается с GF и выше, настраивается в конфигах.

gattsu особый респект, хоть кто-то написал, как это делается нормально и как оно сделано в ретейле, в сравнении с остальными.
 
Иди и учи спеки JVM. Твои byte/short будут подвержены выравниванию и они будут занимать в любом случае 4 байта. Ах да, можно еще почитать спецификацию байткода JVM, очень рекомендую, для ознакомления, какой байткод есть для работы с такими типами данных и какой есть для работы с int. Откроешь много нового для себя, что многие операции с byte/short автоматически кастуют значение к 4х байтовому типу на стеке.
На сколько я понимаю, это если будет 1-3 byte, а так то 4 byte(2 short) == 1 int, тоесть 20(как раз мой случай) полей byte будут занимать как 5 int, преобразование в int/long происходит при арифметических операциях.
Я в JVM деревянный, на опытного программиста не претендую, по этому в любом случае спасибо за здравую критику:)

Размер кеша меняется через параметр JVM. Можно увеличить и вообще все делать через это redlol.
Если я верно понимаю, то это актуально только в случае использования Integer, а если нам нужен int и темболее мы его парсим из String, это бессмысленная операция.
 
Последнее редактирование:
Для гонки перфоманса, берем построковое чтение, делаем пул потоков, которые будут парсить строки и все.

Zubastic, не я просто переписал загрузку, нпц и входа, чтобы пропускало вместо одного нпц, 100 и более, регулируемый параметр
 
Если я верно понимаю, то это актуально только в случае использования Integer, а если нам нужен int и темболее мы его парсим из String, это бессмысленная операция.

Ubuntu 16.10 Intel i7 8th
# VM version: JDK 1.8.0_151, VM 25.151-b12
Значение: 50
Benchmark Mode Cnt Score Error Units
IntegerBenchmark.testParseInt avgt 5 4.114 ± 0.054 ns/op
IntegerBenchmark.testValueOf avgt 5 4.849 ± 0.014 ns/op

Значение: 1
Benchmark Mode Cnt Score Error Units
IntegerBenchmark.testParseInt avgt 5 2.692 ± 0.055 ns/op
IntegerBenchmark.testValueOf avgt 5 2.706 ± 0.062 ns/op

Setting
@Fork(value = 1, jvmArgs = { "-server" })
@Warmup(iterations = 5)
@BenchmarkMode(value = { Mode.AverageTime })
@Measurement(iterations = 5)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)

p.s. В наличии есть 9 апдейт явы, не хочет вставать на ubuntu, нужно обновлять сертификаты.
 
Назад
Сверху Снизу