С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1

End With по требованию

06.10.2024, 08:52. Показов 3023. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одном коде надо было перебирать элементы массива UDT и при определенных условиях "выпрыгнуть" из цикла, а после цикла при определенных условиях происходит редим этого массива, но обнаружилась одна проблемка с использованием оператора With в таком сценарии. Упрощенно проблемму можно воспроизвести таким кодом
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Type tpNode
    Val As Long
End Type
 
Sub TestWith()
    Dim i&, Nodes() As tpNode
    
    ReDim Nodes(5) As tpNode
    
    Do
        With Nodes(2)
            .Val = 1
            Exit Do
        End With
    Loop
    
    ReDim Preserve Nodes(6)    
End Sub
При выполнении данного кода после цикла выскочит ошибка "This array is fixed or temporarily locked". Она возникает по причине того, что оператор With захватывает элемен массива и блокирует массив от изменения размерности. Поскольку выход из цикла происходит до закрытия With, блокировка массива не снимается. В идеальном случае нужно было выходить из цикла после End With, но в том коде все действия происходят в условном операторе, помещенном внутри With. Здача данной темы отгадать, 1) как я реши эту пролему (или предложить свое решение); 2) то же самое, но с использованием цикла For )
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.10.2024, 08:52
Ответы с готовыми решениями:

Excel 2013 32-bit URLDownloadToFile пишет "Compile error: only comment may appear after End Sub End Function or End Prop
Добрый день! перепробовал все варианты и не вызывается функция URLDownloadToFile: пишет "Compile error: only comment may appear...

Требуется Web-разработчик (Front end/Back end) Санкт-Петербург
Обязанности: • Основная задача: бек энд разработка (организация REST-API сервисов и взаимодействие с БД (crud-операции) на python),...

Java Developer (front-end + back-end); Chicago,IL; H1B Sponsorship is available!
Valdi Group LLC is a Chicago based software development and software testing consulting firm that successfully delivering elegant and...

52
sleep
 Аватар для I can
4916 / 4567 / 838
Регистрация: 13.04.2015
Сообщений: 9,699
20.11.2024, 10:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Хм... век живи - век учись. Я до сих пор считал, что With - это просто синтаксический сахар, сокращение длинных выражений. Для того, чтобы повысить быстродействие, убрав постоянные расчёты индексов, применял процедуры.
В данном случае лучше не учись

Смотри
Visual Basic
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
Private Sub Command1_Click()
    Dim t1, t2, t3, t4, n As Long
    Dim i As Long, Nodes1() As tpNode, Nodes2() As tpNode
    ReDim Nodes1(5), Nodes2(5)
    n = 10000000
    t1 = Timer
    For i = 0 To n
         With Nodes1(2)
            .Val = 1
            .Val = 2
            .Val = 3
            .Val = 4
            .Val = 5
         End With
    Next
    t2 = Timer
    t3 = Timer
    For i = 0 To n
            Nodes2(2).Val = 1
            Nodes2(2).Val = 2
            Nodes2(2).Val = 3
            Nodes2(2).Val = 4
            Nodes2(2).Val = 5
    Next
    t4 = Timer
    'Debug.Print t2 - t1
    'Debug.Print t4 - t3
    MsgBox t2 - t1 & vbCrLf & t4 - t3
End Sub

Запускаем из среды разработки - да, действительно, код с With работает быстрее, хоть и не намного.

А теперь компилируем (все оптимизации по умолчанию), запускаем exe, и ситуация в корне меняется - код без With работает почти в два раза быстрее. И вся тема летит в трубу

Цитата Сообщение от SergioJek Посмотреть сообщение
Самое очевидное и простое решение - выкинуть With из кода как лишнее образование.
Вот именно.
1
sleep
 Аватар для I can
4916 / 4567 / 838
Регистрация: 13.04.2015
Сообщений: 9,699
20.11.2024, 10:44
Чем дальше - тем всё еще хуже

Вот более наглядно


1
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 10:53  [ТС]
I can, это может быть ситуация которую оптимизирует компилятор в одном случае, а в другом не оптимизирует. Я раньше делал не рекурсивный q-sort и в нем with давал небольшое преимушество. Чуть позже скину ссылку.

Добавлено через 2 минуты
Вопрос конечно есть, как работает with как ранее ли связывание или как-то по особому.
0
sleep
 Аватар для I can
4916 / 4567 / 838
Регистрация: 13.04.2015
Сообщений: 9,699
20.11.2024, 10:53
Цитата Сообщение от testuser2 Посмотреть сообщение
I can, это может быть ситуация которую оптимизирует компилятор в одном случае, а в другом не оптимизирует
Так это же прекрасно, что он оптимизирует. Значит With замедляет работу программы в данном случае.
1
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 12:10  [ТС]
В Твин-бейсике with уже можно исполтзовать для разименования указателя вроде.

