Sign in to follow this  
Wavesonics

Unity Which C++ compiler is best?

Recommended Posts

I was was reading this long thread in the Graphics theory forum ( http://www.gamedev.net/community/forums/topic.asp?topic_id=437740 ) about a "Fast vector class" which incorporated some inline asm to speed up some functions. Any way the thread went on and on and a lot was talked about which compiler would do what with specific code as far as efficiency went. So I was wondering, what C or C++ compilers do you all use? Which ones produce generally faster code? I'm using GCC b/c, well, it's free, easy to get a hold of, and I like to try to follow standards when I can. So as far as I know the MS compiler is out. But what do you all think? ( why do I sense this starting a flame war... )

Share this post


Link to post
Share on other sites
I *believe* the Visual Studio 2005 compiler is also free, i *think* it is just the IDE you pay for, though i'm not sure (maybe someone can confirm.) GCC is probably more standards compliant but i think the Microsoft compiler is catching up.

As for speed, i doubt there is much difference.

Share this post


Link to post
Share on other sites
gcc and whatever compiler microsoft uses in VS2005 is pretty much equal when it comes to following the standard, as far as performance goes i wouldn't know but i wouldn't be suprised if microsoft has an edge there.

For high performance compilers you may want to take a look at Intels C++ compiler 9.1 which includes features such as Auto Parallelization and Profile Guided Optimization. (its not free and its not cheap, especially when you consider the fact that it doesn't include an IDE).

http://www.intel.com/cd/software/products/asmo-na/eng/compilers/284132.htm

Quote:

Auto Parallelization improves application performance on multiprocessor systems by means of automatic threading of loops. This option detects parallel loops capable of being executed safely in parallel and automatically generates multi-threaded code.


Quote:

Profile-guided Optimization (PGO)
The Profile-guided optimization (PGO) compilation process enables the Intel C++ compiler to take better advantage of the processor microarchitecture, more effectively use instruction paging and cache memory, and make better branch predictions. It improves application performance by reorganizing code layout to reduce instruction-cache thrashing, shrinking code size and reducing branch mispredictions.

PGO is a three-stage process, as shown in Figure 2. Those steps include 1) a compile of the application with instrumentation added, 2) a profile-generation phase, where the application is executed and monitored, and 3) a recompile where the data collected during the first run aids optimization.

Share this post


Link to post
Share on other sites
Unless I'm off the mark, GCC (G++) is 100% standards compliant.

I have not used the MSVC++ compiler, but do know for fact that there is a good deal of code that will compile in MSVC++ and not in GCC. Syntax aside, there are other glaring standards problems with MSVC++.

For example, there was a post on here or some where only a week or so ago with a line of code similar to:

Quote:

int i = 1;
cout << ( ++i + ++i + ++i ) << endl;


Where GCC (4.1.2), following the standard for sequence points, produced 10 as the output while MSVC++ (not sure what version) produce 12 as the output.

But I digress. Does anyone have any hard figures on performance differences?

Share this post


Link to post
Share on other sites
Quote:
Where GCC (4.1.2), following the standard for sequence points, produced 10 as the output while MSVC++ (not sure what version) produce 12 as the output.


Well acording to this the expression ( ++i + ++i + ++i ) contains no sequence points and hence the result of such an expression is undefined so GCC and MSVC++ are both correct in producing 10 and 12 respectively.

Also I'm pretty sure GCC is not 100% standards compliant (though currently I can't find a source stating this), neither is MSVC++.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
msvc is a "commercial" compiler (although the express versions are free), it has the best compiler available. It can optimize code better than the gcc.

but gcc has it advantages, too. it has a "intermediate layer" of compiling.
it compiles in 2 steps, the language to some kind of logic layer and then to executable. and it optimizes quite well, not as good as the msvc, but almost the same quality. and you can compile for many platforms, and it runs on many platforms.

i would say, ms has the best specialized compiler, and the gcc is the best generic compiler available.

Share this post


Link to post
Share on other sites
The best compiler is one which:

- Produces code which works on your target platform (this is essential)
- Has a sufficient degree of correctness that you're happy with it
- Integrates with whatever other tools you plan to use (IDE, debugger, profiler, test cover etc)

AND

- Optionally, produces reasonably optimal code. This is not usually that important unless you are writing a major scientific or engineering application.

Last time I had any information on this (A seminar on scientific computing I attended), on Intel chips (ia32), the "Best" compiler for *SOME* tasks, was the Intel C++ compiler.

