Para aplicar lo que hemos aprendido de subrutinas os pediría que modifiquéis la solución del problema ahora separando todas las tareas indivisibles en subrutinas. Podéis además comparar la velocidad de ejecución de ambos programas, el viejo y el modificado, usando el programa time en el terminal UNIX*.
Otra manera de valorar el rendimiento de un programa que use subrutinas es ejecutarlo de esta
manera: perl -d:DProf programa.pl [argumentos que necesite]
. Tras su ejecución se habrá
generado un archivo llamado tmon.out
que pasaremos como argumento a otro programa:
dprofpp tmon.out
, generando una salida como esta, donde se ve qué coste empírico
tiene cada subrutina (del módulo dnalib) durante la ejecución del programa. Por ejemplo,
la subrutina get_sq_dist fue invocada 124763 veces consumiendo un 64.9 por cieto del tiempo total:
Exporter::export has -1 unstacked calls in outer Exporter::Heavy::heavy_export has 1 unstacked calls in outer Total Elapsed Time = 34.29820 Seconds User+System Time = 16.72820 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 64.9 10.85 10.858 124763 0.0000 0.0000 dnalib::get_sq_dist 23.0 3.852 7.964 3 1.2841 2.6548 dnalib::get_template_contacts 14.4 2.410 7.221 588 0.0041 0.0123 dnalib::check_base_contact 6.31 1.055 2.990 3 0.3517 0.9968 dnalib::calc_DNA_complementarity 3.03 0.507 11.056 3 0.1690 3.6853 dnalib::predict_sites_complex 0.72 0.121 0.121 28932 0.0000 0.0000 dnalib::tobase4 0.50 0.084 0.084 30720 0.0000 0.0000 dnalib::num2compbase 0.42 0.070 0.070 1 0.0700 0.0700 dnalib::extract_BLAST_TF_alignments 0.41 0.069 0.069 581 0.0001 0.0001 dnalib::calc_Pvalue 0.41 0.069 0.069 598 0.0001 0.0001 dnalib::calc_family_preferences 0.24 0.040 0.050 5 0.0080 0.0100 main::BEGIN 0.23 0.039 8.113 1 0.0391 8.1126 dnalib::build_CM_complexes 0.20 0.034 0.034 30720 0.0000 0.0000 dnalib::num2base 0.18 0.030 0.030 3 0.0100 0.0100 dnalib::get_protein_coordinates 0.17 0.029 0.029 581 0.0001 0.0001 dnalib::calc_def_cost
Bruno Contreras-Moreira