De cara a optimizar la generación de las páginas del blog
con multiprogramación, he querido registrar el tiempo que tarda en
ejecutar la generación en el ordenador que se genera, para compararla
después con la optimización. Para mi sorpresa, la mayor parte del os 8
segundos que lleva la generación se la lleva el leer y compilar el
fichero Lisp que contiene las entradas antiguas (1.3MB), mientras que
la generación de todas las páginas no tarda más de 4 segundos:
[dsevilla@neuromancer:~/svn/blog]$ sbcl --script packages.lisp
Doing pre-calculations...
Generating index page...
Evaluation took:
0.116 seconds of real time
0.120000 seconds of total run time (0.080000 user, 0.040000 system)
[ Run times consist of 0.040 seconds GC time, and 0.080 seconds non-GC time. ]
103.45% CPU
325,871,901 processor cycles
63,697,264 bytes consed
Generating post pages...
Evaluation took:
0.408 seconds of real time
0.410000 seconds of total run time (0.270000 user, 0.140000 system)
[ Run times consist of 0.010 seconds GC time, and 0.400 seconds non-GC time. ]
100.49% CPU
1,144,029,612 processor cycles
167,055,120 bytes consed
Generating categories pages...
Evaluation took:
0.074 seconds of real time
0.070000 seconds of total run time (0.070000 user, 0.000000 system)
94.59% CPU
209,026,050 processor cycles
39,985,040 bytes consed
Generating archives pages...
Evaluation took:
0.086 seconds of real time
0.090000 seconds of total run time (0.090000 user, 0.000000 system)
104.65% CPU
240,093,459 processor cycles
43,278,720 bytes consed
Generating RSS...
Evaluation took:
0.084 seconds of real time
0.080000 seconds of total run time (0.080000 user, 0.000000 system)
[ Run times consist of 0.020 seconds GC time, and 0.060 seconds non-GC time. ]
95.24% CPU
236,784,003 processor cycles
35,828,208 bytes consed
Esto hace que la optimización, como máximo, sólo pueda
reducir esos 0,4 segundos que tarda la generación. Aún así lo intentaré
como un ejercicio de programación. La otra idea será ver optimizar el
proceso de carga quizá a través de pre-compilación de los ficheros
.lisp. Por cierto, para que luego digan que los lenguajes
interpretados son lentos... 1 segundo en generar 34MB de ficheros de
texto.
La última sorpresa... Por casualidad he probado clisp
... Bien, aquí la carga de los ficheros .lisp es
instantánea, y la ejecución es incluso más rápida (diría incluso
increíblemente rápida:
[dsevilla@neuromancer:~/svn/blog]$ clisp packages.lisp
Doing pre-calculations...
Generating index page...
Real time: 0.186066 sec.
Run time: 0.19 sec.
Space: 24960736 Bytes
GC: 13, GC time: 0.03 sec.
Generating post pages...
Real time: 0.708989 sec.
Run time: 0.69 sec.
Space: 83706152 Bytes
GC: 36, GC time: 0.06 sec.
Generating categories pages...
Real time: 0.051339 sec.
Run time: 0.05 sec.
Space: 11157832 Bytes
GC: 5, GC time: 0.0 sec.
Generating archives pages...
Real time: 0.249124 sec.
Run time: 0.25 sec.
Space: 13408648 Bytes
GC: 6, GC time: 0.02 sec.
Generating RSS...
Real time: 0.891364 sec.
Run time: 0.88 sec.
Space: 20991880 Bytes
GC: 9, GC time: 0.05 sec.
Comparando el tiempo de ejecución visto por el usuario:
[dsevilla@neuromancer:~/svn/blog]$ time clisp packages.lisp
real 0m2.320s
user 0m1.970s
sys 0m0.310s
[dsevilla@neuromancer:~/svn/blog]$ time sbcl --script packages.lisp
real 0m10.405s
user 0m9.940s
sys 0m0.440s
Esto es, ¡5 veces más rápido en general clisp que sbcl! Sin
embargo, mirando los datos de cada parte, hay resultados muy extraños
e inconsistentes. Por ejemplo, clisp tarda casi un segundo en generar
RSS, mientras que sbcl tarda 0,08 segundos (un orden de magnitud
menos). Estudiaré el código para ver dónde puede estar el problema,
pero por ahora, usaré clisp para generar el blog, aunque use sbcl, con
el magnífico entorno Slime para Emacs para seguir programando y probando.