Microsoft's and GCC weren't bad but didn't produce such optimal code in *SOME CASES* as the Intel one.

I've no idea how well the Intel compiler's code performs on AMD chips.

In general, code from different compilers will perform differently in different cases, on different platforms (EVEN different CPUs from a compatible architecture), and maybe even different workloads (e.g. one compiler's may perform better on a smaller data set, another on a larger one, even with the exact same code being run).

Mark

Share this post


Link to post
Share on other sites
Getting SSE intrinsics to work in the GNU c++ compiler is difficult, though some people (not me) have gotten them to work. Inline assembly is different as well, though it's just a different syntax. As far as speed goes, I've heard good things about gcc (or whatever comes with code::blocks) and the Intel compiler, so try to see what works best for you. The one issue I'd have to warn you about is that it can be difficult to port code from Visual C++ to the GNU compiler, there are things you can't get away with, and the Microsoft standard libraries support a lot of things out of the box, like cache-aligned data allocation (though if such a function comes with code::blocks someone let me know).

Share this post


Link to post
Share on other sites
Neither GCC nor MSVC follow the standard 100%. For example, neither implement the export keyword.

Both compilers also support language extensions that are non-standard. For example gcc supports nested functions and MSVC, as mentioned, accepts some template code that shouldn't strictly compile.

So the differences are not so great.

Share this post


Link to post
Share on other sites
Quote:
Original post by Wavesonics
I'm using GCC b/c, well, it's free, easy to get a hold of, and I like to try to follow standards when I can. So as far as I know the MS compiler is out.
You can get the Visual C++ 2005 Express Edition as a free download from Microsoft. It's not 100% standards compliant and as usual implements some non-standard extensions, but it is actually pretty good. I can't comment on the efficiency of the code produced (although I believe it does a good job of optimising), but if you've been avoiding this one for the reasons you listed you might want to check it out if only for the very slick IDE/tools.

Share this post


Link to post
Share on other sites
Yeah, a fast compiler is only 1/2 the story. a good IDE, debugger, environment does wonder to your productivity, and VS2005 is pretty awesome. It's pretty much the industry standard (we run it for XBox360 development, the PS3 with SN system integrated tools, and Incredibuild). It's good to have one standard development platform.

Share this post


Link to post
Share on other sites
Quote:
Original post by Wavesonics
I tend to lean towards Open Source stuff, but 1 important thing is I'm writing cross platform code which I think GCC handles better?


Keyword YOU are writing the code not the compiler. Your statement is not completely off though, and that would only be because GCC is available for several platforms so you can use the same compiler. It doesn't however make your code cross-platform in any way

Share this post


Link to post
Share on other sites
If you want to write cross-platform code, compile it in GCC and also in MSVC. Then you can easily switch to the Intel compiler later if you find it makes your code faster, since it's compatible with GCC (on Linux) and MSVC (on Windows) and generally works without needing any non-trivial code changes (at least in my experience, and at least when I don't hit bugs in it). If you only ever compile your code in GCC, you'll probably have some difficulties getting it to work in MSVC in the future, and vice versa.

(sizeof(wchar_t) is a difference that's hit me fairly often - neither compiler is non-standards-compliant in that respect, they're just different. You have a much better chance of writing standards-compliant code yourself when you don't give yourself the chance to rely on a single compiler's implementation decisions.)

If you run with both, you also get the advantages of the tools from both (like the VS debugger and Valgrind) and the compiler warnings from both (like GCC complaining about incorrect printf types), and it doesn't require much more effort when you're developing the code.

Share this post


Link to post
Share on other sites
Quote:
Original post by Anonymous Poster
msvc is a "commercial" compiler (although the express versions are free), it has the best compiler available. It can optimize code better than the gcc.
This was probably true for the GCC 3.x series. However, I've been suitably impressed by the enhancements in the 4.x series, and it doesn't look like you can say that either compiler generates better code. They generate different code at times, and one's may be better than the other in specific situations, but neither one systematically wins out.

In any case, use VC on Windows, because it's a lot less painful to do Windows dev on it. Use GCC everywhere else. Your compiler choice has nothing to do with the standards compliancy or portability of your code.

Share this post


Link to post
Share on other sites
I'm surprised nobody has mentioned the Comeau compiler as it is the most standards compliant out there. Otherwise, Intel is known to be the fastest by some distance; I think MS and GCC are pretty similar speed-wise.

