0
0

Speedup scons over your small project

yegle 发表于 2014年01月28日 07:00 | Hits: 2744

TL;DR

In yourSConstructfile, add thetoolskeyword argument toEnvironmentandDefaultEnvironmentinitialization to explicitly specify the tools needed in your project. It saves a lot of time.

The Story

My resume was written inLaTeXand convert toPDFusing a handwrittenMakefile, of which I always want to replace using a more advanced automation tool.

So I'm looking atscons. It's written inPythonwhich is a language I like, and looks much simpler thanCMake. But one thing I don't like is the speed.

Here's the originalSConstruct:

convert = Builder(action=[
    "convert -alpha off -density 300 $SOURCE -append $TARGET"])

env = Environment(BUILDERS={"Convert": convert})

pdf = env.PDF("resume.tex")
png = env.Convert('resume.png', pdf)
Default(pdf)

So what thisSConstructfile did is that it compiles theresume.texfile into PDF, and then optionally convert the PDF into a PNG file.

And the time it takes? Here it is:

$ scons -f SConstruct.before --debug=time . |grep ^Total
Total build time: 8.844431 seconds
Total SConscript file execution time: 2.516214 seconds
Total SCons execution time: 0.094147 seconds
Total command execution time: 6.234070 seconds

In the total build time ~8 seconds, ~3 seconds was used in executing theSConstructfile. Let's run a cleanup which make it more obvious:

$ scons -f SConstruct.before --debug=time -c . |grep ^Total
Total build time: 2.669596 seconds
Total SConscript file execution time: 2.579540 seconds
Total SCons execution time: 0.090056 seconds
Total command execution time: 0.000000 seconds

In a total build time ~2.6 seconds, ~2.5 seconds is wasted.

I know that there's a lot posts talking abouthow slowsconsisbut I don't know it could bethatslow. If this is a large project managed byscons, 2.5 seconds seems insignificant but for a simple task like compilingLaTeXfile it's unacceptable.

After a simple profiling it become obvious thatsconstakes too much time in initializing theEnvironmentinstance:

$ python2 -m cProfile -s cumtime `which scons` -f SConstruct.before -c .
...
   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
...
        2    0.000    0.000    2.838    1.419 Environment.py:917(__init__)

Luckily there's aGoFastButtonpage onsconswiki that caught my eyes: too many unnessesarytoolsin theEnvironmentis a cause of slow down.

It's straight forward after figuring out the cause. Here's an updatedSConstruct:

DefaultEnvironment(tools=[])
convert = Builder(action=[
    "convert -alpha off -density 300 $SOURCE -append $TARGET"])

env = Environment(BUILDERS={"Convert": convert}, tools=['pdftex'])

pdf = env.PDF("resume.tex")
png = env.Convert('resume.png', pdf) 
Default(pdf)

Notice thetoolskeyword argument in initializingEnvironment, and thetoolskeyword argument toDefaultEnvironment. The result is a significantly reduced build time (for a small project):

$ scons -f SConstruct.after --debug time . |grep ^Total
Total build time: 6.579649 seconds
Total SConscript file execution time: 0.037326 seconds
Total SCons execution time: 0.112706 seconds
Total command execution time: 6.429617 seconds

$ scons -f SConstruct.after --debug time . -c |grep ^Total
Total build time: 0.122485 seconds
Total SConscript file execution time: 0.030382 seconds
Total SCons execution time: 0.092103 seconds
Total command execution time: 0.000000 seconds

Conclusion?

If you know what you are going to build (you already know it would be aC++project, or in my case buildingPDFfromLaTeX), you'd better tellsconsexplicit what tools you want to be included in theEnvironment. If your project is small, the saved time would be significant.

P.S. I found it hard to decide what tools you want to be included inEnvironment. The full list of available tools can be found inman 1 scons, but there's no description on what those tools do. For example, in my case of compiling*.texfile into*.pdffile, there are three relevant tools available:latex,pdftex,pdflatex. I have to test among them to knowpdflatexis the right one.

原文链接: //blog.yegle.net/2014/01/28/speedup-scons-over-your-small-project/

0     0

我要给这篇文章打分:

可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.

评价列表(0)