У меня заметно тормозить начинает примерно при 500000. Для оптимизации можно вычислять элементы по id один раз и запоминать замыканием:
window.onload = function(){
var v = document.getElementById('buyUserText'),
c = document.getElementById('char_counter');
v.onkeyup = function() {
charCount(v, c);
};
};
function charCount(v, c) {
c.innerHTML = v.value.length;
}
Можно попробовать вместо innerText/innerHTML использовать nodeValue у первого текстового узла в char_counter. Только нужно не забыть создать его при onload. Можно charCount вызывать через нулевой timeout:
http://javascript.ru/tutorial/events/timing.
Но толку от всей этой оптимизации никакого (у меня, по крайней мере), т. к. даже если убрать весь javascript, то тормозить меньше не становится. Тестировал еще в Chrome. Для input-а также никаких изменений, а вот для textarea очень неплохое улучшение.