Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Diskanora
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 19
1

Подсчёт времени выполнения кода

09.11.2017, 21:34. Просмотров 833. Ответов 4
Метки нет (Все метки)

Используя функцию QueryPerformanceCounter, написать приложение, которое будет подсчитывать время выполнения кода в MASM32

Участок кода:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.386 
.model flat,stdcall
option casemap:none
include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib 
.data 
string db "0123456789ПроверкаПерестановки",0 
.code 
start: lea esi,string 
 or ecx,-1
lop: lodsw                                      
 test ah,ah 
 jz FINISH 
 test al,al
 jz FINISH
 ror ax,8                                        
 mov [esi-2],ax 
 loop lop 
FINISH: invoke MessageBox,0,addr string,0,MB_OK
 invoke ExitProcess,0
end start
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2017, 21:34
Ответы с готовыми решениями:

RDTSC - время выполнения участка кода
Приветствую! Как правильно замерить время выполнения участка кода? Использую...

Что будет в результате выполнения кода в регистре ах
Завтра экзамен, но в одном не могу разобраться, точнее не уверен в правильности...

Подсчёт времени выполнения сортировки
Есть следующий класс с сортировкой: using System; using...

Подсчёт времени выполнения программы
Здравствуйте, помогите разобраться, не получается подсчитать время выполнения...

Подсчёт времени выполнения цикла
Добрый день. Существует ли возможность подсчитать, сколько по времени...

4
ФедосеевПавел
Модератор
3659 / 2029 / 840
Регистрация: 01.02.2015
Сообщений: 6,756
09.11.2017, 22:59 2
Теория QueryPerformanceFrequency/Counter
0
Diskanora
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 19
10.11.2017, 01:32  [ТС] 3
Это для С++. А у меня Ассемблер
0
ФедосеевПавел
Модератор
3659 / 2029 / 840
Регистрация: 01.02.2015
Сообщений: 6,756
10.11.2017, 08:14 4
Это последовательность вызовов WinAPI - она интерлингвистична.
Assembler
1
    invoke QueryPerformanceCounter, ADDR lpPerformanceCount
И тоже самое для QueryPerformanceFrequence. Потом выполнить умножения и деления.
0
Jin X
4187 / 1342 / 158
Регистрация: 14.12.2014
Сообщений: 2,543
Записей в блоге: 7
Завершенные тесты: 2
10.11.2017, 15:20 5
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.686P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
INCLUDE         \MASM32\INCLUDE\WINDOWS.INC
INCLUDE         \MASM32\INCLUDE\KERNEL32.INC
INCLUDE         \MASM32\INCLUDE\MSVCRT.INC
 
INCLUDELIB      \MASM32\LIB\KERNEL32.LIB
INCLUDELIB      \MASM32\LIB\MSVCRT.LIB
 
SpeedTest       PROTO   :DWORD
TestCode        PROTO
EmptyProc       PROTO
 
.DATA
 
Million         DD      1000000.0
Fmt             DB      '%d microseconds',0
 
.DATA?
 
Freq            DQ      ?
Counter1        DQ      ?
Counter2        DQ      ?
 
.CODE
 
Start:
 
                finit
                invoke  QueryPerformanceFrequency, ADDR Freq
 
                invoke  SpeedTest, ADDR EmptyProc
                mov     ebx,eax
                invoke  SpeedTest, ADDR TestCode
                sub     eax,ebx
                invoke  crt_printf, ADDR Fmt, eax
 
                invoke  ExitProcess, NULL
 
TestCode        PROC
                invoke  Sleep, 1000
                ret
TestCode        ENDP
 
EmptyProc       PROC
                ret
EmptyProc       ENDP
 
SpeedTest       PROC    ProcAddr:DWORD
                invoke  QueryPerformanceCounter, ADDR Counter1
                call    ProcAddr
                invoke  QueryPerformanceCounter, ADDR Counter2
                fild    Counter2
                fild    Counter1
                fsubp
                fild    Freq
                fdivp
                fld     Million
                fmulp
                fistp   Counter1
                mov     eax,dword ptr Counter1
                ret
SpeedTest       ENDP
 
END             Start
Добавлено через 1 минуту
По-хорошему нужно сделать несколько прогонов, чтобы избежать погрешности.
Для простоты можно брать минимальное значение скорости EmptyProc и минимальное TestCode.

Добавлено через 3 минуты
Как вариант:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
.686P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
INCLUDE         \MASM32\INCLUDE\WINDOWS.INC
INCLUDE         \MASM32\INCLUDE\KERNEL32.INC
INCLUDE         \MASM32\INCLUDE\MSVCRT.INC
 
INCLUDELIB      \MASM32\LIB\KERNEL32.LIB
INCLUDELIB      \MASM32\LIB\MSVCRT.LIB
 
PASSBITS        =       10
PASSCOUNT       =       1 shl PASSBITS          ; кол-во проходов
 
SpeedTest       PROTO   :DWORD
TestCode        PROTO
EmptyProc       PROTO
 
.DATA
 
Million         DD      1000000.0
Fmt             DB      '%d microseconds',0
 
.DATA?
 
Freq            DQ      ?
Counter1        DQ      ?
Counter2        DQ      ?
 
.CODE
 
Start:
 
                finit
                invoke  QueryPerformanceFrequency, ADDR Freq
 
                invoke  SpeedTest, ADDR EmptyProc
                mov     ebx,eax
                invoke  SpeedTest, ADDR TestCode
                sub     eax,ebx
                shr     eax,PASSBITS
                invoke  crt_printf, ADDR Fmt, eax
 
                invoke  ExitProcess, NULL
 
TestCode        PROC
                invoke  Sleep, 1
                ret
TestCode        ENDP
 
EmptyProc       PROC
                ret
EmptyProc       ENDP
 
SpeedTest       PROC    ProcAddr:DWORD
                push    ebx
                invoke  QueryPerformanceCounter, ADDR Counter1
                mov     ebx,PASSCOUNT
        @@:     call    ProcAddr
                dec     ebx
                jnz     @B
                invoke  QueryPerformanceCounter, ADDR Counter2
                fild    Counter2
                fild    Counter1
                fsubp
                fild    Freq
                fdivp
                fld     Million
                fmulp
                fistp   Counter1
                mov     eax,dword ptr Counter1
                pop     ebx
                ret
SpeedTest       ENDP
 
END             Start
2
10.11.2017, 15:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2017, 15:20

Подсчёт времени выполнения алгоритма. выводит 0
Подскажите что тут не так. Выводит 0 как-будто времени не проходит void...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение...

Определение времени выполнения кода
Нужно определить сколько выполняется тот или иной цикл, подскажите поз, как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru