Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ViktorcArmius opened this issue Dec 5, 2020 · 4 comments

Comments

@ViktorcArmius
Copy link

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

`stdout:

stderr:

  • cd /output
  • python ./main.py gameserver 31003 004ae697d3038f89c2546c116b131b3681cc45b0_2
    Exit code:0
    Memory used: 8MB
    Consumed time: 20052
    `

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

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

@deadln
Copy link

deadln commented Dec 5, 2020

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

@ViktorcArmius
Copy link
Author

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

@deniskolsanov
Copy link

deniskolsanov commented Dec 6, 2020

 @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
Copy link

viktorov-aa commented Dec 7, 2020

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants