I'm very new to c and c++ programming, so I'm starting with the basics. I wrote identical Fibonacci loop programs for both c and c++ to test relative speed. I thought they'd be about the same for something so simple, but the c++ version is 60x slower. All they do is loop through and print the first 14 Fibonacci numbers 10,000 times. Here is the c version:
#include <stdio.h> int main (){ int c = 0; int x, y, z; while(c < 10000) { x = 0; y = 1; while(x < 255) { printf("%d\n", x); z = x + y; x = y; y = z; } c++; } return 0; } and here is the c++ version:
#include <iostream> using namespace std; int main() { int c = 0, x = 0, y = 0, z = 0; while(c < 10000) { x = 0; y = 1; while(x < 255) { cout << x << endl; z = x + y; x = y; y = z; } c++; } return 0; } I wrote both in notepad++ and compiled them using g++ from the mingw that comes with codeblocks:
g++ -o fibc.exe fib.c -s g++ -o fibcpp.exe fib.cpp -s The executables are very different in size: the c is 8.5KB and the c++ is 784KB! I used powershell to time them:
Measure-Command {start-process "C:\Path\fibcpp.exe" -RedirectStandardOutput "C:\Path\cpp.txt" -Wait} The files produced are identical, but the c version took 1 sec and the c++ verison took 60sec! (In fact, putting a loop of 1 million for the c program still only took 13sec). I also wrote the c++ in Visual Studio 17 and compiled it there with an x86 release config. The program size is now 9.5KB, but the run time is the same as the g++ version: 62sec. Why is this happening for such a simple program?
using namespace std;and useprintfinstead ofcoutand check again the difference between them. When you run such an experiment you should have the closests codes as you can.'\n'instead ofstd::endlfor starters, you don't need to flush every time. Have you tryed to compile with optimizations, like e.g.-O2?std::cout, etc) are synchronised with their C equivalents by default - which means a performance hit by default. Try doingstd::ios::sync_with_stdio(false)before performing output - then the C++ version will be closer (albeit not completely equivalent) to the C version. Also, theendlstream manipulator flushes the stream buffer, which is not done when supplying a'\n'toprintf(). Also, benchmarking is usually pointless on unoptimised code.