Attack speed is how many times a second the sheet says you swing. A skill with the attack-speed flag divides its wind-up, recovery and table cooldown by that number. Percent bonuses multiply the whole stat, so the first points cut more wait than the same amount added later.
Numbers from DS_B.0.4.23.
At a glance
Direct answers
How is attack speed calculated?
Attack Speed starts at 0.4. Each point of Agility adds 0.01. Inscriptions, potions and other effects then multiply the whole amount by (1 + their percent / 100).
What does a higher attack speed change?
For a skill whose attack-speed flag is on, wind-up, recovery and table cooldown are each divided by Attack Speed. A basic swing whose table delays add to 1 s then waits 1 / attack speed seconds.
Is this the same as cooldown reduction?
No. Most skills divide table cooldown by (1 + cooldown reduction / 100). Only skills with the attack-speed flag divide by Attack Speed instead. Global cooldown never reads attack speed.
Basic swing
A basic attack has no table cooldown. The wait is its start delay plus its end delay, after the attack-speed divide. Rows group every basic attack that shares the same table total.
Example: at default Agility with +20% attack speed, a 1 s table swing waits 1.667 s.
| Table wind-up + recovery | No bonus | +4% | +8% | +10% | +15% | +20% | +30% | +35% | +50% | Basic attacks |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 s | 2 s | 1.923 s | 1.852 s | 1.818 s | 1.739 s | 1.667 s | 1.538 s | 1.481 s | 1.333 s | |
| 1.5 s | 3 s | 2.885 s | 2.778 s | 2.727 s | 2.609 s | 2.5 s | 2.308 s | 2.222 s | 2 s | |
| 0.4 s | 0.8 s | 0.7692 s | 0.7407 s | 0.7273 s | 0.6957 s | 0.6667 s | 0.6154 s | 0.5926 s | 0.5333 s | |
| 0.6 s | 1.2 s | 1.154 s | 1.111 s | 1.091 s | 1.043 s | 1 s | 0.9231 s | 0.8889 s | 0.8 s | |
| 1.2 s | 2.4 s | 2.308 s | 2.222 s | 2.182 s | 2.087 s | 2 s | 1.846 s | 1.778 s | 1.6 s |
Diminishing returns
The percent is not one-for-one on the clock. The first points of attack speed cut more wait than the same amount added later.
The graph is leftover wait, as a share of the swing with no percent bonus. With none, you wait the full time. At 100% attack speed you wait half.
On a 1 s table swing at default Agility, the first +20% saves 0.3333 s. The next +20% only saves 0.2381 s.
Agility is slow on this curve: each point is +0.01 /s before percents. Inscriptions jump +4%, +8%, +10%, +15%, +20%, +30%, +35%, +50% in one go.
Agility alone, no percent bonus, on a 1 s table swing. Default Agility is 10.
| Agility | Attack speed | Wait on a 1 s table swing | Saved vs default Agility |
|---|---|---|---|
| 0 | 0.4 /s | 2.5 s | -0.5 s |
| 10 | 0.5 /s | 2 s | 0 s |
| 20 | 0.6 /s | 1.667 s | 0.3333 s |
| 30 | 0.7 /s | 1.429 s | 0.5714 s |
| 40 | 0.8 /s | 1.25 s | 0.75 s |
| 50 | 0.9 /s | 1.111 s | 0.8889 s |
What raises it
Every effect that writes attack speed is in the table. Attack Speed itself is built from the base and Agility first, then any extra percent modifiers.
On top of those effects, each point of Agility adds +0.01 /s before percents.
| Source | Attack speed | How you get it |
|---|---|---|
| +30% | Inscription | |
| +20% | Inscription | |
| +10% | Inscription | |
| +10% | Background | |
| +20% | Trait | |
| -30% | Equipment | |
| -30% | Equipment | |
| -30% | Equipment | |
| -30% | Equipment | |
| -30% | Equipment | |
| -30% | Equipment | |
| -30% | Equipment | |
| +50% | No obtainable source in this build. | |
| +35% | No obtainable source in this build. Also in the data: Initiative. | |
| +30% | Granted by Quick Dash, Piercing Thrust, Stone Raise. | |
| +30% | Granted by Attack Speed Potion. | |
| +30% | Granted by Rat Swarm. | |
| +20% | No obtainable source in this build. | |
| +20% | No obtainable source in this build. | |
| +20% | No obtainable source in this build. | |
| +15% | No obtainable source in this build. | |
| +10% | No obtainable source in this build. | |
| +8% | Granted by Combat Momentum. | |
| +4% | No obtainable source in this build. Also in the data: Brace Stance. |
Skills that divide cooldown by attack speed
These skills also divide their table cooldown by Attack Speed. Cooldown reduction does not enter that path. A table cooldown of 0 never reaches that divide. See Cooldowns.
| Skill | Table cooldown |
|---|---|
| 1 s | |
| 10 s | |
| 10 s | |
| 15 s | |
| 15 s | |
| 16 s |
Under the hoodhow the code does it
- Attack Speed is the status-table default plus Agility times 0.01, then multiplied by (1 + AttackSpeedPerModifier / 100). The percent apply is the same path physical attack power uses.
- A skill with the attack-speed flag passes that flag into the delay helper for start delay and end delay. The helper divides the table delay by attack speed.
- The same flag makes skill cooldown divide by attack speed instead of by (1 + cooldown reduction / 100). A table cooldown of 0 returns 0 immediately.
- If attack speed is not greater than 0, the delay helper and the cooldown calculator both fall back to dividing by 1.
- Global cooldown does not read attack speed.
Related: Cooldowns · Combat Formulas · Talents · Equipment Effects.