VS2012 Just Got Slow

Started by
4 comments, last by Endemoniada 11 years ago

Hi guys,

I have a simple line of code that I call to set the values of a vertex:

setv(v++, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, color);

It's not inline and there are no macros. When I add about 150 of those and build the 'generating code' part takes a long time, like 5 seconds; without the lines it's pretty much instant. I don't understand. Thanks.

I'm using VS2012 on 32-bit Win8 Pro.

Advertisement

What does setv do? Is it templated? How is it defined?

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

Or is it possible that calling setv switches on link time code generation for the whole program? In addition to Bacterius' questions, I'd like to add "Is setv from a statically linked library? How was that library compiled?"

I'm pretty sure you just ran into the "Link-time Code Generation" feature of VS2012. As the name suggests, code generation is done during linking the whole program, not while compiling each source file.

This is done to be able to optimize across object file boundaries, which MS calls "Whole Program Optimization". Unfortunately, this considerably slows down builds.

Since it is an optimization technique, it should be turned off for debug builds. So to verify that this is in fact the problem, check if the debug build has the same problem. If not, it is probably the Link-time Code Generation.

To turn it off, right-click your project in Solution Explorer, and select "Properties". Then, go to "Configuration Properties", "Linker", "Optimization". Change the "Link Time Code Generation" property to "Default". Make sure that you do this for all the libraries in your solution!

That should speed up your build again, hopefully...

My experience with MSVC (and I admit I haven't done serious work in MSVC 2012 yet) is, that even if you switch off link time code generation but then link a static library which has link time code generation enabled, your whole program will be linked with link time code generation. To my knowledge there is no way around that without recompiling the library in question without LTCG.

Hi guys, the setv() function is simply prototyped in a .h file and defined in a .cpp file that are part of my project. Here it is:


// in numerical.h
void setv(vertex* dst,float x,float y,float z,float nx,float ny,float nz,DWORD clr);

// in numerical.cpp
void setv(vertex* dst,float x,float y,float z,float nx,float ny,float nz,DWORD clr)
{
 dst->x=x;
 dst->y=y;
 dst->z=z;

 dst->nx=nx;
 dst->ny=ny;
 dst->nz=nz;

 dst->u=0.0f;
 dst->v=0.0f;

 dst->clr=clr;
}

I just tested it and you guys are right, it does not happen in debug. That's a relief because I thought something was messed up that I wouldn't be able to find. Thanks everyone.

This topic is closed to new replies.

Advertisement