РЕДАКТИРОВАТЬ За то, что это стоит, что может быть не так уж много. Я сделал небольшой тест, чтобы расширить этот вопрос.
Я написал две функции для перечисления серии FizzBuzz.
private static IEnumerable<string> SimpleFizzBuzz(
int start = 0,
int end = int.MaxValue)
{
return Enumerable.Range(start, end).Select(i =>
i % 15 == 0 ? "fizzbuzz" :
i % 3 == 0 ? "fizz" :
i % 5 == 0 ? "buzz" :
i.ToString(CultureInfo.InvariantCulture));
}
и
private static IEnumerable<string> OptimizedFizzBuzz(
int start = 0,
int end = int.MaxValue)
{
const int fizz = 3;
const int buzz = 5;
const string fizzString = "fizz";
const string buzzString = "buzz";
const string fizzBuzzString = fizzString + buzzString;
var fizzer = start % fizz;
var buzzer = start % buzz;
if (fizzer == 0)
{
fizzer = fizz;
}
if (buzzer == 0)
{
buzzer = buzz;
}
for (var i = start; i <= end; i++)
{
if (buzzer == buzz)
{
if (fizzer == fizz)
{
yield return fizzBuzzString;
buzzer = 1;
fizzer = 1;
continue;
}
yield return buzzString;
buzzer = 1;
fizzer++;
continue;
}
if (fizzer == fizz)
{
yield return fizzString;
buzzer++;
fizzer = 1;
continue;
}
yield return i.ToString(CultureInfo.InvariantCulture);
fizzer++;
buzzer++;
}
}
Я немного поработал, скомпилировал в конфигурации выпуска, с оптимизацией и запустил из командной строки. За 10^8
итераций, без лишних затрат, связанных с отчетом о каждом элементе, я получаю результаты, приблизительно равные
Простой: 14,5 секунд
Оптимизировано: 10 секунд
Вы заметите, что «оптимизированная» функция быстрее, но более многословна. Его поведение можно изменить, просто изменив константы в его голове.
Извинения, если это кажется немного тривиальным.
Рассмотрим эту функцию.
using System.Text;
public string FizzBanger(int bound)
{
StringBuilder result = new StringBuilder();
for (int i = 1; i < bound; i++)
{
String line = String.Empty;
if (i % 3 == 0) line += "fizz";
if (i % 5 == 0) line += "buzz";
if (String.IsNullOrEmpty(line)) line = i.ToString();
result.AppendLine(line.ToString());
}
return result.ToString();
}
Вывод будет выглядеть как
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
...
Кто-нибудь может придумать лучший способ сделать это? Пожалуйста, учитывайте как производительность, так и удобство обслуживания.