Typing Speed Test
Test your WPM and accuracy live with real text passages. Three difficulty levels, three durations. Free, instant, no signup.
Click the box below and start typing to begin the test
Support Our Free Tools
If you find this calculator helpful, please consider supporting our work. Your contribution helps us build and maintain these free tools for everyone.
Buy me a coffeeWhat Is WPM (Words Per Minute)?
WPM stands for Words Per Minute — the universal standard for measuring typing speed. Rather than counting actual words (which vary wildly in length), WPM uses a standardized definition: one word = 5 characters, including spaces and punctuation. This means that typing "I" and "internationalization" are weighted by their character count rather than word count, making scores comparable across any passage.
# The WPM formula
Net WPM = (Correct Characters / 5) / Minutes Elapsed
# Example: 300 correct characters typed in 1 minute
WPM = (300 / 5) / 1 = 60 WPM
# CPM = WPM × 5
CPM = 60 × 5 = 300 CPM
Live WPM Counter
WPM updates every 200 ms as you type. The counter uses your actual start time for a precise score from the very first keystroke.
Character-Level Accuracy
Accuracy is measured character-by-character against the target passage. Every mismatch is counted — even if you backspace over it — so the score reflects true keystroke precision.
Real Text Passages
Tests use real sentences — not random word lists. Three difficulty levels progress from casual prose to professional writing to dense technical content.
Average Typing Speed by Skill Level
| Skill Level | WPM Range | Accuracy | Typical Profile |
|---|---|---|---|
| Beginner | 10–25 WPM | 70–85% | Hunt-and-peck typist; looks at keyboard; uses 2–4 fingers |
| Average | 40–60 WPM | 92–96% | Most adults; comfortable for daily email and document work |
| Above Average | 65–80 WPM | 96–98% | Experienced touch typist; writers, admins, developers |
| Fast | 80–100 WPM | 97–99% | Skilled professional; power users, active coders |
| Expert | 100–120 WPM | 98–99%+ | Transcriptionists, court reporters, competitive typists |
| World Class | 120–200+ WPM | 99%+ | Top 0.1%; competitive speed typists, mechanical keyboard enthusiasts |
How to Improve Your Typing Speed
Master Home Row Position
Place your fingers on ASDF (left hand) and JKL; (right hand). Every finger has an assigned zone. Returning to home row between keystrokes is the foundation of touch typing — and speed.
Stop Looking at the Keyboard
Resist the urge to look down. Cover your hands if needed. Looking at the screen forces your brain to build muscle memory, which is what separates 40 WPM typists from 90 WPM typists.
Slow Down to Speed Up
Type at a speed where you make zero errors. Accuracy-first training builds clean muscle memory. Speed follows naturally — rushing before accuracy is solid bakes in bad habits that are hard to undo.
Drill Your Problem Keys
Identify your most common typos and practice those specific combinations. Fifteen minutes of targeted drilling on weak keys beats an hour of general typing for breaking through a plateau.
Use All Ten Fingers
Most hunt-and-peck typists use 2–4 fingers. Assigning each finger to its correct keys is what separates 40 WPM from 100 WPM. Learn proper finger assignments before anything else.
Consistency Over Intensity
Daily practice of 20–30 minutes produces faster improvement than occasional two-hour sessions. Muscle memory is built through repetition over time, not volume in a single session.
WPM Calculator — Code Examples in 5 Languages
Implementing a WPM and accuracy calculator for your own typing test app. All examples use the standard 5-character word definition and correct-characters-only Net WPM formula.
// WPM & accuracy calculator
function calcWpm(correctChars, elapsedSeconds) {
const minutes = elapsedSeconds / 60;
if (minutes === 0) return 0;
// 1 "word" = 5 characters (industry standard)
return Math.round((correctChars / 5) / minutes);
}
function calcAccuracy(typed, target) {
if (typed.length === 0) return 100;
const correct = [...typed].filter((ch, i) => ch === target[i]).length;
return Math.round((correct / typed.length) * 100);
}
// Live test example
const passage = "The quick brown fox jumps over the lazy dog";
const typed = "The quick brwon fox jumps over the lazy dog";
const elapsed = 15; // seconds
const correct = [...typed].filter((ch, i) => ch === passage[i]).length;
console.log(`WPM: ${calcWpm(correct, elapsed)}`); // ~35 WPM
console.log(`Accuracy: ${calcAccuracy(typed, passage)}%`); // ~98%# WPM & accuracy calculator
def calc_wpm(correct_chars: int, elapsed_seconds: float) -> int:
if elapsed_seconds == 0:
return 0
minutes = elapsed_seconds / 60
return round((correct_chars / 5) / minutes)
def calc_accuracy(typed: str, target: str) -> int:
if not typed:
return 100
correct = sum(t == p for t, p in zip(typed, target))
return round((correct / len(typed)) * 100)
def evaluate_test(typed: str, target: str, elapsed_seconds: float) -> dict:
correct_chars = sum(t == p for t, p in zip(typed, target))
errors = len(typed) - correct_chars
return {
"wpm": calc_wpm(correct_chars, elapsed_seconds),
"accuracy": calc_accuracy(typed, target),
"errors": errors,
"cpm": round(correct_chars / (elapsed_seconds / 60)),
}
# Example
result = evaluate_test("The quick brwon fox", "The quick brown fox", 10)
print(result) # {'wpm': 35, 'accuracy': 95, 'errors': 1, 'cpm': 174}interface TypingResult {
wpm: number;
accuracy: number;
errors: number;
cpm: number;
correctChars: number;
}
function evaluateTypingTest(
typed: string,
target: string,
elapsedSeconds: number
): TypingResult {
const correctChars = [...typed].filter((ch, i) => ch === target[i]).length;
const errors = typed.length - correctChars;
const minutes = elapsedSeconds / 60;
const wpm = minutes > 0 ? Math.round((correctChars / 5) / minutes) : 0;
const cpm = minutes > 0 ? Math.round(correctChars / minutes) : 0;
const accuracy = typed.length > 0
? Math.round((correctChars / typed.length) * 100) : 100;
return { wpm, accuracy, errors, cpm, correctChars };
}
// Usage
const result = evaluateTypingTest(
"The quick brwon fox",
"The quick brown fox",
10
);
console.log(result); // { wpm: 35, accuracy: 95, errors: 1, cpm: 174, correctChars: 18 }package main
import (
"fmt"
"math"
)
type TypingResult struct {
WPM int
Accuracy int
Errors int
CPM int
}
func EvaluateTest(typed, target string, elapsedSeconds float64) TypingResult {
typedRunes := []rune(typed)
targetRunes := []rune(target)
correct := 0
for i, ch := range typedRunes {
if i < len(targetRunes) && ch == targetRunes[i] {
correct++
}
}
errors := len(typedRunes) - correct
minutes := elapsedSeconds / 60
wpm, cpm, accuracy := 0, 0, 100
if minutes > 0 {
wpm = int(math.Round(float64(correct/5) / minutes))
cpm = int(math.Round(float64(correct) / minutes))
}
if len(typedRunes) > 0 {
accuracy = int(math.Round(float64(correct) / float64(len(typedRunes)) * 100))
}
return TypingResult{WPM: wpm, Accuracy: accuracy, Errors: errors, CPM: cpm}
}
func main() {
r := EvaluateTest("The quick brwon fox", "The quick brown fox", 10)
fmt.Printf("%+v
", r) // {WPM:35 Accuracy:95 Errors:1 CPM:174}
}#[derive(Debug)]
struct TypingResult {
wpm: u32,
accuracy: u32,
errors: usize,
cpm: u32,
}
fn evaluate_test(typed: &str, target: &str, elapsed_seconds: f64) -> TypingResult {
let correct = typed
.chars()
.zip(target.chars())
.filter(|(t, p)| t == p)
.count();
let errors = typed.chars().count().saturating_sub(correct);
let minutes = elapsed_seconds / 60.0;
let (wpm, cpm) = if minutes > 0.0 {
(
((correct as f64 / 5.0) / minutes).round() as u32,
(correct as f64 / minutes).round() as u32,
)
} else {
(0, 0)
};
let accuracy = if !typed.is_empty() {
((correct as f64 / typed.chars().count() as f64) * 100.0).round() as u32
} else { 100 };
TypingResult { wpm, accuracy, errors, cpm }
}
fn main() {
let r = evaluate_test("The quick brwon fox", "The quick brown fox", 10.0);
println!("{:?}", r); // TypingResult { wpm: 35, accuracy: 95, errors: 1, cpm: 174 }
}Frequently Asked Questions
- What is a good typing speed in WPM?
- The average adult types at 40–60 WPM. A speed of 65–80 WPM is considered above average for most office and professional use. Developers and writers often reach 80–100 WPM. Professional typists, transcriptionists, and court reporters typically exceed 100–120 WPM. Competitive speed typists regularly break 150–200 WPM.
- How is WPM calculated?
- WPM (Words Per Minute) = (Correct Characters ÷ 5) ÷ Minutes Elapsed. The constant 5 is a standardized "word" length used across all typing tests so that scores are comparable regardless of actual word lengths in the passage. This formula gives Net WPM, which accounts for errors by only counting correctly typed characters.
- What is the difference between WPM and CPM?
- WPM uses a standardized word length of 5 characters to make scores comparable across passages with different word lengths. CPM (Characters Per Minute) counts raw correct characters typed per minute. CPM = WPM × 5. WPM is the standard benchmark for general typing; CPM is commonly used in data entry and transcription contexts where character-level throughput matters.
- What is the fastest typing speed ever recorded?
- The sustained speed record on a conventional keyboard belongs to Barbara Blackburn, who reached a peak of 212 WPM and maintained 150 WPM for 50 minutes using the Dvorak Simplified Keyboard. In online competitions using modern mechanical keyboards, speeds above 200 WPM have been demonstrated and verified on platforms like Monkeytype and TypeRacer.
- Why does accuracy matter more than raw speed?
- Errors significantly reduce your effective output. A typist at 100 WPM with 80% accuracy produces the same correct throughput as someone at 80 WPM with 100% accuracy — but also creates rework, context-switching, and frustration. In programming and data entry, a single typo can cause bugs or rejected records. Accuracy-first training consistently produces faster typists over time.
- How long does it take to improve typing speed?
- With deliberate daily practice of 20–30 minutes, most people improve by 10–20 WPM within a month. Going from 40 WPM to 80 WPM typically takes 3–6 months of consistent practice. Reaching 100+ WPM generally requires 1–2 years and a focus on eliminating specific error patterns. Switching to a new keyboard layout adds 2–6 months of relearning time.
- Does keyboard layout affect typing speed?
- Yes. QWERTY was designed partly to slow typists down to prevent mechanical typewriter key jams. Alternative layouts like Dvorak and Colemak are optimized to minimize finger travel and are used by many high-speed typists. However, switching layouts takes months of dedicated practice before you recover your original QWERTY speed, so the benefit is only worth it if you commit fully.
- What is touch typing?
- Touch typing is a technique where you type without looking at the keyboard, using all ten fingers with each finger assigned to specific keys based on home row position (ASDF for left hand, JKL; for right hand). Typists rely on muscle memory rather than visual search for each key. Touch typing is the most efficient technique and is effectively required to break 80–90 WPM.
- Should I try to fix mistakes or keep typing?
- For most typing tests, it is better to keep moving rather than backspacing repeatedly, as mistakes are already counted. In real work, fixing errors immediately is often more efficient than proofreading at the end. During practice, prioritize accuracy over speed — the mental habit of not making the error in the first place is more valuable than the reflex to correct it.
- Does this test save my results?
- No. The test runs entirely in your browser. No keystrokes, results, or personal data are sent to or stored on any server. Your results are private and disappear when you close or refresh the page.
Explore All Tools
95 free tools — no signup required
All 95 tools are free · No signup · No ads
