[Python-modules-team] Bug#772506: time spent in ffi (via OpenSSL)

David Douard david.douard at logilab.fr
Sun Dec 7 23:04:53 UTC 2014


After a bit more investigation, the culprit is OpenSSL, in which there is the following code 
(in _utils.py which is imported from OpenSSL/__init__.py):

  
  from cryptography.hazmat.bindings.openssl.binding import Binding
  binding = Binding()

and this later Binding() instanciation is the one that takes almost 700ms.


And if we step forward, running:

  import cProfile
  cProfile.run('import OpenSSL', "OSSLstats")
  import pstats
  p=pstats.Stats('OSSLstats')
  p.sort_stats('cumulative').print_stats(20)

  Sun Dec  7 23:37:08 2014    OSSLstats

         982856 function calls (963898 primitive calls) in 0.927 seconds

   Ordered by: cumulative time
   List reduced from 655 to 20 due to restriction <20>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.927    0.927 <string>:1(<module>)
        1    0.001    0.001    0.927    0.927 __init__.py:6(<module>)
        1    0.001    0.001    0.925    0.925 rand.py:5(<module>)
        1    0.001    0.001    0.922    0.922 _util.py:1(<module>)
        1    0.000    0.000    0.920    0.920 binding.py:88(__init__)
        1    0.000    0.000    0.920    0.920 binding.py:91(_ensure_ffi_initialized)
        1    0.000    0.000    0.920    0.920 utils.py:23(build_ffi)
        1    0.000    0.000    0.862    0.862 api.py:90(cdef)
        1    0.000    0.000    0.862    0.862 cparser.py:160(parse)
        1    0.002    0.002    0.862    0.862 cparser.py:171(_internal_parse)
        1    0.000    0.000    0.788    0.788 cparser.py:105(_parse)
        1    0.000    0.000    0.747    0.747 c_parser.py:118(parse)
        1    0.000    0.000    0.747    0.747 yacc.py:261(parse)
        1    0.218    0.218    0.747    0.747 yacc.py:873(parseopt_notrack)
    15098    0.012    0.000    0.179    0.000 c_lexer.py:76(token)
    15098    0.073    0.000    0.167    0.000 lex.py:311(token)
     1603    0.005    0.000    0.069    0.000 cparser.py:238(_parse_decl)
    54251    0.065    0.000    0.065    0.000 {method 'match' of '_sre.SRE_Pattern' objects}
     2074    0.046    0.000    0.058    0.000 c_parser.py:1035(p_pointer)
    72896    0.038    0.000    0.058    0.000 yacc.py:197(__getitem__)


So the time is spent by the _ensure_ffi_initialized class method (of the Binding class) which 
ends up by calling parseopt_notrack which is the slow stuff.

It seems that the time is spent parsing C code when executing  

  ffi.cdef("\n".join(cdef_sources)) (in cryptography/hazmat/bindings/utils.py +57)




-- 

David DOUARD		 LOGILAB
Directeur du département Outils & Systèmes

+33 1 45 32 03 12	 david.douard at logilab.fr
+33 1 83 64 25 26	 http://www.logilab.fr/id/david.douard

Formations - http://www.logilab.fr/formations
Développements - http://www.logilab.fr/services
Gestion de connaissances - http://www.cubicweb.org/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: david_douard.vcf
Type: text/x-vcard
Size: 302 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/python-modules-team/attachments/20141208/00ac0239/attachment.vcf>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.alioth.debian.org/pipermail/python-modules-team/attachments/20141208/00ac0239/attachment.sig>


More information about the Python-modules-team mailing list