Jump to content

  • Log In with Google      Sign In   
  • Create Account

VS2012 Just Got Slow


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 Endemoniada   Members   -  Reputation: 312

Like
0Likes
Like

Posted 25 March 2013 - 04:40 PM

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.

 



Sponsor:

#2 Bacterius   Crossbones+   -  Reputation: 9306

Like
0Likes
Like

Posted 25 March 2013 - 06:53 PM

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


The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis


#3 BitMaster   Crossbones+   -  Reputation: 4442

Like
0Likes
Like

Posted 26 March 2013 - 02:19 AM

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?"

#4 sgt_barnes   Members   -  Reputation: 621

Like
1Likes
Like

Posted 26 March 2013 - 07:35 AM

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...



#5 BitMaster   Crossbones+   -  Reputation: 4442

Like
0Likes
Like

Posted 26 March 2013 - 07:47 AM

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.

#6 Endemoniada   Members   -  Reputation: 312

Like
0Likes
Like

Posted 26 March 2013 - 01:58 PM

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.


Edited by Endemoniada, 26 March 2013 - 01:59 PM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS