2015-08-27 3 views
0

Мне нужно связаться со встроенной системой через RS232. Для этого я хочу профилировать время, необходимое для отправки ответа на каждую команду.Профилирование Последовательная связь с использованием timeit

Я тестировал этот код, используя два метода: datetime.now() и timeit()

Метод # 1

def resp_time(n,msg): 
    """Given number of tries - n and bytearray list""" 

    msg = bytearray(msg) 
    cnt = 0 
    timer = 0 

    while cnt < n: 
     time.sleep(INTERVAL) 

     a = datetime.datetime.now() 
     ser.flush() 
     ser.write(msg) 

     line = [] 
     for count in ser.read(): 
      line.append(count) 
      if count == '\xFF': 
       # print line 
       break 

     b = datetime.datetime.now() 
     c = b-a 
     # print c.total_seconds()*1000 
     timer = timer + c.total_seconds()*1000 
     cnt = cnt + 1 

    return timer/n 
ser = serial.Serial(COMPORT,BAUDRATE,serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, timeout=16) 
    if ser.isOpen(): 
    print "Serial port opened at: Baud:",COMPORT,BAUDRATE 

cmd = read_file() 
# returns a list of commands [msg1,msg2....] 
n = 100 
for index in cmd: 

    timer = resp_time(n,index) 
    print "Time in msecs over %d runs: %f " % (n,timer) 

Способ № 2

def com_loop(msg): 

    msg = bytearray(msg) 

    time.sleep(INTERVAL) 
    ser.flush() 
    ser.write(msg) 

    line = [] 
    for count in ser.read(): 
     line.append(count) 
     if count == '\xFF': 
      break 
if __name__ == '__main__': 
    import timeit 

    ser = serial.Serial(COMPORT,BAUDRATE,serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, timeout=16) 
    if ser.isOpen(): 
    print "Serial port opened at: Baud:",COMPORT,BAUDRATE 

    cmd = read_file() 
    # returns a list of commands [msg1,msg2....] 
    n = 100 
    for index in cmd: 

    t = timeit.timeit("com_loop(index)","from __main__ import com_loop;index=%s;" % index,number = n) 
    print t/100 

С DateTime я 2 миллисекунды для выполнения команды & с timeit Я получаю 200 миллисекунд за ту же команду.

Я подозреваю, что я не звоню timeit() должным образом, может ли кто-нибудь указать мне в правильном направлении?

ответ

0

Я бы предположил, что 200 мкс ближе к истине, учитывая, что ваш состав будет иметь что-то вроде 115200baud; предполагая, что сообщения имеют длину 8 байтов, передача одного сообщения займет примерно 9/115200 с ~ = 10/100000 = 1/10000 = 100 мкс только на последовательной линии. Быть быстрее, чем это будет довольно невозможно.

Python определенно не является языком выбора, чтобы выполнять хронологическую характеристику в этих масштабах. Вам нужно будет получить логический анализатор или работать очень рядом с последовательным контроллером (который, я надеюсь, напрямую подключен к контроллеру IO вашего ПК, а не к некоторым устройствам USB, поскольку это приведет к задержкам в том же порядке, на наименее). Если вы говорите о микросекундах, ограничивающим фактором в измерении обычно является случайное время, которое требуется для того, чтобы ваш ПК реагировал на прерывание, ОС для запуска процедуры прерывания, планировщик для продолжения процесса вашей пользовательской области, а затем запускает python с его уровнями и уровнями косвенности. Вы в основном измеряете размер одиночных зерен песка, держа рядом с ними банан.

+0

Да, теоретически это должно быть около 200 мкс (115200,8N1). Однако ответ отправляется после того, как встроенное ядро ​​выполняет команду, поэтому я думаю, что это может быть немного выше. Python был самым быстрым в реализации, поэтому выбор. Я был бы счастлив, если бы смог получить правильный порядок времени. –

+0

, так что если отправка только занимает 200 мкс, довольно очевидно, что оба результата неверны. Я действительно рекомендую логический анализатор или, по крайней мере, цифровой осциллограф, смотрящий на линию RX –