Каталог решений - Самый быстрый FizzBuzz на 1С

Самый быстрый FizzBuzz на 1С

Самый быстрый FizzBuzz на 1С

В наличии

Давайте попробуем найти самое быстрое решение задачи «BuzzFizz» на 1С.

Категория:

Описание

После того, как встретил на просторах интернета задачу "BuzzFizz", захотел решить её на 1С. На Инфостарт есть поиск самого короткого решения, давайте теперь попробуем найти самое быстрое!

Напомню текст задачи:

Необходимо написать программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово Fizz, а вместо чисел, кратных пяти — слово Buzz. Если число кратно трем и кратна пяти, то программа должна выводить слово FizzBuzz.

 

 

Для того, чтобы замеры были более показательными, я увеличил количество выводимых чисел до 100 000 и установил это значение в переменную "Лимит".

Лимит = 100000;

Итерация 1

Первая функция выполнялась за 1,701917 секунд — думал, что без "ИначеЕсли" будет быстрее.

Сообщение = Новый СообщениеПользователю;
Для Счетчик = 1 По Лимит Цикл	
	Текст = "";
		Если Счетчик % 3 = 0 Тогда
		Текст = "Fizz";
	КонецЕсли; 
	Если Счетчик % 5 = 0 Тогда
		Текст = Текст + "Buzz";
	КонецЕсли;
	Если Текст = "" Тогда
		Текст = Счетчик;
	КонецЕсли;
		Сообщение.Текст = Текст;
	Сообщение.Сообщить(); 		
КонецЦикла;	

 

Итерация 2

Но нет, я ошибался. Цикл с "ИначеЕсли" выполнился за 1,428153 с. 

Сообщение = Новый СообщениеПользователю;
Для Счетчик = 1 По Лимит Цикл
	Если Счетчик % 3 = 0 И Счетчик % 5 = 0 Тогда
		Текст = "FizzBuzz";
	ИначеЕсли Счетчик % 3 = 0 Тогда
		Текст = "Fizz";
	ИначеЕсли Счетчик % 5 = 0 Тогда
		Текст = "Buzz";
	Иначе
		Текст = Счетчик;
	КонецЕсли;
	Сообщение.Текст = Текст;
	Сообщение.Сообщить();
КонецЦикла; 

Кстати, если заменить первое условие на "Счетчик % 15 = 0", то прироста производительности не происходит.

 

Итерация 3

А что, если заранее определить, кратно ли число 3 или 5? Получаем увеличение времени выполнения до 1,569277 с.

Сообщение = Новый СообщениеПользователю;
Для Счетчик = 1 По Лимит Цикл
	КратенТрём = Счетчик % 3 = 0;
	КратенПяти = Счетчик % 5 = 0;
	Если КратенТрём И КратенПяти Тогда
		Текст = "FizzBuzz";
	ИначеЕсли КратенТрём Тогда
		Текст = "Fizz";
	ИначеЕсли КратенПяти Тогда
		Текст = "Buzz";
	Иначе
		Текст = Счетчик;
	КонецЕсли;
	Сообщение.Текст = Текст;
	Сообщение.Сообщить();
КонецЦикла; 

 

Итерация 4

Понятно, пойдём другим путём — слегка уменьшим количество сравнений.

Сообщение = Новый СообщениеПользователю;
Для Счетчик = 1 По Лимит Цикл
	Если Счетчик % 3 = 0 Тогда
		Если Счетчик % 5 = 0 Тогда
			Текст = "FizzBuzz";
		Иначе
			Текст = "Fizz";
		КонецЕсли;
	ИначеЕсли Счетчик % 5 = 0 Тогда
		Текст = "Buzz";
	Иначе
		Текст = Счетчик;
	КонецЕсли;
	Сообщение.Текст = Текст;
	Сообщение.Сообщить();
КонецЦикла; 

Да, так лучше — 1,354212 с. Но подождите, почему мы используем объект СообщениеПользователю? Ведь самая долгая операция в нашем алгоритме — это вывод. Значит, нужно и её оптимизировать. Переделаем на "Сообщить(Текст);" и уменьшим время выполнения до 1,255155 с.

Можно ещё уменьшить количество проверок Если Тогда — проверять сначала остаток от деления на 5. Тогда мы будем попадать во вложенную проверку каждую пятую, а не каждую третью итерацию.

Если Счетчик % 5 = 0 Тогда
	Если Счетчик % 3 = 0 Тогда
		Текст = "FizzBuzz";
	Иначе
		Текст = "Buzz";
	КонецЕсли;
ИначеЕсли Счетчик % 3 = 0 Тогда
	Текст = "Fizz";
Иначе
	Текст = Счетчик;
КонецЕсли;

Получается время выполнения 1,233862 секунды = выигрываем 0.021с.

UPD: Протестировал цикл без операций остатка на деление, как предложил CheBurator в комментариях, а увеличивать переменную.

К сожалению, код замедлился — 1,461621 секунды, если прибавлять к отрицательному числу и 1,442719, если прибавлять к нулю.

 

has been added to your cart:
Оформление заказа