Узнать процессорное время из MS-DOS приложения

Тема в разделе "WASM.BEGINNERS", создана пользователем OioVologda, 20 мар 2007.

  1. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Есть MS-DOS приложение, написано на Turbo Pascal 7.0. Запускается, естественно под Windows.
    Требуется узнать, сколько точно времени процессор затратил на выполнение моего куска кода (написать модуль, выполняющий замеры и выводящий результат). Вариант с простым замером времени от начала выполнения куска до конца, не подходит, так как во время выполнения моей проги, винда тоже будет использовать процессор, и результат будет отличаться от чистого процессорного времени, потраченного именно на мою задачу на несколько секунд, что совершенно неприемлемо, если необходимая точность измерений = 1 мс.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В винде можно узнать сколько времени потратил процессор на выполнение конкретного потока. Посмотри такое время для твоего потока процесса NTVDM (NT Virtual DOS Machine)
     
  3. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Это у меня было сделано в виде отдельного приложения под винду, которое следило за нтвдм и считало его процессорное время, но тут надо сделать, чтобы в определенный момент времени (в начале выполнения кода) из программы в Паскале вызывалась процедурка, которая запоминала бы процессорное время, а потом, при выходе из нужного куска процессорное время бы снова замерялось, сравнивалось и т.д... Под виндой, все легко, вызовы API и т.д., но как из паскаля вызвать API, или что-то в этом роде?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хм... чую, что связаться из VM86 с виндой нельзя.. хотя фиг знает, мб можно
     
  5. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Это скорее всего так и есть, но неужели нет способа как-нибудь сообщить приложению под виндой, что типа нужно начать мерять время?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    можно придумать какой-нить заумный способ коммуникации.. только тут надо подумать)
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    OioVologda
    Встроенным ассемблером прочитать содержимое системного счетчика.
     
  8. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    А винда даст к нему обратиться из V86?
     
  9. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    OioVologda
    Дык должна...
     
  10. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Если несложно, киньте примерчик...
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Код (Text):
    1. var
    2.    l1: Word;
    3.    l2: Word;
    4.    h1: Word;
    5.    h2: Word;
    6.  
    7. procedure WriteWord(Value: Word);
    8. var
    9.  HexChars: array [0..$f] of char;
    10. begin
    11.   HexChars:= '0123456789ABCDEF';
    12.  
    13.   Write(HexChars[Value shr 12]);
    14.   Write(HexChars[(Value shr 8) and $f]);
    15.   Write(HexChars[(Value shr 4) and $f]);
    16.   Write(HexChars[Value and $f]);
    17. end;
    18.  
    19. begin
    20.      asm
    21.         push cx
    22.         mov cx, 16
    23.  
    24.         {rdtsc}
    25.         db $0f
    26.         db $31
    27.  
    28.         mov l1, ax
    29.  
    30.         {shr eax, cl}
    31.         db $66
    32.         shr ax, cl
    33.  
    34.         mov l2, ax
    35.         mov h1, dx
    36.  
    37.         {shr edx, cl}
    38.         db $66
    39.         shr dx, cl
    40.         mov h2, dx
    41.  
    42.         pop cx
    43.      end;
    44.  
    45.      Write('edx:eax == ');
    46.      WriteWord(h2);
    47.      WriteWord(h1);
    48.      Write(':');
    49.      WriteWord(l2);
    50.      WriteWord(l1);
    51.      Writeln;
    52. end.
     
  12. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Спасибо, а счетчик тактов разве вернет количество тактов, затраченных только на нужный процесс?
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    конечно нет
    а тебе нужна такая точность? если процессор больше никто не грузит, разница должна быть небольшая
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нет.
     
  15. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Если бы не нужна была точность, я бы отделался простым пдсчетом разницы времени от начала, до конца выполнения участка кода. Мне желательно достичь точность порядка миллисекунды и обосновать это.
     
  16. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    n0name
    и я про то же...
     
  17. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    миллисекунды? думаешь, в Windows вообще достижима подобная точность?
    что-то мне подсказывает, что тебе это нужно для курсовика, а еще что-то - что если сделаешь так и добавишь немного бла-бла-бла, все вполне прокатит
     
  18. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Nouzui
    Ну вообще-то ты почти прав.
    Насчет точности, винда в принципе позволяет через API получать процессорное время с точностью до 100 нс.
     
  19. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    в таких единицах возвращаются значения.. но точность самих этих значений очень далека от указанной
     
  20. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    Мне кажется, что винда берет их из структур ядра, напрямую связанных с планированием выполнения процессов в планировщике. Разве в подобных структурах может быть низкая точность?