Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » Скорость работы операторов Bascom


Скорость работы операторов Bascom

Сообщений 1 страница 14 из 14

1

Возможно, кому-то эта информация будет полезна...
Я - не первый в подобных сравнениях, но, тем не менее... ;)

Проверялось в Симуляторе Bascom при 1МГц МК.
Временные характеристики следует пересчитывать с учетом физической тактовой частоты.

Отредактировано Nord (2019-07-28 19:34:34)

0

2

‘******************************************************************
Присвоение значений
‘==================================================================
Для  А = BYTE
А = 1
Время выполнения – 4 такта
‘ ----------------------------------
Для  А = INTEGER
А = 1
Время выполнения – 9 тактов
‘==================================================================

‘******************************************************************
Операция сложения
‘==================================================================
Для  А = BYTE, B = BYTE
А = А + 1
Время выполнения – 8 тактов
А = А + B
Время выполнения – 10 тактов
‘ ----------------------------------
Для  А = INTEGER , B = INTEGER
А = A + 1
Время выполнения – 15 тактов
А = А + B
Время выполнения – 20 тактов
‘==================================================================

‘******************************************************************
Выполнение циклов
‘==================================================================
Для  А = BYTE
‘ ----------------------------------
For A = 1 To 1
Next A
Одинарный пустой цикл (без внутренних операций) выполняется за 27 тактов.
Здесь «работают» только операции начала и завершения цикла.
‘ ----------------------------------
For A = 1 To 2
Next A
Цикл с повтором более 1 выполняется за 27 + 15 тактов.
15 тактов – каждый последующий повтор.

Для A = 1 To 10 будет 162 такта - 27 + 9 * 15 тактов
‘==================================================================
Для  А = INTEGER
‘ ----------------------------------
For A = 1 To 1
Next A
Одинарный пустой цикл (без внутренних операций) выполняется за 55 тактов.
‘ ----------------------------------
For A = 1 To 2
Next A
Цикл с повтором более 1 выполняется за 55 + 32 тактов.
32 такта – каждый последующий повтор.

Для A = 1 To 10 будет 343 такта - 55 + 9 * 32 такта
‘==================================================================

‘******************************************************************
Вызов подпрограммы
‘==================================================================
Пустой Gosub …. Return, без какого-либо выполнения внутри подпрограммы.
8 тактов.
‘ ----------------------------------

Gosub …. Return с операцией присвоения внутри подпрограммы
‘ ----------------------------------
Для  А = BYTE
‘ ----------------------------------
Gosub … A = n ... Return
11 тактов
‘ ----------------------------------
Для  А = INTEGER
‘ ----------------------------------
15 тактов

Gosub …. Return с арифметической операцией внутри подпрограммы
‘ ----------------------------------
Для  А = BYTE
‘ ----------------------------------
Gosub … A = A + B ... Return
15 тактов
‘ ----------------------------------
Для  А = INTEGER
‘ ----------------------------------
22 такта
‘==================================================================

Отредактировано Nord (2019-07-26 08:32:59)

+4

3

‘******************************************************************
Арифметические операции
‘==================================================
А = A * n
‘ ----------------------------------
Для  А = BYTE          ‘ Время выполнения – 10 тактов
Для  А = INTEGER    ‘ Время выполнения – 36 тактов
Для  А = SINGLE      ‘ Время выполнения – 280 тактов
‘ ----------------------------------
А = A * B
‘ ----------------------------------
Для  А и B = BYTE          ‘ Время выполнения – 11 тактов
Для  А и B = INTEGER    ‘ Время выполнения – 40 тактов
Для  А и B = SINGLE      ‘ Время выполнения – 232 такта
‘==================================================

‘******************************************************************
А = A \ n
‘ ----------------------------------
Для  А = BYTE          ‘ Время выполнения – 68 тактов
Для  А = INTEGER    ‘ Время выполнения – 290 тактов
Для  А = SINGLE      ‘ Время выполнения – 572 такта
‘ ----------------------------------
А = A \ B
‘ ----------------------------------
Для  А и B = BYTE          ‘ Время выполнения – 113 тактов
Для  А и B = INTEGER    ‘ Время выполнения – 294 тактов
Для  А и B = SINGLE      ‘ Время выполнения – 524 такта
‘===================================================

+3

4

n какой тип?

0

5

EdGull написал(а):

n какой тип?

Судя по всему это просто число, т. е. А = A * 100.

Нужно еще проверить с Long.

0

6

EdGull написал(а):

n какой тип?

Во всех случаях значение n было одинаковым = 5.

Поэтому указанные скорости не являются однозначно единственными.
Но даже указанных значений вполне хватает для представления картины действа... ;)

0

7

Для LONG
‘******************************************************************
А = A * n                  ' n = 5
‘ ----------------------------------
Для  А = LONG                ‘ Время выполнения – 98 тактов
----------------------------------
А = A * B
‘ ----------------------------------
Для  А и B = LONG          ‘ Время выполнения – 88 тактов
' ----------------------------------
А = A \ n                  ' n = 5
‘ ----------------------------------
Для А = LONG                 ‘ Время выполнения – 768 тактов
‘ ----------------------------------
А = A \ B
‘ ----------------------------------
Для  А и B = LONG          ‘ Время выполнения – 792 такта
===================================================

+2

8

‘******************************************************************
Операции с чтением DATA
‘==================================================================
Restore xxx               ‘ Время выполнения – 12 тактов
Только формирование указателя, без каких-либо других действий.
‘ ----------------------------------
Read A                      ‘ A = String * 4
Для  А = “A”              ‘ Время выполнения – 1647 тактов
Для значений в блоке DATA от «А» до «АААА» скорость не изменяется.
Для более длинных строк эксперименты не проводились.
‘ ----------------------------------
Read A                     ‘ Одиночное считывание, значение в блоке DATA во всех случаях = 110
Для  А = BYTE          ‘ Время выполнения – 36 тактов
Для  А = INTEGER    ‘ Время выполнения – 66 тактов
Для  А = SINGLE      ‘ Время выполнения – 102 такта
Для  А = LONG         ‘ Время выполнения – 102 такта
‘ ----------------------------------
Чтение из блока DATA в цикле
Значение в блоке DATA во всех случаях = 110
Для  А = BYTE
For B = 1 To 1           ‘ Время выполнения – 62 тактa
For B = 1 To 2           ‘ Время выполнения – 62 + 50 тактов
For B = 1 To n           ‘Каждое значение цикла более 2 добавляет 50 тактов

Для  А = INTEGER
For B = 1 To 1           ‘ Время выполнения – 92 такта
For B = 1 To 2           ‘ Время выполнения – 92 + 80 тактов
For B = 1 To n           ‘ Каждое значение цикла более 2 добавляет 80 тактов

Для  А = SINGLE
For B = 1 To 1           ‘ Время выполнения – 128 тактов
For B = 1 To 2           ‘ Время выполнения – 128 + 116 тактов
For B = 1 To n           ‘ Каждое значение цикла более 2 добавляет 116 тактов

Для  А = LONG
For B = 1 To 1           ‘ Время выполнения – 128 тактов
For B = 1 To 2           ‘ Время выполнения – 128 + 116 тактов
For B = 1 To n           ‘ Каждое значение цикла более 2 добавляет 116 тактов

‘==================================================================

Отредактировано Nord (2019-07-30 18:42:53)

+3

9

‘******************************************************************
Операции преобразования «Num» <> «Txt»
‘==================================================================
Dim S As String * 16
A = 5
S = HEX(A)
‘ ----------------------------------
Для  А = BYTE           ‘ Время выполнения – 58 тактов
Для  А = INTEGER     ‘ Время выполнения – 94 такта
Для  А = SINGLE       ‘ Время выполнения – 164 такта
Для  А = LONG          ‘ Время выполнения – 164 такта

S = BIN(A)
‘ ----------------------------------
Для  А = BYTE           ‘ Время выполнения – 91 такт
Для  А = INTEGER     ‘ Время выполнения – 160 тактов
Для  А = SINGLE       ‘ Время выполнения – 296 тактов
Для  А = LONG          ‘ Время выполнения – 296 тактов

Dim S As String * 4
S = “100”
A = VAL(S)
‘ ----------------------------------
Для  А = BYTE           ‘ Время выполнения – 291 такт
Для  А = INTEGER     ‘ Время выполнения – 293 такта
Для  А = SINGLE       ‘ Время выполнения – 457 тактов
Для  А = LONG          ‘ Время выполнения – 297 тактов

‘==================================================================
Афигеть скорости...  o.O
Надо завязывать с текстовыми переменными... ;)

+2

10

‘******************************************************************
Операции с переменными типа STRING
‘===================================================
Dim S As String * 1
Dim K As String * 4
‘ ----------------------------------
K = K + S                 ‘ Время выполнения – 42 такта
‘ ----------------------------------
Dim S As String * 2
K = K + S                 ‘ Время выполнения – 49 тактов
‘ ----------------------------------
Dim S As String * 3
K = K + S                 ‘ Время выполнения – 56 тактов
….
Эксперимент проводился до S = 30 символов, прирост не изменяется.
На каждый символ используется  +7 тактов программного времени.

Dim S As String * 4
Dim K As String * 6
K = “BASCOM”
‘ ----------------------------------
S = Mid(K, 1, 1)        ‘Время выполнения – 44 такта
S = Mid(K, 1, 2)        ‘Время выполнения – 54 такта
S = Mid(K, 1, 3)        ‘Время выполнения – 64 такта
Эксперимент проводился до Mid(K, 1, 30), прирост не изменяется.
На каждый символ используется  +10 тактов программного времени.

Dim S As String * 4
Dim K As String * 6
K = “xB”                   ‘ х – некоторое количество «пробелов», Chr(32), в начале строки
‘ ----------------------------------
S = Ltrim(K)             ‘Время выполнения – 34 такта для 1 «пробела»
S = Ltrim(K)             ‘Время выполнения – 39 тактов для 2 «пробелов»
На каждый «пробел» более одного добавляется  5 тактов
Например, для строки «_____В» будет выполнено 34 + (5 * 5) тактов

