Страницы: 1
RSS
Оптимизация использования типов переменных Integer, Long и проч.
 
просто наблюдение
Код
Dim StartRow As Long, EndRow As Long, LastRow As Long, i As Long

судя по всему табличку более 89 планируется использовать  365*89+89/4=32485+22=32507 что  меньше 32767 :-)
сообщение выдернуто и другой темы для созания этой темы [МОДЕРАТОР]
По вопросам из тем форума, личку не читаю.
 
БМВ, Миша, мне тоже до кончика хвоста... Чем тебе Long не угодил, и что-же ты считаешь?
 
Цитата
RAN написал:
Чем тебе Long не угодил, и что-же ты считаешь?
просто не нужен он там. Integer достаточно на 89 лет заправок.  :D
По вопросам из тем форума, личку не читаю.
 
Будь проще. Я давно считаю, что нет в VBA такого типа данных, как Integer. И голова не болит.  :D
 
Цитата
RAN написал:
И голова не болит.  
расточитель байтов :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
RAN написал:
Я давно считаю, что нет в VBA такого типа данных, как Integer.
+1
 
По данным разведки, Integer занимает ровно столько же места, сколько и Long :)

Я тоже отдаю предпочтение скорости.
Сообщение #8, там ссылка на статью, в которой отмечается, что Integer все равно преобразовывается в Long.
 
Цитата
vikttur написал:
в которой отмечается
Все , они разрушили веру в то что код будет работать как написано, а не с домыслами разработчика компилятора. Просто накидал пример, так Variant оказался быстр чем Inтeger.
По вопросам из тем форума, личку не читаю.
 
Цитата
vikttur написал:
По данным разведки, Integer занимает ровно столько же места, сколько и Long
"Верить в наше время нельзя никому"

Код
Sub test()
  Dim a(0 To 1000) As Integer
  Debug.Print (VarPtr(a(1000)) - VarPtr(a(0))) / 1000
End Sub

Ответ - 2.

Другое дело, что работа с 4-х байтовыми целыми в современных условиях быстрее, чем с 2-х байтовыми (и компилятор про это знает).
Я последние 20 лет использую в VBA для целых тип Long, если только тип переменной Integer не определяется интерфейсом (как при обработке событий и при работе с API Windows).
Владимир
 
Цитата
разрушили веру...
Верить... нельзя никому
Хоть читай, хоть не читай, все равно получишь... шиш? :)

Стараешься правильно писать, оптимизировать, а оно вон как...
Владимир, можете просветить примерами, когда применение Integer оправдано?

Цитата
sokol92 написал:  работа с 4-х байтовыми целыми в современных условиях быстрее, чем с 2-х байтовыми
И как обстоят дела с однобайтовыми?

БМВ, договорился? Теперь ты автор темы :)
Надо же ее с чего-то начать...
 
Цитата
vikttur написал:
Теперь ты автор темы
Это использование полномочий в непонятных целях!!!  :D  Я на работе даже так не делаю  :D

Ну  раз так, то
накидал тест  , он простой, три группы  по два вложенных цикла . Перавая с Integer, вторая Long, треть Variant. Так по скорости Long, Variant, Integer выстроились.
По вопросам из тем форума, личку не читаю.
 
Очень понравилось из #7 фраза от разработчика: "Long переменные могут быть немного быстрее" :) "Могут" и "Немного" - очень умная отсылка пользователя куда-то далеко на случай, если он усомнится в работоспособности нового продукта :)
Цитата
БМВ написал:
разрушили веру в то что код будет работать как написано
что и подтверждают в последнее время некоторые темы на форумах - здесь работает, а там - нет  :( Стали забывать золотое русское правило - не трогай технику и она не подведет :)
 
Из-за выравнивания адресов вот здесь, например, будет зарезервировано по 4 Байта в памяти операционной системы как для Integer, так и для Byte:
Код
Type MyType1
  Int As Integer
  Lng As Long
End Type

Type MyType2
  Bt As Byte
  Lng As Long
End Type

Sub Test1()
  Dim x As MyType1, y As MyType2
  Debug.Print "Integer", VarPtr(x.Lng) - VarPtr(x.Int)
  Debug.Print "Byte", VarPtr(y.Lng) - VarPtr(y.Bt)
End Sub
 
Спасибо, Вадимир
Хоть бери да записывай в Long 4 штуки Byte :)
Цитата
ZVI написал: Из-за выравнивания адресов
Если отойти от дебрей адресации - когда выгодно применять Integer или Byte?
 
Мой опыт с выравниванием адресов памяти.
Там же зачем это нужно.
«Бритва Оккама» или «Принцип Калашникова»?
 
И я там был... )
Спасибо
 
Цитата
vikttur написал: когда выгодно применять Integer или Byte?
Добрый вечер, Виктор.
Выгоду от использования Integer на сегодняшний день трудно найти, скорее можно говорить о необходимости в некоторых случаях.
Обычно встречается необходимость в использовании Integer и Byte в кодах API.
Ограничение в положительных Integer, например, есть в VBA - см.  FreeFile
Шагать побайтно обычно приходится при обработке текстового массива: Dim b() As Byte: b() = "Текст" и т.д.
Но работа побайтно может приводить к замедлению кода.
Например, в 64-битных приложениях использование API CopyMemory (точнее - RtlMoveMemory) медленнее даже кода VBA и в раз шесть медленее, чем в 32-битных приложениях.
Почему-то в CopyMemory до сих пор используется побайтное копирование, обычно копируют по 4 ( 8 ) Байта, и отдельно побайтно - оставшийся хвостик Байтов, если не кратно 4-м Байтам.
В принципе, Integеr и в UDT (пример в #13) займет свои положенные 2 Байта, если не требуется выравнивание памяти:
Код
Type MyType1
  Int1 As Integer
  Int2 As Integer
  Lng As Long
End Type
 
Sub Test1()
  Dim x As MyType1
  Debug.Print "Integer", VarPtr(x.Lng) - VarPtr(x.Int2)
End Sub
Изменено: ZVI - 11.01.2021 22:46:54
 
Цитата
ZVI написал:  если не требуется выравнивание памяти
А память выравнивается в большинстве случаев )

Спасибо.
 
В примере из сообщения #13 - выравнивается, в #17 - нет, получается - в 50% случаев ))
Изменено: ZVI - 11.01.2021 22:44:43
 
Насколько я понял (после ознакомления с информацией о выравнивании), НЕвыравнивание чревато или ошибками извлечения из памяти, или дополнительными затратами на корректную работу с невыравненными участками.
 
Выравниванием адресов занимается операционная система (ОС), цель - повышенная скорость доступа за счет оптимального шага (Step),  для 32-битной ОС оптимальный шаг - 4 Байта. В VBA  выравнивание происходит автоматически, если не использовать API, то о выравниванеии можно и не задумываться.
Изменено: ZVI - 11.01.2021 23:39:07
 
Цитата
ZVI написал:  В VBA  выравнивание происходит автоматически,
Это понятно
Цитата
ZVI написал: если не использовать API, то о выравниванеии можно и не задумываться.
И это понятно. А так как  API используется не в 50% случаев... :), то напрашивается вывод: использовать Integer и Byte можно (нужно), но в редких случаях.
 
Да 🙂
 
Итоги-то будут какие-то? А то я уже как год почти не использую Integer, потому что он НЕ быстрее, но пока иногда использую Byte — продолжать?  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх