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

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

У вас значит скрипт не чистый, а после шаловливых ручек...Не вижу проблемы внести изменения своими руками, для замени табуляции между = на пробел
 
Последнее редактирование модератором:
Корейцы скорее всего пользуются старым добрым поиском по строке. Т.е. где-то хранишь все эти строки "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
Вот я бы про это почитал. Я смотрел как клиент парсит датки (тоже самое по сути), там просто перебор строки был.

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х байтовому типу на стеке.

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

Для мастеров костылинга и говнокодинга есть \s в регулярных выражениях, который означает любой символ whitespace.

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

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

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

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

@ZubasticZubastic верифицированный пользователь., не я просто переписал загрузку, нпц и входа, чтобы пропускало вместо одного нпц, 100 и более, регулируемый параметр
 

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, нужно обновлять сертификаты.