How to measure the compilation time of a document?

There are quite a few options. Here are three:

From within LaTeX, using l3benchmark

Add this to the very top of your document:

\RequirePackage{l3benchmark}
\ExplSyntaxOn
\AtEndDocument { \benchmark_toc: }
\benchmark_tic:
\ExplSyntaxOff

The \benchmark_tic: instruction will start a timer, and \AtEndDocument the corresponding \benchmark_toc: will measure the time elapsed since the \benchmark_tic:. This will usually be enough to measure the execution time of your document: it will only include an extra \ExplSyntaxOff and exclude some of the \end{document} code. If you want to be really precise, then you can load etoolbox and replace that with (test document included):

\RequirePackage{etoolbox}
\RequirePackage{l3benchmark}
\ExplSyntaxOn
\AfterEndDocument { \benchmark_toc: }
\use:n
  {
    \ExplSyntaxOff
    \benchmark_tic:
  }
% Test document:
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1-150]
\end{document}

The \benchmark_tic: will start right before your document, and the \benchmark_toc: will be (almost) the last thing TeX will do before exiting. However this time does not include the initialisation of the TeX engine (should be negligible), and the final processing for the inclusion of fonts (in pdfTeX and LuaTeX) or conversion from the DVI file to PDF (in XeTeX), which may take a little while, depending on the size of the document and the number of included font files.

Running that the terminal (and the .log file) will contain a (l3benchmark) + TIC at the beginning, and then a (l3benchmark) + TOC: 0.745 s before the final messages from the TeX engine.

Using arara to run the job and time it

With the same example document, using an arara header and running it:

% arara: pdflatex
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1-150]
\end{document}

the terminal will show:

phelype@oleinik ~/tex.sx> arara test.tex
  __ _ _ __ __ _ _ __ __ _ 
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Processing 'test.tex' (size: 60 KB, last modified: 08/26/2019
17:14:41), please wait.

(PDFLaTeX) PDFLaTeX engine .............................. SUCCESS

Total: 1.22 seconds
phelype@oleinik ~/tex.sx>

so you have to bear in mind that arara adds some overhead time, but it shouldn't be significant in larger jobs. If you run arara with -l (--log) it will create an arara.log file, whose final line will be something like:

26 ago 2019 17:20:20.548 INFO  - Total: 1.22 seconds

Using some other tool

If you're on Linux, you can use the command line tool time:

phelype@oleinik ~/tex.sx> time pdflatex test.tex

after the processing the terminal will look like this:

Transcript written on test.log.

real    0m1.009s
user    0m0.984s
sys     0m0.024s

indicating approximately 1 s of run time.

Other systems might have other tools to do the same task, e.g. measure-command in Windows Powershell.


Conclusion?

The same document consistently reported in my system (approximate times, but not much difference between one run and the next):

(l3benchmark) + TOC: 0.745 s
Total: 1.22 seconds
real    0m1.009s

which probably means that TeX took 0.745 s to process my document, another 0.264 s (1.009 – 0.745) for the inclusion of fonts and closing the PDF file, and arara took 0.220 s on top of that to do its thing. So depending on what exactly you want to measure, one way or another will give a better result, but all should be approximately equal for large enough jobs.

Note that since l3benchmark measures from within the TeX run, the time it will print correspond to one TeX run only. If your document needs multiple runs and/or external tools like BibTeX, MakeIndex, etc. then the time that arara or time or whatever tool will print will certainly be bigger than the time printed by l3benchmark, because they add up the time to run all processes, rather than one single TeX run.

Again, depends what on what you want to measure: if you're interested in the performance of your TeX code, then go for l3benchmark, but if you're interested in the time that it really takes to run the job, then use something else.


Building on Phelype's answer under "Using some other tool":

On Windows you can use Measure-Command in PowerShell to get results similar to time in Linux, e.g:

measure-command {latexmk sample-document}

More details at this link: https://stackoverflow.com/questions/3513650/timing-a-commands-execution-in-powershell

I have a long document (~70 pages with a long bibliography and lots of fonts) that takes 1 min 43 sec for first compilation, but l3benchmark only records 21 sec in the .log file.

Note: measure-command does not work with the continuous preview function of latexmk.