Добавлено через 1 час 15 минут
Цитата Сообщение от I can Посмотреть сообщение
Так это же прекрасно, что он оптимизирует. Значит With замедляет работу программы в данном случае.
Прекрасно в одном, ужасно, что не оптимизирует в другом случае, посколльку with это безусловно нужная конструкция, которая придает больше изящности и компактности(следовательно читаемости) кода в некоторых случаях.. (в каких-то случаях может добавить наоборот путаницы). Однако не все мжет быть так печально для with, поскольку, пример не очень универсальный, поскольку в реальном коде такая ситуация врядли будет встречаться такая ситуация, когда в одно и тоже тысячи раз подряд перезаписываются данные.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 12:22
странно
Цитата Сообщение от Mikle Quits Посмотреть сообщение
укорачивается
зачем вообще этот With. Вот сколько миллисекунд в скорости ты выиграешь по времени? Одну? Две миллисекунды? Это же будет совсем не ощутимо.

Добавлено через 1 минуту
Человеческий глаз даже не воспринимает и не успеет заметить процессы которые произошли быстрее чем 42млск

Добавлено через 8 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
безусловно нужная конструкция
Что за бред!? Никогда не любил эту "конструкцию"
1
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 12:32  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
не рекурсивный q-sort
101 Basic Computer Games
Цитата Сообщение от HackerVlad Посмотреть сообщение
Человеческий глаз даже не воспринимает и не успеет заметить
Человеческий глаз может заметить разницу в коде. Или ты видишь простыню из однотипных обозначений, или видтшь тлько нужные имена полей в какой-то многоуровенной вложенной структуре..

Добавлено через 5 минут
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Но псевдометод .Print не работает.
А если picScore вынести в отдельную переменную?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 12:51
Цитата Сообщение от testuser2 Посмотреть сообщение
Человеческий глаз может заметить разницу в коде. Или ты видишь простыню из однотипных обозначений, или видтшь тлько нужные имена полей в какой-то многоуровенной вложенной структуре..
Ну тогда про оптимизацию скорости здесь и речь быть не может просто. Даже наоборот скорость замедляется, как доказал I can. Значит это просто "синтаксический сахар" как сказал Mikle Quits

Добавлено через 4 минуты
В книге Стив Брауна тоже писали что мол With помогает увеличить производительность и скорость работы программы, но это было в конце 90-ых, в начале двухтысячных может оно так и было тогда раньше на медленных процессорах...
0
sleep
 Аватар для I can
4916 / 4567 / 838
Регистрация: 13.04.2015
Сообщений: 9,699
20.11.2024, 12:53
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Но псевдометод .Print не работает.
В блоке With доступны только свойства и методы объекта, определенные его сигнатурой. Для вызова .Print используйте объект напрямую.



2
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 12:56
Ну а сегодня, благодаря уважаемому I can мы уже видим совсем обратный эффект. Итак я провёл тесты которые нам предложил I can. И что мы видим!? В IDE (первый скрин) вместе с With скорость 0,64, без With скорость 0,68, тут даже человеческий глаз не успел бы заметить что этот процесс в IDE происходит чуть-чуть быстрее. Но вот в EXE становится даже медленнее вместе с With уже 0,17 а без With стало быстрее 0,07!!!
Изображения
  
1
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 13:42  [ТС]
Это не очень корректный пример, я объяснял почему
0
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 14:05  [ТС]
HackerVlad, этот проверь
Вложения
Тип файла: zip TestWithSpeed2.zip (3.3 Кб, 6 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 14:33
testuser2, ну проверил я твой пример. Без With быстрее.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 14:33
Вот смотри
Изображения
 
0
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 14:34  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Без With быстрее.
Да быстрее, но, немного странновато. Так у меня
Code
1
2
3
4
5
6
Exe полная оптимизация
1,46875
1,40625
IDE
1,421875
1,46875
Кликните здесь для просмотра всего текста
Visual Basic
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
Option Explicit
Private Type tpNode
    Val1 As Long
    Val2 As Long
    Val3 As Long
    Val4 As Long
    Val5 As Long
End Type
 
Private Sub Command1_Click()
    Dim t1!, t2!, t3!, t4!, n As Long
    Dim i As Long, ind As Long, Nodes1() As tpNode, Nodes2() As tpNode
    Dim v&
    
    ReDim Nodes1(10000), Nodes2(10000)
    n = 10000000
    Randomize
    
    t1 = Timer
    For i = 0 To n
         ind = Rnd * 10000
         v = Rnd * 5 + 1
         With Nodes1(ind)
            .Val1 = v
            .Val2 = v
            .Val3 = v
            .Val4 = v
            .Val5 = v
         End With
    Next
    t2 = Timer
    
    t3 = Timer
    For i = 0 To n
        ind = Rnd * 10000
        v = Rnd * 5 + 1
        Nodes1(ind).Val1 = v
        Nodes1(ind).Val2 = v
        Nodes1(ind).Val3 = v
        Nodes1(ind).Val4 = v
        Nodes1(ind).Val5 = v
    Next
    t4 = Timer
    
    MsgBox t2 - t1 & vbCrLf & t4 - t3
End Sub
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 14:47
Делаем вывод, что With - это совершенно ненужная вещь вообще, только разве что для красоты. А скорости With не прибавляет.

Добавлено через 11 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
Какие цифры?
Я же скинул скрин.

Добавлено через 11 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
Какие цифры?
Я же скинул скрин.
Цитата Сообщение от testuser2 Посмотреть сообщение
Exe полная оптимизация
там даже без полной оптимизации будет быстрее без With

Добавлено через 33 секунды
Цитата Сообщение от testuser2 Посмотреть сообщение
немного странновато
короче забудь про With он только замедляет код
0
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 14:50  [ТС]
Компиляция делает что-то не так, With должен быть быстрее, но разница в скорости микроскопическая на самом деле. Мой пример тоже может быть не достаточно корректен. Нужно тестировать на чем-то реальном. Я кидал ссылку на q-sort, но мне лень проверять.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 15:07
Цитата Сообщение от testuser2 Посмотреть сообщение
но мне лень проверять
там тоже скорость примерно одинаковая

Я вообще не понимаю почему ты так помешан на With? Он ведь только замедляет работу в EXE

Да, раньше в учебниках по Visual Basic писали что с With код работает быстрее, и я не думаю, что нам тогда лгали в то время в начале двухтысячных годов на слабых компьютерах и на слабых процессорах, скорее всего код вместе с With и правда работал быстрее. Теперь он стал медленнее. Я ни первый раз такое уже вижу, есть и другие у меня примеры где раньше в начале двухтысячных код работал быстрее на слабых старых компах, а теперь этот код уже стал медленнее на современных и мощных компьютерах.

Цитата Сообщение от testuser2 Посмотреть сообщение
Компиляция делает что-то не так
Всё так, не волнуйся, дело не в компиляции, а в процессорах

Добавлено через 3 минуты
Как бы объяснить. Вот например есть много встроенных функций в VB6 такие как Mid$ например или LCase во времена Windows 98 и слабых старых компьютеров эти коды Mid и LCase в VB6 работали медленнее чем аналоги в АПИ и всякие другие скрипты, а теперь эти функции работают быстрее за счёт того что у всех у нас теперь мощные многоядерные процессоры.

Добавлено через 5 минут
Я помню как был пример от Microsoft 98 года где показывалось что CopyMemory работает быстрее чем Mid. И это было в 98 году правдой. Теперь уже Mid работает быстрее. В том же майкрософтовском примере.

Добавлено через 2 минуты
И кстати, забыл сказать, если включить эти наши тесты на старом компе типа Pentium II то, скорее всего, с With будет работать быстрее. Я думаю, что это для слабых старых компьютеров будет правдой.
0
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
20.11.2024, 16:07  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Теперь уже Mid работает быстрее. В том же майкрософтовском примере.
Что за пример? Как-то не верится.

Добавлено через 39 минут
Нашел этот пример, и в правду Mid быстрее, даже чем vbaCopyBytes и даже в Твин-бейские. Это чертово не понятное дерьмо.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.11.2024, 16:11
Цитата Сообщение от testuser2 Посмотреть сообщение
Что за пример? Как-то не верится.
Да был где-то этот пример, искать надо...

Добавлено через 51 секунду
Цитата Сообщение от testuser2 Посмотреть сообщение
Это чертово не понятное дерьмо.
Я же говорю, что всё дело в мощностях процессоров
Короче забудь про With раз и навсегда
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2024, 16:11
Помогаю со студенческими работами здесь

Syntax error unexpected $end and premature end-of-file единственный варнинг
Помогите исправить!! Device (FWH) { Name (_HID, EisaId ("INT0800")) Method (_CRS, 0,...

Ведущие разработчики .NET (C#) Front-end и Back-end (Москва, не аутсорс)
В департамент разработки ПО крупной международной компании требуются: Lead Back-end developer: -Опыт разработки программного...

Error при создании .obj файла 85:End of file, no end directive
Добрый день! помогите разобраться с ошибкой! Компилирую следующий код в ibm personal computer macro assembler v 2.0: TITLE ...

With myChart With .Axes(xlCategory) .CategoryType = xlTimeScale .BaseUnit = xlseconds End With End With
MSDN утверждает: BaseUnit Property Applies To Axis object. Description Returns or sets the base unit for the specified category...

Работа в Германии (Front-End, Back-End или Full-Stack)
Ребят,я понимаю, реклама вас задолбала,но все-же, поступил заказ в наше агентство из Германии они ищут программиста.Работа в Германии,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru