Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Циклы макросов -какой быстрее - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Циклы макросов -какой быстрее
megavlom Дата: Понедельник, 10.10.2011, 21:24 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Добрый вечер.Задался вопросом.Есть диапазон,допустим А1:А100 ,объявляем его как массив(arr),какой цикл перебора быстрее. For Each In; For 1 To 100 ; For 1 To UBound . Насколько большая разница между ними,ведь диапазон (массив) находится в памяти и обращений к листу не будет?
 
Ответить
СообщениеДобрый вечер.Задался вопросом.Есть диапазон,допустим А1:А100 ,объявляем его как массив(arr),какой цикл перебора быстрее. For Each In; For 1 To 100 ; For 1 To UBound . Насколько большая разница между ними,ведь диапазон (массив) находится в памяти и обращений к листу не будет?

Автор - megavlom
Дата добавления - 10.10.2011 в 21:24
Hugo Дата: Понедельник, 10.10.2011, 21:43 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3703
Репутация: 792 ±
Замечаний: 0% ±

365
А померить ?

Code
Sub test()
Dim a, x, i, tm

a = [a1:a100]
tm = Timer

For Each x In a
Debug.Print x
Next
MsgBox Timer - tm

tm = Timer
For i = 1 To 100
Debug.Print a(i, 1)
Next
MsgBox Timer - tm

tm = Timer
For i = 1 To UBound(a)
Debug.Print a(i, 1)
Next
MsgBox Timer - tm
End Sub


Быстрее For Each x In a получается, но в реальности массивы из одного столбца редко бывают, и часто там тоже счётчик добавляют, чтоб работу делать...


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеА померить ?

Code
Sub test()
Dim a, x, i, tm

a = [a1:a100]
tm = Timer

For Each x In a
Debug.Print x
Next
MsgBox Timer - tm

tm = Timer
For i = 1 To 100
Debug.Print a(i, 1)
Next
MsgBox Timer - tm

tm = Timer
For i = 1 To UBound(a)
Debug.Print a(i, 1)
Next
MsgBox Timer - tm
End Sub


Быстрее For Each x In a получается, но в реальности массивы из одного столбца редко бывают, и часто там тоже счётчик добавляют, чтоб работу делать...

Автор - Hugo
Дата добавления - 10.10.2011 в 21:43
VovaK Дата: Понедельник, 10.10.2011, 22:03 | Сообщение № 3
Группа: Друзья
Ранг: Форумчанин
Сообщений: 116
Репутация: 41 ±
Замечаний: 0% ±

10
Hugo, я думаю объектная коллекция все таки медленне массива. Опять же если массив тип Variant, будет медленне однородного с объявленным типом. Но это догадки - не проверял...


Всем удачи. У нас все получится.
С уважением, Владимир.
 
Ответить
СообщениеHugo, я думаю объектная коллекция все таки медленне массива. Опять же если массив тип Variant, будет медленне однородного с объявленным типом. Но это догадки - не проверял...

Автор - VovaK
Дата добавления - 10.10.2011 в 22:03
megavlom Дата: Понедельник, 10.10.2011, 22:15 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Спасибо. Мало померить, у Вас много практического опыта и могут быть какие то нюансы,которых даже в книгах не найдешь.
 
Ответить
СообщениеСпасибо. Мало померить, у Вас много практического опыта и могут быть какие то нюансы,которых даже в книгах не найдешь.

Автор - megavlom
Дата добавления - 10.10.2011 в 22:15
Hugo Дата: Понедельник, 10.10.2011, 22:15 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3703
Репутация: 792 ±
Замечаний: 0% ±

365
Объектная медленее. Но здесь оно уже в массиве smile


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеОбъектная медленее. Но здесь оно уже в массиве smile

Автор - Hugo
Дата добавления - 10.10.2011 в 22:15
Hugo Дата: Понедельник, 10.10.2011, 22:25 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3703
Репутация: 792 ±
Замечаний: 0% ±

365
Да в общем я особо не заморачиваюсь - бывает и for each использую, если столбец один... Кода писать меньше smile
Ну а если параллельно с перебором нужно отслеживать индекс - то всё равно i считать...


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеДа в общем я особо не заморачиваюсь - бывает и for each использую, если столбец один... Кода писать меньше smile
Ну а если параллельно с перебором нужно отслеживать индекс - то всё равно i считать...

Автор - Hugo
Дата добавления - 10.10.2011 в 22:25
nerv Дата: Вторник, 11.10.2011, 12:55 | Сообщение № 7
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Я хотел когда-то создать подобную тему, но передумал )

На пустом листе

For Each v In Cells.Value - 2,875
For i = 1 To UBound(v) - 2,1875
For Each x In Cells.Cells - 6,375

код

Code
Sub io()
Dim t#, v, j%, i&, x As Object ' 2003 ex

t = Timer
For Each v In Cells.Value ' Ïî ìàññèâó
Next
Debug.Print "For Each v In Cells.Value - " & Timer - t

t = Timer
v = Cells.Value
For i = 1 To UBound(v) ' Ïî ìàññèâó
For j = 1 To 256
Next
Next
Debug.Print "For i = 1 To UBound(v) - " & Timer - t

t = Timer
For Each x In Cells.Cells ' Ïî ëèñòó
Next
Debug.Print "For Each x In Cells.Cells - " & Timer - t

End Sub

А вот если добавить хотя бы одно условие, то цикл по листу будет длится ай-яй-яй)

В данном случае я бы сделал так потому, что кода меньше, а разницу в производительности вы не почувствуете (по сравнению с 1 to Ubound(v))

Code
Sub io()
Dim v
For Each v In [А1:А100].Value 'Цикл по массиву
Next
End Sub


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
СообщениеЯ хотел когда-то создать подобную тему, но передумал )

На пустом листе

For Each v In Cells.Value - 2,875
For i = 1 To UBound(v) - 2,1875
For Each x In Cells.Cells - 6,375

код

Code
Sub io()
Dim t#, v, j%, i&, x As Object ' 2003 ex

t = Timer
For Each v In Cells.Value ' Ïî ìàññèâó
Next
Debug.Print "For Each v In Cells.Value - " & Timer - t

t = Timer
v = Cells.Value
For i = 1 To UBound(v) ' Ïî ìàññèâó
For j = 1 To 256
Next
Next
Debug.Print "For i = 1 To UBound(v) - " & Timer - t

t = Timer
For Each x In Cells.Cells ' Ïî ëèñòó
Next
Debug.Print "For Each x In Cells.Cells - " & Timer - t

End Sub

А вот если добавить хотя бы одно условие, то цикл по листу будет длится ай-яй-яй)

В данном случае я бы сделал так потому, что кода меньше, а разницу в производительности вы не почувствуете (по сравнению с 1 to Ubound(v))

Code
Sub io()
Dim v
For Each v In [А1:А100].Value 'Цикл по массиву
Next
End Sub

Автор - nerv
Дата добавления - 11.10.2011 в 12:55
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!