Index: src/wp-admin/js/about.js
===================================================================
--- src/wp-admin/js/about.js	(revision 25881)
+++ src/wp-admin/js/about.js	(working copy)
@@ -1,66 +1,80 @@
 (function($){
-    var password = 'Gosh, WordPress is grand.',
-        $input = $('#pass'),
-        shouldAnimate = true,
-        indicatorString = $('#pass-strength-result').text();
+	var password = 'Gosh, WordPress is grand.',
+		$input = $('#pass'),
+		shouldAnimate = true,
+		timesForAnimation = [280, 300, 305, 310, 315, 325, 330, 345, 360, 370, 380, 400, 450, 500, 600],
+		resultsCache = {},
+		indicatorString = $('#pass-strength-result').text();
 
-    function updateResult(){
-        var strength = wp.passwordStrength.meter($input.val(), [], $input.val());
+	function updateResult(){
+		var strength;
 
-        $('#pass-strength-result').removeClass('short bad good strong');
-        switch ( strength ) {
-            case 2:
-                $('#pass-strength-result').addClass('bad').html( pwsL10n['bad'] );
-                break;
-            case 3:
-                $('#pass-strength-result').addClass('good').html( pwsL10n['good'] );
-                break;
-            case 4:
-                $('#pass-strength-result').addClass('strong').html( pwsL10n['strong'] );
-                break;
-            default:
-                $('#pass-strength-result').addClass('short').html( pwsL10n['short'] );
-        }
-    }
-    function resetMeter(){
-        $input.val('');
-        $('#pass-strength-result').text(indicatorString);
-        $('#pass-strength-result').removeClass('short bad good strong');
-    }
+		if ( typeof( resultsCache[ $input.val() ]) === 'undefined') {
+			strength = wp.passwordStrength.meter($input.val(), [], $input.val());
+			resultsCache[ $input.val() ] = strength;
+		} else {
+			strength = resultsCache[ $input.val() ];
+		}
 
-    function animate(){
-        if (shouldAnimate === false)
-            return;
-        if ($input.val().length < password.length){
-            $input.val( password.substr(0, $input.val().length + 1) );
-            updateResult();
-        } else {
-            resetMeter();
-        }
-        // Look like real typing by changing the speed new letters are added each time
-        setTimeout(animate, 220 + Math.floor(Math.random() * ( 800 - 220)) );
-    }
-    //
-    function begin(){
-        // we async load zxcvbn, so we need to make sure it's loaded before starting
-        if (typeof(zxcvbn) !== 'undefined')
-            animate();
-        else
-            setTimeout(begin,800);
-    }
+		$('#pass-strength-result').removeClass('short bad good strong');
+		switch ( strength ) {
+			case 2:
+				$('#pass-strength-result').addClass('bad').html( pwsL10n['bad'] );
+				break;
+			case 3:
+				$('#pass-strength-result').addClass('good').html( pwsL10n['good'] );
+				break;
+			case 4:
+				$('#pass-strength-result').addClass('strong').html( pwsL10n['strong'] );
+				break;
+			default:
+				$('#pass-strength-result').addClass('short').html( pwsL10n['short'] );
+		}
+	}
+	function resetMeter(){
+		$input.val('');
+		$('#pass-strength-result').text(indicatorString);
+		$('#pass-strength-result').removeClass('short bad good strong');
+	}
 
-    // Turn off the animation on focus
-    $input.on('focus', function(){
-        shouldAnimate = false;
-        resetMeter();
-    });
+	function animate(){
+		if (shouldAnimate === false)
+			return;
+		if ($input.val().length < password.length){
+			$input.val( password.substr(0, $input.val().length + 1) );
+			updateResult();
 
-    // Act like a normal password strength meter
-    $input.on('keyup', function(){
-        updateResult();
-    });
+			// Look like real typing by changing the speed new letters are added each time
+			setTimeout( animate, ( timesForAnimation[ Math.floor( Math.random() * timesForAnimation.length ) ] ) );
+		} else {
+			resetMeter();
 
-    // Start the animation
-    begin();
+			// When we reset, let's wait a bit longer than normal to start again
+			setTimeout(animate, 700);
+		}
 
+	}
+
+	function begin(){
+		// we async load zxcvbn, so we need to make sure it's loaded before starting
+		if (typeof(zxcvbn) !== 'undefined')
+			animate();
+		else
+			setTimeout(begin,800);
+	}
+
+	// Turn off the animation on focus
+	$input.on('focus', function(){
+		shouldAnimate = false;
+		resetMeter();
+	});
+
+	// Act like a normal password strength meter
+	$input.on('keyup', function(){
+		updateResult();
+	});
+
+	// Start the animation
+	begin();
+
 })(jQuery);
