MailRuChamps / raic-2020

GNU General Public License v3.0
26 stars 27 forks source link

ввод-вывод занимает бОльшую часть времени стратегии #86

Open ViktorcArmius opened 3 years ago

ViktorcArmius commented 3 years ago

смотрим на игру https://russianaicup.ru/game/view/34159, на вывод меня (игрок cArmius)

`stdout:

stderr:

в чём подвох? в том, что это ПУСТАЯ стратегия. Она не делает ничего, кроме как принимает входные данные, и при этом занимает уже половину от всего доступного времени.

нужно что-то сделать с расчётом времени для стратегии, сейчас это режет потенциальное время стратегии до невыносимо малого значения

deadln commented 3 years ago

Если я правильно понимаю значение слова "пустая", то TL вполне закономерный. Сервер ждёт что программа пришлёт ответ в виде словаря действий, в итоге ничего не получает и выбрасывает TL.

ViktorcArmius commented 3 years ago

пустая в том смысле что она сразу по вызову отвечает пустое действие

deniskolsanov commented 3 years ago
 @staticmethod
 def read_from(stream):
        id = stream.read_int()
        if stream.read_bool():
            player_id = stream.read_int()
        else:
            player_id = None
        entity_type = EntityType(stream.read_int())
        position = Vec2Int.read_from(stream)
        health = stream.read_int()
        active = stream.read_bool()

Большую часть времени съедает чтение entity, некоторые писали что это из за игровых констант, но их там и на 150 байт не наберется, а entity все вместе занимают от 10к байт. Что можно сделать? Я думаю лучше всего сделать константным размер entity, убрать bool наличия player_id, либо читать Int не зависимо от наличия player_id. Тогда можно будет прочитать весь буфер entity разом и преобразовать его в массив uint8 при помощи uints = np.frombuffer(buffer, dtype=np.uint8) далее извлекать

it += 1
uint = uints[it] + (uints[it+1] << 8) + (uints[it+2] << 16) + (uints[it+3] << 24)

Выглядит не очень, но других способов я не нашел, а этот дает ускорения примерно в 5 раз

viktorov-aa commented 3 years ago

Неистово плюсую. Берешь Python, не написал ни строчки кода, получаешь со старта дебаф -30-50% времени. Python и так не быстрый, а тут такое. Я бы просто для всех языков к кол-ву тиков накинул вот это вот время работы пустой стратегии. То есть C++ получит 20500 , а Python 30000 например.

Это было бы справедливо для всех ЯП, ИМХО.

PS То есть выбирая Python я понимаю, что мой код будет работать медленнее. Но сейчас замедление дает не мой код, и это крайне неприятно.