Share this post


Link to post
Share on other sites
In the project I am currently working on, we have it building on both Linux using GCC and Windows using VC++EE. We have run into very few problems in getting things to smoothly compile across both with no warnings. The few minor problems we have had pop up generally were due to VC having a few language extensions in regards to inheriting from templates where GCC followed the standard. These are very easy to fix though with the addition of a few 'typename's and a few 'this->'s.

Currently the project builds on both systems / compilers with no warnings, and very little effort has actually gone into this.

Beyond that, library choice is more of an issue when working on cross-platform projects than compilers, so put some good research into that.

Share this post


Link to post
Share on other sites
Quote:
Original post by WavesonicsFor example, there was a post on here or some where only a week or so ago with a line of code similar to:

Quote:

int i = 1;
cout << ( ++i + ++i + ++i ) << endl;


Where GCC (4.1.2), following the standard for sequence points, produced 10 as the output while MSVC++ (not sure what version) produce 12 as the output.


For goodness' sake... if you're going to start quoting standards at least do so accurately.

It would be standards-compliant (if rather unfriendly) for a compiler to format your hard drive if it came across an expression like that, never mind output 12. (Or 10, or 3, or -156 if it wanted). Modifying a variable twice between sequence points is specifically stated to be undefined behaviour, so the compiler can do absolutely anything it wants to.

Share this post


Link to post
Share on other sites
Quote:
Original post by Wavesonics
I have not used the MSVC++ compiler, but do know for fact that there is a good deal of code that will compile in MSVC++ and not in GCC.


The opposite applies as well.

Quote:
Syntax aside, there are other glaring standards problems with MSVC++.


Given the multiple misstatements with regards to standard behavior you've made in this post alone (I laughed when you thought GCC was 100% compliant, I cried when you thought your snippet had defined behavior according to the C++ standard), I can't help but feel you're not qualified to make such a statement, especially when you haven't even used the tool in question.

Quote:
I'm using GCC b/c, well, it's free, easy to get a hold of, and I like to try to follow standards when I can. So as far as I know the MS compiler is out.


MSVC2005 Express is freely available, easy to get ahold of (from Microsoft's own site), and compiling my code with it has caught plenty of nonstandard code which GCC didn't so much as squeak about.

(The opposite also holds true.)

Quote:
Which C++ compiler is best?


This question is flawed, in that it assumes there is a best.

What's better: A phillips screwdriver, or a flatheaded one? The answer: It depends on the situation.

Which should be in your toolbox: A phillips screwdriver, or a flatheaded one? The answer: Both.

Both GCC and MSVC are in my toolbox.

Share this post


Link to post
Share on other sites
I've found out that ICL performs actually far better than the VSC++ at least before the latest visual studio addition. Also I particularly dislike the error codes that VSC++ produces. GCC is a little bit better, but very still obscure especially in terms of template errors.

As far as I know GCC is not 100% standards compliant, because it doesn't utilize export keyword at all yet. Neither does VSC, but VSC has a whole set of its own problems in terms of standards compliance.

All in all gcc is not very good at optimizing, but it is available on almost any fathomable platform. It is a great tool if you're not stuck in the dead-end field of windows development.

Visual Studio and especially .Net development makes me want to slice my wrists. You can't really choose your projects and majority of the projects tend to be like Java projects; plain boring. For some reason I haven't found VS that pleasant at all. On my current work computer (older Amd 64) the newest addition performs like a Java app, which is absolutely sickening.

edit:
Also ICC is a lot like GCC so if you can shell out extra 400 I'd get it if performance is that important to you.

Share this post


Link to post
Share on other sites
Quote:
Original post by Captain GoatseIt is a great tool if you're not stuck in the dead-end field of windows development.


Quote:
You can't really choose your projects and majority of the projects tend to be like Java projects; plain boring.


I am officially speechless.

Share this post


Link to post
Share on other sites
Quote:
Original post by MaulingMonkey
Quote:
Which C++ compiler is best?
This question is flawed, in that it assumes there is a best.

What's better: A phillips screwdriver, or a flatheaded one? The answer: It depends on the situation.

Which should be in your toolbox: A phillips screwdriver, or a flatheaded one? The answer: Both.

Both GCC and MSVC are in my toolbox.
Winnar! Seriously though, QFE, that is by far the best response I've seen to this thread.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this