Неправильный тест скорости с использованием time.clock () между синхронным и асинхронным случаями?

Я читаю учебник по gevent, и он предоставляет образцы кодов для демонстрации для синхронных и асинхронных случаев:

import gevent
import random

def task(pid):
    """
    Some non-deterministic task
    """
    gevent.sleep(random.randint(0,2)*0.001)
    print('Task', pid, 'done')

def synchronous():
    for i in range(1,10):
        task(i)

def asynchronous():
    threads = [gevent.spawn(task, i) for i in xrange(1000)]
    gevent.joinall(threads)

В этой статье объясняется, что «порядок выполнения в случае async по существу случайный и что общее время выполнения в случае async намного меньше, чем в случае синхронизации». Поэтому я использовал модуль time, чтобы проверить это:

print('Synchronous:')
start1 = time.clock()
synchronous()
end1 = time.clock()
print "%.2gs" % (end1-start1)

print('Asynchronous:')
start2 = time.clock()
asynchronous()
end2 = time.clock()
print "%.2gs" % (end2-start2)

Однако время, выполняемое «асинхронным», намного больше, чем «синхронное»:

ubuntu@ip:/tmp$ python gevent_as.py
Synchronous:
0.32s
Asynchronous:
0.64s
ubuntu@ip:/tmp$ python gevent_as.py
Synchronous:
0.3s
Asynchronous:
0.61s

Я хочу знать, что не так с моей тестовой программой? Спасибо.


person zfz    schedule 23.11.2012    source источник


Ответы (2)


Это проблема time.clock (), которая не работает должным образом в ubuntu. Подробнее см. Ссылку: Python - time.clock () vs. time.time () - точность?

Я поменял тестовую программу:

print('Synchronous:')
start1 = time.time()
synchronous()
end1 = time.time()
print "%.2gs" % (end1-start1)

print('Asynchronous:')
start2 = time.time()
asynchronous()
end2 = time.time()
print "%.2gs" % (end2-start2)

Тогда тестовая скорость «асинхронного» намного выше, чем «синхронного»:

ubuntu@ip:/tmp$ python gevent_as.py
Synchronous:
1.1s
Asynchronous:
0.057s
person zfz    schedule 23.11.2012

Наверное, спальные места очень маленькие и накладные расходы. Попробуйте заменить 0,001 на 0,1.

person Denis Bilenko    schedule 23.11.2012