tempo di compilazione

  • Creatore
    Topic
  • #59844
    Up
    0
    Down
    ::


    Buonasera a tutti,
    qualcuno sa se e come è possibile risalire alla durata della compilazione di un documento con LaTeX (non mi sembra ci sia scritto nel file .log)?

    Grazie
    Fra

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #59845
      Up
      0
      Down
      ::

      Buonasera a tutti,
      qualcuno sa se e come è possibile risalire alla durata della compilazione di un documento con LaTeX (non mi sembra ci sia scritto nel file .log)?

      `\usepackage{atveryend}
      \AtVeryEndDocument{\message{%
      *********************************^^J%
      * Elapsed time
      \number\numexpr1000*\pdfelapsedtime/65536\relax\space
      milliseconds^^J%
      *********************************^^J%
      }}`
      Non è una misura accuratissima, ma non credo che ti serva tanto di più.

      Se hai un sistema Unix puoi usare time (compilando dalla shell):
      `time pdflatex file`
      Ciao
      Enrico

    • #59846
      Up
      0
      Down
      ::


      Grazie mille!
      Per curiosità riporto il risultato della compilazione di un file di circa 50 pagine con molte figure in tikz su file esterni utilizzando il comando time!
      `TeXLive 2010:
      real 0m6.848s
      user 0m4.679s
      sys 0m0.214s
      TeXLive 2011 pretest:
      real 0m6.110s
      user 0m4.668s
      sys 0m0.143s`
      Entrambe le compilazioni con eseguibili a 64bit

      Ciao
      Fra

    • #59847
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Enrico di ha già dato la soluzione, quindi potrei starmene zitto; ma ritengo che segnalare la documentazione sia sempre utile.

        Esegui texdoc pdftex e guarda l’indice a destra: clicca su Timekeeping e vedrai la descrizione dei due comandi primitivi di pdf(La)TeX, forniti dal motore di composizione pdftex. La descrizione è utilissima anche per capire quello che ha scritto Enrico, e per, eventualmente, fare altre cose usando anche il comando \pdfresettimer oltre che \pdfelapsedtime.

        Naturalmente si il codice di Enrico e quanto scritto nella documentazione funzionano solo se il motore di composizione è pdftex, il che, oggi, significa non solo con pdf(La(TeX, ma anche con (La)TeX, visto che il motore è sempre lo stesso, cambia solo il valore numerico contenuto nel contatore \pdfoutput. Non sono sicuro invece che funzioni con Xe{(La)TeX; probabilmente sì, ma non ho mai provato.

        Contrordine: ho provato.

        Infatti non funziona con Xe(La)TeX, quindi il cronometro è una particolarità di pdftex. Non solo, ma ho constatato che nemmeno il programma tex di Knuth è in grado di farlo, perché il suo registro di sola lettura \time (usabile anche con Xe(La)TeX) contiene solo il numero (intero) di minuti trascorsi dall’inizio del giorno; inoltre viene impostato all’inizio del job, non viene (apparentemente) aggiornato durante l’esecuzione; è vero che un minuto è lungo, quindi finora non ho potuto verificare se venga aggiornato durante l’esecuzione; tuttavia se anche lo fosse la risoluzione di un minuto è troppo scarsa per i calcolatori di oggi che viaggiano a miliardi di operazioni al secondo.

        Per ora non vedo nessuna speranza di poter far calcolare internamente i tempi di esecuzione a programmi di compilazione diversi da quelli azionati dal motore pdftex.

      • #59848
        Up
        0
        Down
        ::


        Buongiorno,
        ringrazio OldClaudio per avermi indicato la documentazione dove andare a guardare. Andando a leggere cosa fa \pdfelapsedtime, infatti, mi è sorto un dubbio sul codice scritto da Enrico. Se questa macro contiene il numero di “secondi scalati”, cioè secondi divisi per 65536, per avere il risultato in millisecondi non bisognerebbe dividere per 1000 e moltiplicare per 65536 che è esattamente il contrario di ciò che fa il codice?

        Grazie mille per la pazienza
        Fra

        Edit: il tutto mi è più oscuro in quanto provando il codice effettivamente da risultati giusti (il che, in realtà, non mi stupisce affatto!)

      • #59849
        Up
        0
        Down
        ::

        Buongiorno,
        ringrazio OldClaudio per avermi indicato la documentazione dove andare a guardare. Andando a leggere cosa fa \pdfelapsedtime, infatti, mi è sorto un dubbio sul codice scritto da Enrico. Se questa macro contiene il numero di “secondi scalati”, cioè secondi divisi per 65536, per avere il risultato in millisecondi non bisognerebbe dividere per 1000 e moltiplicare per 65536 che è esattamente il contrario di ciò che fa il codice?

        Grazie mille per la pazienza
        Fra

        Edit: il tutto mi è più oscuro in quanto provando il codice effettivamente da risultati giusti (il che, in realtà, non mi stupisce affatto!)

        Quel “seconds divided by 65536” contraddice in modo evidente il numero indicato subito dopo: 323115 moltiplicato per 65536 darebbe un tempo piuttosto lungo. È chiaro che l’autore intende “il numero di (secondi/65536)”.

        Confermo che si tratta di una primitiva specifica di pdfTeX; non c’è in XeTeX né in LuaTeX.

        Ciao
        Enrico

      • #59850
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Semplicemente nel manuale pdftex c’è un errore di stampa, dove c’è scritto “divided”, che doveva essere indicato con “multiplied”. Insomma è la stessa differenza fra i points e gli scaled points.
          Tan’è che ho provato a girare la soluzione in un modo diverso, forse ridondante, ma chiarissimo: assegno il numero prodotto da \pdfelapsedtime ad un registro dimensionale (di tipo TeX, non LaTeX) specificando l’unità di misura sp (scaled points); poi definisco una macro che contiene il valore del registro dimensionale a cui sono state “strappate” le unità di misura. ne ottengo il nomero di punti senza il pt dopo. Stampo poi questa macro:
          `
          \AfterEndDocument{\dimen256=\pdfelapsedtime sp
          \edef\@tempA{\strip@pt\dimen256}
          \PackageInfo{MacroGuida}{Il tempo di esecuzione e' stato pari a \@tempA\space s}}
          `
          Invece di \PackageInfo (che scrive solo sul file .log) si potrebbe usare anche \PackageWarningNoLine che scrive anche sulla console.

          \AfterEndDocument è un comando prodotto dal pacchetto etoolbox, ma il comando e il pacchetto di Enrico fanno lo stesso mestiere.

          Però questo esempio che ti produce direttamente il numero di secondi con il punto decimale seguita da 5 cifre per la parte fratta, è anche la prova provata dell’errore di stampa nella documentazione di pdftex.

          Ho eseguite alcune volte la compilazione dell’Introduzione, senza apportare modifiche di nessuna genere ai file sorgente (seicento e passa pagine con molte figure importate e molte disegnte direttamente) e il tempo di compilazione ogni volta è diverso, perché, appunto si tratta di tempo trascorso da quando il processo è cominciato; nel frattempo il sistema operativo multitasking (nel mio caso SnowLeopard) fa anche altre cose, quindi distribuisce il suo tempo fra i vari processi a cui deve fornire le sue prestazioni. L’Introduzione si compila quindi in tempi che vanno da 11s a 12s (arrotondati all’intero) quindi è del tutto superfluo per processi così “lunghi” stare a specificare i millesimi o frazioni di secondo ancora più piccole, come avviene con il codice indicato sopra.
          Se invece il processo è rapido le frazioni di secondo sono importanti; nel tuo esempio controllato dal comando time del sistema operativo, dove non superi un quinto di secondo, le frazioni sono decisamente importanti, anche se probabilmente non saranno mai le stesse.

        • #59851
          Up
          0
          Down
          ::


          Effettivamente! Anche perchè, come dice il manuale, il numero massimo di secondi visualizzabile è 32767 che è molto minore di 323115*65536 dato nell’esempio, come hai già fatto notare tu in pratica.

          Grazie ancora ad entrambi
          Fra

      Visualizzazione 6 filoni di risposte
      • Devi essere connesso per rispondere a questo topic.

      Go to top