2020/05/02

LaTeX: número de pastas vs tempo de compilação

Observando a alguns dias que o tempo de compilação de arquivos .tex estavam demorando muito para gerar o resultado em .pdf através do comando
pdfLaTex.exe <arquivo>
Levou-me a uma investigação a respeito. Dentre outras ações tomadas, a que mais teve impacto no tempo de execução foi a junção de vários arquivos de imagens, separadas por capítulo e subcapítulo, em uma única divisão por capítulo apenas.

Antes
\fig\capitulo01\
\fig\capitulo02\
\fig\capitulo03\experimento01\
\fig\capitulo03\experimento02\
\fig\capitulo04\
\fig\capitulo04\caso01\
\fig\capitulo04\extra\


Depois
\fig\capitulo01\
\fig\capitulo02\
\fig\capitulo03\
\fig\capitulo04\

Ao fazer o ajuste citado, foi possível observar uma melhora sensível no tempo de compilação, que reduziu cerca de 75% do tempo original.
Em arquivos com um número menor de imagens, é suficiente manter todos na pasta 
\fig\

Como testar os tempos de compilação?

Uma das formas utilizado foi colocar os dois conjuntos de arquivos a serem compilados em pastas diferentes e utilizar um arquivo em lote tipo bath.

REM Este arquivo bath compila o LaTeX dentro da pasta especificada
cd <pasta_tipo01>
pdflatex.exe -synctex=1 --enable-write18 -interaction=nonstopmode <nome_do_arquivo>.tex
cd ..

O outro arquivo bath só altera a linha
cd <pasta_tipo02>

Pronto, agora no Python, basta fazer um looping para examinar o tempo de compilação de cada um dos tipo e tirar a média.
Pode ocorrer da primeira compilação apresentar um tempo elevado, devido a geração dos indices e outros arquivos auxiliares, bem como devido a outro processo em paralelo na máquina, no entanto, na média geral é possível saber o ganho desta simplificação das pastas.

import os
import time
import numpy as np
arrTempos = []
for i in range(10):   #optou-se por 10 ciclos para tirar a média
    # (1) CMD /K – execute a command and then remain:
    # (2) CMD /C – execute a command and then terminate:
    t = time.time()
    os.system('cmd /c <bath_01>.bat') #com as pastas juntas
    elapsed01 = time.time() - t
    os.system('cmd /c <bath_02>.bat') #com as pastas separadas
    elapsed02 = time.time() - t
    arrTempos.append([elapsed01,elapsed02])
print(np.mean(arrTempos, axis=0))
Nos meus teste, em um arquivo LaTeX de alguns capítulos e saída PDF de cerca de 5MB em ~150 páginas, a média dos tempos para 10 rodadas foram
[ 88.78563097 244.51468055]
Em outra palavras, o tempo de compilação para pastas_juntas foram cerca de 1/3 em relação ao outro método.
Os tempos parciais para pastas_juntas e pastas_separadas foram
[78.91398334503174, 228.06645393371582]
[83.48539805412292, 255.4984953403473]
[94.20977091789246, 269.09853291511536]
[93.2732846736908, 263.52228140830994]
[80.58168148994446, 214.4084243774414]
[95.5419991016388, 264.4155135154724]
[83.58538913726807, 242.64917302131653]
[103.91669821739197, 273.17346358299255]
[99.13573002815247, 228.97257685661316]
[75.21237468719482, 205.3418905735016]



Nenhum comentário: