[pyar] Cuanto cuesta el reference counting?

Claudio Freire klaussfreire en gmail.com
Mie Mayo 29 12:54:08 ART 2013


2013/5/29 Daniel Moisset <dmoisset en machinalis.com>:
> Alguien ha visto algún artículo/benchmark/rumor de cuanto cuesta el
> reference counting en python, en overhead de CPU?
>
> Es decir, si tuviera infinita memoria y cambiara los incref/decref por nops,
> cuanto más rápido andarían mis programas en python?
>
> Puedo hacer el benchmark yo, pero me encantaría si alguien ya hubiera hecho
> el trabajo antes.


Yo trabajé en un parche para mover los refcounts a un pool, en un
momento, porque el inc/dec genera una avalancha de COW luego de
forkear, así que tengo algo de datos al respecto.

La respuesta es algo compleja.

¿Cuánto cuesta en ciclos?

CPython está muy optimizado para no toquetear refcounts al pedo, pero
el eval loop no zafa, y te cuesta algo así como un 5 a 10% de los
ciclos en bucles muy pero muy ajustaditos (manejar ints o simplemente
pasar referencias de acá para allá). Obvio si hacés operaciones más
pesadas, el cambio es totalmente despreciable.

El tema de COW sin embargo cambia las cosas. Luego de forkear, los
refcounts son pesadísimos de tocar (cada refcount que tocás
potencialmente requiere copiar una página entera), y te cuesta memoria
además de ciclos. Este punto para mí era el más importante.

También está el tema de lo que cuestan en presión de escritura al
caché de datos, que no es moco de pavo. Con tareas mayoritariamente de
lectura, la diferencia es notable, en particular con threading (he
visto 30% de mejoría con el parche que contaba, bajo las condiciones
adecuadas, que son algo poco comunes).

Pero, la mayoría del tiempo, la diferencia está más cerca del 5% que del 30%.

Esa es mi experiencia con python 2.6. 2.7 tiene bytecodes nuevos que
ayudan un poquín en los if, cortesía de unladen swallow, y podría
afectar la medición.



More information about the pyar mailing list