1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,635
Записей в блоге: 2

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

06.10.2024, 08:52. Показов 3199. Ответов 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
dive
 Аватар для I can
4974 / 4676 / 848
Регистрация: 13.04.2015
Сообщений: 9,886
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
dive
 Аватар для I can
4974 / 4676 / 848
Регистрация: 13.04.2015
Сообщений: 9,886
20.11.2024, 10:44
Чем дальше - тем всё еще хуже

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


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

Добавлено через 2 минуты
Вопрос конечно есть, как работает with как ранее ли связывание или как-то по особому.
0
dive
 Аватар для I can
4974 / 4676 / 848
Регистрация: 13.04.2015
Сообщений: 9,886
20.11.2024, 10:53
Цитата Сообщение от testuser2 Посмотреть сообщение
I can, это может быть ситуация которую оптимизирует компилятор в одном случае, а в другом не оптимизирует
Так это же прекрасно, что он оптимизирует. Значит With замедляет работу программы в данном случае.
1
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,635
Записей в блоге: 2
20.11.2024, 12:10  [ТС]
В Твин-бейсике with уже можно исполтзовать для разименования указателя вроде.

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

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

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

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

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



2
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,635
Записей в блоге: 2
20.11.2024, 13:42  [ТС]
Это не очень корректный пример, я объяснял почему
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,635
Записей в блоге: 2
20.11.2024, 14:05  [ТС]
HackerVlad, этот проверь
Вложения
Тип файла: zip TestWithSpeed2.zip (3.3 Кб, 6 просмотров)
0
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
20.11.2024, 14:33
testuser2, ну проверил я твой пример. Без With быстрее.
0
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
20.11.2024, 14:33
Вот смотри
Изображения
 
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,635
Записей в блоге: 2
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
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
20.11.2024, 14:47
Делаем вывод, что With - это совершенно ненужная вещь вообще, только разве что для красоты. А скорости With не прибавляет.

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

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

Добавлено через 33 секунды
Цитата Сообщение от testuser2 Посмотреть сообщение
немного странновато
короче забудь про With он только замедляет код
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,635
Записей в блоге: 2
20.11.2024, 14:50  [ТС]
Компиляция делает что-то не так, With должен быть быстрее, но разница в скорости микроскопическая на самом деле. Мой пример тоже может быть не достаточно корректен. Нужно тестировать на чем-то реальном. Я кидал ссылку на q-sort, но мне лень проверять.
0
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,635
Записей в блоге: 2
20.11.2024, 16:07  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Теперь уже Mid работает быстрее. В том же майкрософтовском примере.
Что за пример? Как-то не верится.

Добавлено через 39 минут
Нашел этот пример, и в правду Mid быстрее, даже чем vbaCopyBytes и даже в Твин-бейские. Это чертово не понятное дерьмо.
0
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru