Fixing Jekyll Build Time

I had slightly neglected this blog for a while - I had a lot of drafts and random notes about the place because my local build for Jekyll was taking 12 to 40 minutes to build. I had a few hours to kill so it was finally time to give this a bit of time.

A good way to analyze where the problems are are to run jekyll serve --profile which indicates the build time for each file. From the below, you can see that my problems were quite clearly in the _layouts/post.html and _includes\post\related_posts.html

C:\Users\twulz\Documents\GitHub\Twulz.github.io>jekyll serve --profile
Configuration file: C:/Users/twulz/Documents/GitHub/Twulz.github.io/_config.yml
            Source: .
       Destination: ./_site
 Incremental build: disabled. Enable with --incremental
      Generating...
  Populating LSI...
Rebuilding index...

    Liquid Warning: Liquid syntax error (line 12): Expected id but found number in "post in site.categories.3dprinter reversed" in engprojects/printer/index.html

Filename                                                   | Count |    Bytes |    Time
-----------------------------------------------------------+-------+----------+--------
_layouts/post.html                                         |    44 |  599.33K | 460.732
_includes/post/related_posts.html                          |    47 |   49.28K | 460.347
_layouts/default.html                                      |    70 | 2488.55K |   1.384
_includes/asides.html                                      |    70 | 1218.98K |   0.819
_includes/asides/archive_tabs.html                         |    70 |  927.09K |   0.406
_includes/libs/list_tags                                   |   115 |  626.27K |   0.340
_includes/asides/recent_posts.html                         |    70 |  223.95K |   0.224
_includes/post/post_meta.html                              |    47 |   62.29K |   0.204
_includes/libs/list_categories                             |   115 |  319.73K |   0.189
_includes/navbar.html                                      |    72 |  207.82K |   0.102
_includes/head.html                                        |    72 |  132.12K |   0.085
_includes/bottom.html                                      |    72 |   95.03K |   0.083
atom.xml                                                   |     1 |  467.32K |   0.077
_includes/libs/list_pages                                  |     3 |   63.25K |   0.076
blog/tags.html                                             |     1 |   53.31K |   0.064
assets/bootstrap-2.1.1/js/bootstrap.custom.js              |     1 |   18.45K |   0.055
index.html                                                 |     1 |    9.07K |   0.040
blog/categories.html                                       |     1 |   26.63K |   0.039
_includes/post/post_pagenation.html                        |    47 |   22.76K |   0.032
_includes/post/socials_large.html                          |    47 |   63.38K |   0.032
assets/js/script.js                                        |     1 |    4.50K |   0.029
assets/bootstrap-2.3.2/js/bootstrap.custom.js              |     1 |   27.96K |   0.028
_includes/asides/tweets.html                               |    70 |   38.62K |   0.024
_posts/2016-02-18-rediscovering-the-blog.md                |     1 |   18.79K |   0.020
blog/archives.html                                         |     1 |   11.14K |   0.019
page4/index.html                                           |     1 |    8.20K |   0.018
_includes/script.html                                      |    72 |   23.91K |   0.018
_includes/footer.html                                      |    72 |   13.08K |   0.017
page3/index.html                                           |     1 |    9.37K |   0.016
page2/index.html                                           |     1 |    8.91K |   0.015
_includes/header.html                                      |    72 |   12.16K |   0.014
sitemap.xml                                                |     1 |   10.50K |   0.014
assets/css/style.css                                       |     1 |    9.11K |   0.014
_layouts/single-no-sidebar.html                            |     2 |   20.15K |   0.013
page5/index.html                                           |     1 |    3.56K |   0.010
_layouts/single-with-sidebar.html                          |     3 |    9.23K |   0.010
_includes/libs/truncate_exec                               |     5 |    1.49K |   0.009
_includes/post/comment.html                                |    47 |    0.00K |   0.009
assets/bootstrap-2.3.2/css/bootstrap.custom.css            |     1 |  103.51K |   0.009
assets/bootstrap-2.3.2/css/bootstrap-responsive.custom.css |     1 |   16.57K |   0.006
_includes/asides/about.html                                |    70 |   13.95K |   0.005
home.html                                                  |     1 |    2.01K |   0.005
rss.xml                                                    |     1 |    7.53K |   0.004
engprojects/other/index.html                               |     1 |    1.58K |   0.002
_includes/asides/github.html                               |    70 |   13.81K |   0.002
_includes/libs/truncate_start                              |     5 |    0.00K |   0.002
_includes/pagenation.html                                  |     5 |    1.39K |   0.002
_includes/libs/thumbnail                                   |     5 |    0.00K |   0.002
engprojects/printer/index.html                             |     1 |    1.52K |   0.002
_includes/libs/truncate_end                                |     5 |    0.00K |   0.001


                    done in 471.247 seconds.
 Auto-regeneration: enabled for '.'
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:90: warning: already initialized constant FileUtils::VERSION
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/fileutils-1.2.0/lib/fileutils/version.rb:4: warning: previous definition of VERSION was here
C:/Ruby25-x64/lib/ruby/2.5.0/x64-mingw32/etc.so: warning: already initialized constant Struct::Passwd
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1188: warning: already initialized constant FileUtils::Entry_::S_IF_DOOR
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/fileutils-1.2.0/lib/fileutils.rb:1267: warning: previous definition of S_IF_DOOR was here
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1444: warning: already initialized constant FileUtils::Entry_::DIRECTORY_TERM
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/fileutils-1.2.0/lib/fileutils.rb:1545: warning: previous definition of DIRECTORY_TERM was here
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1448: warning: already initialized constant FileUtils::Entry_::SYSCASE
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/fileutils-1.2.0/lib/fileutils.rb:1549: warning: previous definition of SYSCASE was here
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1501: warning: already initialized constant FileUtils::OPT_TABLE
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/fileutils-1.2.0/lib/fileutils.rb:1602: warning: previous definition of OPT_TABLE was here
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1555: warning: already initialized constant FileUtils::LOW_METHODS
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/fileutils-1.2.0/lib/fileutils.rb:1656: warning: previous definition of LOW_METHODS was here
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb:1562: warning: already initialized constant FileUtils::METHODS
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/fileutils-1.2.0/lib/fileutils.rb:1663: warning: previous definition of METHODS was here
    Server address: http://127.0.0.1:4000
  Server running... press ctrl-c to stop.

The problem seemed to be the loop in the related_posts; when I set this to be 1 instead of 5 I got the build time down to 8 minutes and was only a few seconds with the loop completely removed so this was definitely the source of the problem.

                    <nav id="related-posts" class="well">
                        <h3>You might also like</h3>
                        <ul>

                            <li class="related-post">
                                <span>February 16, 2020</span> - 
                                <a href="/server/2020/02/16/installing-mysql-phpmyadmin.html">Installing MySQL and phpMyAdmin on the Server</a>
                            </li>

                            <li class="related-post">
                                <span>February 15, 2020</span> - 
                                <a href="/node-app/jenkins/2020/02/15/configuring-https-for-jenkins.html">Configuring HTTPS for Jenkins on the All-in-One Server</a>
                            </li>

                            <li class="related-post">
                                <span>February 04, 2020</span> - 
                                <a href="/node-app/2020/02/04/configuring-https.html">Configuring HTTPS for the Server</a>
                            </li>

                            <li class="related-post">
                                <span>January 21, 2020</span> - 
                                <a href="/node-app/jenkins/2020/01/21/all-in-one-server.html">Configuring the All-in-One Server</a>
                            </li>

                            <li class="related-post">
                                <span>December 10, 2019</span> - 
                                <a href="/node-app/2019/12/10/apache-reverse-proxy-for-node-app-server.html">Adding an Apache Reverse Proxy for the Node App Server</a>
                            </li>

                        </ul>
                    </nav>

I posted all of this info on a Stack Overflow Question as I was at my wits’ end - I could have removed the related posts loop but I wanted a more long-term solution. A friendly user pointed out that as GitHub Pages doesn’t support lsi anyway, setting lsi:false in my _config.yml file was enough to allow my local builds to cut down to 15 seconds.

# Configuration for jekyll
# NOTICE: GitHub forces to set `safe: true` in order to prohibit using plugins.
safe: false
source: .
destination: ./_site
plugins_dir: ./_plugins
lsi: false
kramdown:
  input: GFM
  syntax_highlighter: rouge
excerpt_separator: <!--more-->
repository: Twulz/Twulz.github.io