В FizzBuzz важна эффективность кода;более короткие коды кажутся более загадочными, но более крупные из них, как правило, имеют более низкую кривую обучения (менее читаемые).Я выбрал три способа кодирования этого и измерения их продолжительности;Общеизвестно, что подобный код на С ++ требует больше времени и памяти, чем те, что написаны на C. Поэтому вы должны посмотреть свой способ кодирования в зависимости от конечного назначения двоичных файлов и временных рамок, которые у вас есть для этого.
#include <iostream>
#include <chrono>
#include <cstring>
void runOne(int n, void (*fnc)(int));
void fizzbuzzAnsiC(int n);
void fizzbuzzAnsiC2(int n);
void fizzbuzzCpp(int n);
using namespace std;
using namespace std::chrono;
int main(int argc, char *argv[])
{ long iter = 100;
if (argc > 1)
iter = strtol(argv[1], nullptr, 10);
runOne(int(iter), fizzbuzzAnsiC2);
cout << endl << "==============" << endl;
runOne(int(iter), fizzbuzzAnsiC);
cout << endl << "==============" << endl;
runOne(int(iter), fizzbuzzCpp);
cout << endl << "==============" << endl;
return 0;
}
void runOne(int n, void (*fnc)(int))
{ high_resolution_clock::time_point t1 = high_resolution_clock::now();
fnc(n);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
auto duration = duration_cast<microseconds>( t2 - t1 ).count();
cerr << "Lasted: " << duration << " us" << endl;
}
static const char* cszFizz = "Fizz";
static const char* cszBuzz = "Buzz";
void fizzbuzzAnsiC(int n)
{ int i;
char szPrn[11];
char szNum[11]; //Suppose 9 digits number max (10e8-1)
char uMul;
for (i = 1; i <= n; ++i)
{ uMul = i%15 == 0;
strcpy(szPrn, uMul | (i%3==0) ? cszFizz : (i%5==0 ? cszBuzz : itoa(i, szNum, 10)));
if (uMul) strcat(szPrn, cszBuzz);
strcat(szPrn, "\n");
fwrite(szPrn, 1, strlen(szPrn), stdout);
}
}
void fizzbuzzAnsiC2(int n)
{ int i;
const char *messages[] = {"%i\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"};
for (i = 1; i <= n; ++i)
printf(messages[((i % 3) == 0) + 2*((i % 5) == 0)], i); //printf takes longer then str* functions
}
void fizzbuzzCpp(int n)
{ for (int i = 1; i <= n; ++i)
{ bool uMul = i%15 == 0;
std::cout << (uMul | (i%3==0) ? cszFizz : (i%5==0 ? cszBuzz : std::to_string(i)));
if (uMul) std::cout << cszBuzz;
std::cout << std::endl;
}
}
По мере увеличения числа итераций fizzbuzzAnsiC2 становится менее эффективным.Функция fizzbuzzAnsiC всегда наиболее эффективна.