Control link
How fast each box replies to a query, how many moves it accepts (paced or clumped), and what it does with malformed input.
Query round trip
A program sent each box 3,000 queries one at a time, in two runs, timed on the PC's USB bus.
| Query | Stock | Medius | Result |
|---|---|---|---|
| Versionkm.version against QUERY(VERSION) | 177-184 µs | 219 µs | Stock |
| Statuskm.moving against QUERY(HEALTH) | 176-177 µs | 166 µs | Medius |
| Query | Stock | Medius | Result |
|---|---|---|---|
| Versionkm.version against QUERY(VERSION) | 240 µs | 291-293 µs | Stock |
| Statuskm.moving against QUERY(HEALTH) | 234-235 µs | 230-239 µs | Equal |
Paced moves, mouse still
One-count moves at a steady rate into a still mouse: stock's binary and text forms against Medius's MOVE frames, sent in 1 ms batches unless the table says otherwise. Each count adds 1 to the clone's X.
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 500/500 | 500/500 | Equal |
| 1,000/s | 1,000/1,000 | 1,000/1,000 | Equal |
| 1,500/s | 1,500/1,500 | 1,500/1,500 | Equal |
| 2,000/s | 2,000/2,000 | 2,000/2,000 | Equal |
| 5,000/s | 5,000/5,000 | 5,000/5,000 | Equal |
Stock km.moveMedius MOVE
| Moves/s | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 500/500 | 500/500 | Equal |
| 1,000/s | 1,000/1,000 | 1,000/1,000 | Equal |
| 1,500/s | 1,500/1,500 | 1,500/1,500 | Equal |
| 2,000/s | 2,000/2,000 | 2,000/2,000 | Equal |
| 5,000/s | 5,000/5,000 | 5,000/5,000 | Equal |
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 1,000/s | 1,000/1,000 | 1,000/1,000 | Equal |
| 2,000/s | 2,000/2,000 | 2,000/2,000 | Equal |
| 5,000/s | 5,000/5,000 | 5,000/5,000 | Equal |
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 250/s | 1,250/1,250 | 1,250/1,250 | Equal |
| 500/s | 5,000/5,000 | 5,000/5,000 | Equal |
| 1,000/s | 5,000/5,000 | 5,000/5,000 | Equal |
| 2,000/s | 10,000/10,000 | 10,000/10,000 | Equal |
Stock km.moveMedius MOVE
| Moves/s | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 250/s | 1,250/1,250 | 1,250/1,250 | Equal |
| 500/s | 5,000/5,000 | 5,000/5,000 | Equal |
| 1,000/s | 5,000/5,000 | 5,000/5,000 | Equal |
| 2,000/s | 10,000/10,000 | 10,000/10,000 | Equal |
Paced moves, mouse moving
The same moves into a 1 kHz mouse whose Y moves 1-10 and back every 200 ms. Here stock refuses some moves, replying DE AD 01 00 18 FF to a binary move and ERR to a text one.
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 125/s | 125/125 | 125/125 | Equal |
| 500/s | 500/500 | 500/500 | Equal |
| 1,000/s | 999/1,000 | 1,000/1,000 | Medius |
| 1,500/s | 1,498/1,500 | 1,500/1,500 | Medius |
| 2,000/s | 1,966/2,000 | 2,000/2,000 | Medius |
| 3,000/s | 2,093/3,000 | 3,000/3,000 | Medius |
| 5,000/s | 2,095/5,000 | 5,000/5,000 | Medius |
Stock km.moveMedius MOVE
| Moves/s | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 125/s | 124/125 | 125/125 | Medius |
| 500/s | 500/500 | 500/500 | Equal |
| 1,000/s | 1,000/1,000 | 1,000/1,000 | Equal |
| 1,500/s | 1,500/1,500 | 1,500/1,500 | Equal |
| 2,000/s | 1,999/2,000 | 2,000/2,000 | Medius |
| 3,000/s | 1,962/3,000 | 3,000/3,000 | Medius |
| 5,000/s | 2,089/5,000 | 5,000/5,000 | Medius |
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 1,000/s | 999/1,000 | 1,000/1,000 | Medius |
| 2,000/s | 1,963/2,000 | 2,000/2,000 | Medius |
| 5,000/s | 2,023/5,000 | 5,000/5,000 | Medius |
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 125/s | 625/625 | 625/625 | Equal |
| 250/s | 1,249/1,250 | 1,250/1,250 | Medius |
| 500/s | 4,998/5,000 | 5,000/5,000 | Medius |
| 1,000/s | 4,997/5,000 | 5,000/5,000 | Medius |
Stock km.moveMedius MOVE
| Moves/s | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 125/s | 625/625 | 625/625 | Equal |
| 250/s | 1,250/1,250 | 1,250/1,250 | Equal |
| 500/s | 5,000/5,000 | 5,000/5,000 | Equal |
| 1,000/s | 4,997/5,000 | 5,000/5,000 | Medius |
Move size
Moves of 10, 100 and 1,000 counts each, paced in 1 ms batches for 1 s into a still mouse.
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 5,000/5,000 | 5,000/5,000 | Equal |
| 1,000/s | 10,000/10,000 | 10,000/10,000 | Equal |
| 1,500/s | 15,000/15,000 | 15,000/15,000 | Equal |
| 2,000/s | 20,000/20,000 | 20,000/20,000 | Equal |
| 5,000/s | 50,000/50,000 | 50,000/50,000 | Equal |
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 50,000/50,000 | 50,000/50,000 | Equal |
| 1,000/s | 100,000/100,000 | 100,000/100,000 | Equal |
| 1,500/s | 150,000/150,000 | 150,000/150,000 | Equal |
| 2,000/s | 200,000/200,000 | 200,000/200,000 | Equal |
| 5,000/s | 500,000/500,000 | 500,000/500,000 | Equal |
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 500,000/500,000 | 500,000/500,000 | Equal |
| 1,000/s | 1,000,000/1,000,000 | 1,000,000/1,000,000 | Equal |
| 1,500/s | 1,500,000/1,500,000 | 1,500,000/1,500,000 | Equal |
| 2,000/s | 2,000,000/2,000,000 | 2,000,000/2,000,000 | Equal |
| 5,000/s | 5,000,000/5,000,000 | 5,000,000/5,000,000 | Equal |
Stock km.moveMedius MOVE
| Moves/s | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 5,000/5,000 | 5,000/5,000 | Equal |
| 1,000/s | 10,000/10,000 | 10,000/10,000 | Equal |
| 1,500/s | 15,000/15,000 | 15,000/15,000 | Equal |
| 2,000/s | 20,000/20,000 | 20,000/20,000 | Equal |
| 5,000/s | 50,000/50,000 | 50,000/50,000 | Equal |
Stock km.moveMedius MOVE
| Moves/s | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 50,000/50,000 | 50,000/50,000 | Equal |
| 1,000/s | 100,000/100,000 | 100,000/100,000 | Equal |
| 1,500/s | 150,000/150,000 | 150,000/150,000 | Equal |
| 2,000/s | 200,000/200,000 | 200,000/200,000 | Equal |
| 5,000/s | 500,000/500,000 | 500,000/500,000 | Equal |
Stock km.moveMedius MOVE
| Moves/s | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 500/s | 500,000/500,000 | 500,000/500,000 | Equal |
| 1,000/s | 1,000,000/1,000,000 | 1,000,000/1,000,000 | Equal |
| 1,500/s | 1,500,000/1,500,000 | 1,500,000/1,500,000 | Equal |
| 2,000/s | 2,000,000/2,000,000 | 2,000,000/2,000,000 | Equal |
| 5,000/s | 5,000,000/5,000,000 | 5,000,000/5,000,000 | Equal |
Moves in one write
One write holding a clump of one-count moves, then 100 more paced 1 ms apart. Stock's binary moves are 9 bytes, its text moves 14, Medius's frames 12.
Stock MOVE (0x18)Medius MOVE
| Moves in the write | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 8 | 8/8 | 8/8 | Equal |
| 16 | 16/16 | 16/16 | Equal |
| 20 | 20/20 | 20/20 | Equal |
| 24 | 24/24 | 24/24 | Equal |
| 28 | 56/56 | 56/56 | Equal |
| 29 | 58/58 | 58/58 | Equal |
| 30 | 29/60 | 60/60 | Medius |
Stock km.moveMedius MOVE
| Moves in the write | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 8 | 8/8 | 8/8 | Equal |
| 16 | 16/16 | 16/16 | Equal |
Stock MOVE (0x18)Medius MOVE
| Write | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 30 moves, 270 bytes for stock | One command behind until a power cycle | In step | MediusStock defect |
Fast paced moves
One-count moves paced in 1 ms batches for 2 s into a still mouse: stock's binary form at each rate and its text form at 8,000/s, against Medius at the same rates. Stock was power-cycled after each run that left its parser one command behind.
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 5,000 | 20,000/20,000 | 20,000/20,000 | Equal |
| 7,000 | 28,000/28,000 | 28,000/28,000 | Equal |
| 10,000 | 39,982/40,000 | 40,000/40,000 | Medius |
| 15,000 | 26,805/30,000 | 30,000/30,000 | Medius |
| 20,000 | 26,577/40,000 | 40,000/40,000 | Medius |
Stock km.moveMedius MOVE
| Runs | Stockkm.move | MediusMOVE | Result |
|---|---|---|---|
| 8,000/s | 96,000/96,000 | 96,000/96,000 | Equal |
Clumped and back-to-back writes
One-count binary moves into a still mouse, written in clumps every 16 ms (as a sender whose timer wakes every 16 ms writes them), or 12,871 back to back in 4,096-byte writes. Stock was power-cycled after each run that left its parser one command behind.
Stock MOVE (0x18)Medius MOVE
| Moves/s | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 1,000/s, 16 per write | 1,000/1,000 | 1,000/1,000 | Equal |
| 2,000/s, 32 per write | 92/2,000 | 2,000/2,000 | Medius |
Stock MOVE (0x18)Medius MOVE
| Write | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 4,096-byte writes | 138/12,871 | 12,871/12,871 | Medius |
Stock MOVE (0x18)Medius MOVE
| Write | StockMOVE (0x18) | MediusMOVE | Result |
|---|---|---|---|
| 2,000/s, 32 per write | One command behind until a power cycle | In step | Medius |
| 12,871 moves back to back | One command behind until a power cycle | In step | Medius |
Malformed input
Malformed input sent to each box, then a valid move. One try each.
Stock km.moveMedius MOVE(NOW)
| Malformed input | Stockkm.move | MediusMOVE(NOW) | Result |
|---|---|---|---|
| 64 KB of random bytes | Arrives | Arrives | Equal |
| Half a move, the valid move 100 ms later | Lost | Arrives | Medius |
| Half a move, the valid move straight after | Lost | Lost | Equal |
| Move with a length field too long | Lost | Arrives | Medius |
| Unknown command | Arrives | Arrives | Equal |
| Move too short | Arrives | Arrives | Equal |
| 5-count move with one bit flipped | Arrives | Arrives | Equal |
| Move written one byte a millisecond | Arrives | Arrives | Equal |
| 100 moves, a zero byte after each | Arrives | Arrives | Equal |
| Malformed input | Stock | Medius | Result |
|---|---|---|---|
| 64 KB of random bytes | 0 | 0 | Equal |
| Unknown command | 0 | 0 | Equal |
| Move too short | 0 | 0 | Equal |
| 5-count move with one bit flipped | 4 | 0 | Medius |
| Check | Stock | Medius | Result |
|---|---|---|---|
| After each malformed input | Correct | Correct | Equal |