K = “Bх”                   ‘ х – некоторое количество «пробелов», Chr(32), в конце строки
‘ ----------------------------------
S = Rtrim(K)             ‘Время выполнения – 57 тактов для 1 «пробела»
S = Rtrim(K)             ‘Время выполнения – 69 тактов для 2 «пробелов»
На каждый «пробел» более одного добавляется  12 тактов
Например, для строки «В_____» будет выполнено 57 + (5 * 12) тактов

K = “хBх”                  ‘ х – некоторое количество «пробелов», Chr(32), в начале и (или) в конце строки
‘ ----------------------------------
K = “Bх”
S = Trim(K)               ‘Время выполнения – 63 такта
K = “Bхх”
S = Trim(K)               ‘Время выполнения – 75 тактов
На каждый «пробел» более одного добавляется  12 тактов
Например, для строки «В_____» будет выполнено  63 + (5 * 12) тактов
‘ ----------------------------------
K = “хB”
S = Trim(K)               ‘Время выполнения – 56 тактов
K = “ххB”
S = Trim(K)               ‘Время выполнения – 61 такт
На каждый «пробел» более одного добавляется  5 тактов
Например, для строки «_____В» будет выполнено  56 + (5 * 5) тактов
‘ ----------------------------------
K = “хBх”
S = Trim(K)               ‘Время выполнения – 68 тактов
K = “ххBх”
S = Trim(K)               ‘Время выполнения – 73 такта
На каждый «пробел» перед значимыми данными более одного добавляется  5 тактов
K = “хBхх”
S = Trim(K)               ‘Время выполнения – 80 тактов
На каждый «пробел» после значимых данных более одного добавляется  12 тактов

‘===================================================

Отредактировано Nord (2019-08-03 23:18:47)

+1

11

‘******************************************************************
Вызов подпрограмм (в дополнение к #2)
‘====================================================
Declare Sub Probe
Call Probe
Пустой Call, без какого-либо выполнения внутри подпрограммы - 8 тактов.
‘ ----------------------------------
Declare Sub Probe(byval A As Byte)
Call Probe(A)            ‘ Здесь и далее в подпрограмме выполняется А = 5
Время выполнения – 48 тактов
‘ ----------------------------------
Declare Sub Probe(byval A As Integer)
Call Probe(A)
Время выполнения – 57 тактов
‘ ----------------------------------
Declare Sub Probe(byval A As Single)
Call Probe(A)
Время выполнения – 161 такт
‘ ----------------------------------
Declare Sub Probe(byval A As Long)
Call Probe(A)
Время выполнения – 71 такт      :confused:
‘ ----------------------------------

Ощутимо медленнее, чем Gosub …. Return… ;)
‘====================================================

Отредактировано Nord (2019-08-04 23:18:46)

+2

12

Nord написал(а):

Ощутимо медленнее, чем Gosub …. Return

Подпрограммы не поддерживают аргументы и локальные переменные.

0

13

‘******************************************************************
Форматирование строковых переменных
‘==================================================================
Dim K As String * 6
Dim A As Single
A = 55.256
‘ ----------------------------------
K = Fusing(A, "#.#")
Время выполнения – 6256 тактов
‘ ----------------------------------
K = Fusing(A, "#.##")
Время выполнения – 6279 тактов
‘ ----------------------------------
K = Fusing(A, "#.###")
Время выполнения – 6215 тактов
‘ ----------------------------------
K = Fusing(A, "#.&")
Время выполнения – 6194 такта
‘ ----------------------------------
K = Fusing(A, "#.&&")
Время выполнения – 6201 такт
‘ ----------------------------------
K = Fusing(A, "#.&&&")
Время выполнения – 6208 тактов
‘==================================================================

+2

14

‘******************************************************************
Операции сравнения
‘==================================================
Dim A As BYTE
Dim B As BYTE
A = 5
B = 5

If B < A Then Gosub probe    ‘ Здесь и далее использован «пустой» Gosub … Return
‘ Время выполнения – 9 тактов, здесь и далее время выполнения «пустого» Gosub убрано
If B > A Then Gosub probe
‘ Время выполнения – 11 тактов
If B = A Then Gosub probe
‘ Время выполнения – 3 такта

If A < 5 Then Gosub probe
‘ Время выполнения – 7 тактов
If A > 5 Then Gosub probe
‘ Время выполнения – 9 тактов
If A = 5 Then Gosub probe
‘ Время выполнения – 5 тактов
‘ ----------------------------------
Dim A As INTEGER
Dim B As INTEGER
A = 5
B = 5

If B < A Then Gosub probe
‘ Время выполнения – 19 тактов
If B > A Then Gosub probe
‘ Время выполнения – 20 тактов
If B = A Then Gosub probe
‘ Время выполнения – 9 тактов

If A < 5 Then Gosub probe
‘ Время выполнения – 14 тактов
If A > 5 Then Gosub probe
‘ Время выполнения – 15 тактов
If A = 5 Then Gosub probe
‘ Время выполнения – 4 такта
‘ ----------------------------------

Отредактировано Nord (2019-08-14 00:24:57)

+2


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » Скорость работы операторов Bascom