Вот самая быстрая функция!
Почему она быстрее?
- Не проверяет char по char (с 1 исключением)
- Использует некоторое времяи увеличивает на 1 переменную (число символов в переменной) по сравнению с циклом for, проверяющим длину и увеличивающим на 2 переменные (обычно это переменная i и переменная с количеством символов)
- использует WAY меньше переменных
- Не использует регулярное выражение!
- Использует (надеюсь) высокооптимизированную функцию
Все операции объединены настолько, насколько это возможно, избегая замедлений из-за нескольких операций
String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};
Вот более медленная и более читаемая версия:
String.prototype.timesCharExist = function ( chr ) {
var total = 0, last_location = 0, single_char = ( chr + '' )[0];
while( last_location = this.indexOf( single_char, last_location ) + 1 )
{
total = total + 1;
}
return total;
};
Эта медленнее из-за счетчика, длинных имен переменных и неправильного использования 1 переменной.
Чтобы использовать его, вы просто делаете это:
'The char "a" only shows up twice'.timesCharExist('a');
Редактировать: (2013/12/16)
НЕ использовать с Opera 12.16 или старше!это займет почти в 2,5 раза больше, чем решение для регулярных выражений!
В Chrome это решение займет от 14 мс до 20 мс для 1000000 символов.
Решение для регулярных выражений займет 11-14 мс на ту же сумму.
Использование функции (за пределами String.prototype
) займет около 10-13 мс.
Вот код, используемый:
String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};
var x=Array(100001).join('1234567890');
console.time('proto');x.timesCharExist('1');console.timeEnd('proto');
console.time('regex');x.match(/1/g).length;console.timeEnd('regex');
var timesCharExist=function(x,c){var t=0,l=0,c=(c+'')[0];while(l=x.indexOf(c,l)+1)++t;return t;};
console.time('func');timesCharExist(x,'1');console.timeEnd('func');
Результат всех решенийдолжно быть 100 000!
Примечание: если вы хотите, чтобы эта функция считала более 1 символа, измените значение c=(c+'')[0]
на c=c+''