Guido van Rossum <gu...@python.org>: > Yeah, so the pyftp fix is to keep track of how many timers were > cancelled, and if the number exceeds a threshold it just recreates the > heap, something like > > heap = [x for x in heap if not x.cancelled] > heapify(heap)
I measured my target use case with a simple emulation on my linux PC. The simple test case emulates this scenario: Start N connections at frequency F and have each connection start a timer T. Then, rotate over the connections at the same frequency F restarting timer T. Stop after a duration that is much greater than T. Four different timer implementations were considered: HEAPQ: straight heapq HEAPQ*: heapq with the pyftp fix (reheapify whenever 80% of the outstanding timers have been canceled) SDICT: sorteddict (my C implementation) PyAVL: Python AVL tree (my implementation) Here are the results: N = 1000, F = 100 Hz, T = 10 min, duration 1 hr ============================================= Virt Res max len() urs sys CPU MB MB s s % ============================================= HEAPQ 22 16 60001 21.5 4.3 0.7 HEAPQ* 11 7 5000 18.4 4.2 0.6 SDICT 11 6 1000 18.2 3.9 0.6 PyAVL 11 6 1000 39.3 3.6 1.2 ============================================= N = 10000, F = 1000 Hz, T = 10 min, duration 1 hr ============================================= Virt Res max len() urs sys CPU MB MB s s % ============================================= HEAPQ 125 120 600044 223.0 25.8 6.9 HEAPQ* 21 16 50000 186.8 30.0 6.0 SDICT 15 10 10000 196.6 25.7 6.2 PyAVL 16 11 10000 412.5 22.3 12.1 ============================================= Conclusions: * The CPU load is almost identical in HEAPQ, HEAPQ* and SDICT. * HEAPQ* is better than HEAPQ because of the memory burden. * PyAVL is not all that bad compared with SDICT. Marko _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com