1k speedup
Transcript of 1k speedup
1000X SPEEDUPAnton Pleshivtsev
AGENDA
ARCHITECTURE
TWO KINDS
• Classic
• Authoritative
CLASSIC
Client
Client Client Client
t
AUTHORITATIVE
Server
Client
Client Client
Client
FINITE-STATE MACHINE
State 1
State 2
State 3
Message 1 Message 2
DATA FLOW
t
Build
!
S1
Building…
S2
S1 S2 S2 S2
GAME PROBLEM
GAME MAPPlayer 1 Player 2
Player 3 Player 4
Player 5 Player 6
Player 7 Player 8
King 1 King 2
PLAYER SLOT
Wave respawn
Player respawn
~ 36 enemies
~ 20 allies
GAME WORLD OBJECT
(36 + 20) * 8 * 500 B = 224 KB
SMALL CHANGE PROBLEM
{time: 1,phase: ‘build’,units: […],players: […],projectiles: […]}
{time: 2,phase: ‘build’,units: […],players: […],projectiles: […]}
JSON PATCH
[ { "op": "replace", "path": "/baz", "value": "boo" }, { "op": "add", "path": "/hello", "value": ["world"] }, { "op": "remove", "path": "/foo"}]
DEEP MEGRE
{time: 1,phase: ‘build’,units: […],players: […],projectiles: […]}
{time: 2,phase: ‘build’,units: […],players: […],projectiles: […]}
{time: 2}
PROGRAM FLOWWar calculation
Deep copy
Diff
Compression
PROGRAM FLOW (UNICORN WORLD)
t
100ms 400ms200ms 300ms
War State 1 S2 S3 S4
PROGRAM FLOW (REAL WORLD)
t 100ms 400ms200ms 300ms
War State 1 War State 2
Rubbers
PROFILINGWar calculation
Deep copy
Diff
Compression
60%
5%
30%
5%
Math
Structures
Structures
C binding
PYTHON
0
40
80
120
160
Python
PYTHONSPEEDUP
PYPY
PYPY
0
40
80
120
160
Python Pypy
2.6X
PYPY PROBLEM
0
30
60
90
120
100 200 300 400 500 600 700 800 900 1000 1100 1200 1300
WTF?
CYTHON
• Python -> C *.so module
• Optional types
CYTHON
0
40
80
120
160
Python Pypy Cython
2.6X 3.5X
GO
• Static types
• 10x speedup by default
GO
0
40
80
120
160
Python Pypy Cython Go
2.6X 3.5X 80X
SCALA + AKKA?
GO
• Reflect(((
• Opensource problems (ex. websocket)
• Races (ex. maps)
NEXT FEATURES
• Abilities - f(unit, world)
• Projectiles - f(unit1, unit2, world)
PROFILING
War calculation
Deep copy
Diff
Compression
2%
6%
90%
2%
Math
Structures
Structures
C binding
60%
30%
Python Go
5%
5%
GEN DIFF
3. ХОД КОНЕМ - мы вернулись к питону, с которого мы начинали и написали на питоне код, который нам генерит код на го, который генерит диффер
DIFF VS GEN_DIFF
0
15
30
45
60
Reflect_diff Gen_diff
20X
NO WEB SOCKET COMPRESSION 6. Проблема 1 - отсутствие
компрессии в диффере. Проблема большая, народ уже год ждет компрессии в вебсокете на го. Пришлось прочитать RFC по вебсокету и реализовать (в issue есть вознаграждение 100 баксов за фичу, но что такое 100 баксов у них и что у нас) 7. Мы реализовали свою компрессию lzma, местами даже лучше zip (забавно, но в unity нет поддержки zip, поэтому пришлось брать экзотический lzma) 8. Сложный баг с непонятным исключением. Оказалось, второй бит пожатого пакета надо менять на 1. Не спрашивайте, как я это обнаружил.
WEB SOCKET COMPRESSION
• 2 libs
• LZMA
• Strange exception
JSON MODULE
9. JSON-кодировщик го не умеет кодировать словари, ключи которого численного типа. (Автор сказал, что это противоречит спецификации). В отместку автору json-кодировщика мы форкнули его проект и добавили кодирование числовых ключей
JSON
• map[int] encoding
• float 3.00000001 -> 3.0
CONCLUSION
0
40
80
120
160
Python Pypy Cython Go Go + Gendiff
2.6X 3.5X 80X 1600X
CONCLUSION
0
5
10
15
20
Go Go + Gendiff
Anton Pleshivtsev
github.com/allaud