Javascript.RU

PHP-функция: str_repeat

Javascript:

function str_repeat ( input, multiplier ) {	// Repeat a string
	// 
	// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

	var buf = '';

	for (i=0; i < multiplier; i++){
		buf += input;
	}

	return buf;
}

Примеры:

str_repeat('-=', 10);
'-=-=-=-=-=-=-=-=-=-='


Автор: Гость (не зарегистрирован), дата: 16 ноября, 2009 - 17:05
#permalink

еще один вариант

>>> new Array(10).join('-=')
"-=-=-=-=-=-=-=-=-="


Автор: @LEXXX_NF, дата: 24 декабря, 2009 - 23:11
#permalink

Чтобы результат был точно как в оригинале, нужна маленькая поправка:
>>> new Array(10 + 1).join('-=')


Автор: Berserker, дата: 29 января, 2010 - 23:48
#permalink

Неудачная реализация. На каждой итерации realloc памяти.
new Array(10 + 1).join('-=') гораздо эффективнее, так как сперва подсчитает размер результатирующей строки.


Автор: Plumbum (не зарегистрирован), дата: 18 августа, 2010 - 17:53
#permalink

Привожу собственную реализацию (по сути, развитие оригинальной):

// author K. Krylov (mailto:crylove_const@mail.ru)
function str_repeat ( input, multiplier )
{
  var buf = '';
  while (multiplier)
  {
    if (multiplier & 1)
      buf += string;
    string += string;
    multiplier >>= 1;
  }
  return buf;
}

Написал тест производительности, чтобы узнать, какая реализация из трёх на самом деле наиболее удачная. Для того, чтобы тест был более или менее адекватным разбил тест на 6 серий по количеству возможных перестановок 3 циклов с функциями. А потом просуммировал полученное время выполнения для каждой функции.

множимая строка - '-='
множитель - 3
количество проходов в цикле - 2400000

оригинальная реализация - 1315 мс
реализация с массивом - 5760 мс
собственная реализация - 2241 мс

множитель - 7
количество проходов в цикле - 1200000

оригинальная реализация - 864 мс
реализация с массивом - 4221 мс
собственная реализация - 1908 мс

множитель - 13
количество проходов в цикле - 600000

оригинальная реализация - 939 мс
реализация с массивом - 2441 мс
собственная реализация - 1150 мс

множитель - 20
количество проходов в цикле - 600000

оригинальная реализация - 1572 мс
реализация с массивом - 3577 мс
собственная реализация - 1172 мс

множитель - 100
количество проходов в цикле - 300000

оригинальная реализация - 4341 мс
реализация с массивом - 5236 мс
собственная реализация - 1212 мс

Из результатов тестирования следует, что реализация с использованием массива является самой неудачной. Реализация, предложенная в статье эффективна при значении множителя < 15. Если же требуется размножить строку более чем 15 раз, то моя реализация будет работать быстрее.

Если заинтересовал или вызвал сомнения тест производительности, пишите, пришлю.


Автор: demoniqus, дата: 20 апреля, 2015 - 13:20
#permalink

to Plumbum,
если есть возможность, попробуйте такую функцию протестировать:

function strRepeat(rptStr, repeatCount){
        /*Такой метод повтора строк гораздо эффективнее, чем простой набор строки в цикле, т.к. экономит кучу итераций циклов*/
        if (repeatCount < 1) return '';
        var pow = 0;
        var _pow;
        var str = rptStr;
        while ((repeatCount / 2).toFixed(1) >= (_pow = Math.pow(2, pow))) 
        {
            ++pow;
            str += str;
        }
        var i = Math.floor(Number(repeatCount / _pow) - 1);
        while (i > 0){
            --i;
            str += str;
        }
        repeatCount -= _pow * (++i);
        return str + this.strRepeat(rptStr, repeatCount);
    }

(function(repeatCount){
    var log = ''; 
    var t = (new Date()).getTime();
    strRepeat('a', repeatCount);
    log += 'strRepeat time: ' + ((new Date()).getTime() - t) + ' ;  ';
    console.log(log);
})(10000000);

10 000 000 повторов - это не ошибка. Я уже раз 20 ее запустил, но результат один и тот же... и крайне сомнительный... Но оригинальный вариант, приведенный в топе, вообще убил браузер на таком количестве итераций... При этом длина склеиваемой строки большого значения не играет: я пробовал как отдельный символ, так и полный алфавит...
На малых значениях проверял вручную результат - вроде все, что должно получиться, на месте...
Теоретически эту функцию можно ускорить еще...


Автор: Plumbum (не зарегистрирован), дата: 18 августа, 2010 - 17:57
#permalink

Допустил ошибку: function str_repeat ( string, multiplier ) =)


Автор: Антон.Скоробей (не зарегистрирован), дата: 18 мая, 2012 - 11:35
#permalink

Не могу ручаться, но мне кажется, если изменить в оригинальном варианте
i++
на
++i
то будет заметный выигрыш в скорости.


Автор: Guardian, дата: 25 апреля, 2014 - 05:30
#permalink

по мелочи ускоренный вышеуказанный вариант:

function str_repeat(input, multiplier) {
		var buf = '';
		for (; !!multiplier; multiplier >>= 1) {
			if (multiplier & 1) buf += input;
			input += input;
		}
		return buf;
	}

Автор: demoniqus, дата: 20 апреля, 2015 - 13:34
#permalink

оригинальную функцию можно упростить так:

function str_repeat(input, count){
  var s = '';
  while (count--) s += input;
  return s;
}

или

function str_repeat(input, count){
  var s = '';
  ++count;
  while (--count) s += input;
  return s;
}

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
6 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum