С Новым годом! Форум программистов, компьютерный форум, киберфорум
Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
13 / 13 / 2
Регистрация: 07.04.2010
Сообщений: 74

For-Next в разных BASIC: количество итераций внутри цикла уже не изменить

21.08.2012, 17:37. Показов 4364. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучал бейсик на ZX-Spectrum. Если кто не знает, это такая клавиатура, которая подключается к ТВ, а вместо дисковода используется кассетный/бабинный магнитофон.
Потом не мало посидел в QBasic под DOS.

Spectrum и QBasic при изменении значения max меняли количество повторов цикла.
Visual Basic
1
2
3
4
5
For i= min to max
что то делаем
If чего-то там случилось then max = max-1
еще что то делаем
Next i
Сегодня столкнулся интересной особенностью For-Next в VBA
Современному VBA нет дела до изменения значения параметра. Было сказано до max. Значит до max, и забудь что ты передумал и поменял значение max.
Пришлось использовать While, но это ж не по фен-шую, для простого перебора оптимален именно For-Next.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2012, 17:37
Ответы с готовыми решениями:

Задать количество итераций цикла
как сделать так чтоб цикл считал столько раз сколько я ввел? почему выводит ненужные цифры? #include <stdio.h> #include...

Как посчитать количество итераций цикла?
Не совсем представляю, как это осуществить. Т.е. возвращается х, а еще что-то вернуть, то будет немного не так, как хотелось бы, по идее....

Не выполняется нужное количество итераций цикла
Добрый день ребята!!!! Помогите найти ошибку!!! //--------------------------------------------------------------------------- ...

26
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
21.08.2012, 18:11
Такой стиль программирования чреват очень трудно распознаваемыми ошибками... И не факт, что For - Next так уж лучше While.
0
13 / 13 / 2
Регистрация: 07.04.2010
Сообщений: 74
21.08.2012, 18:32  [ТС]
С учетом того что конец цикла отодвинулся только на единичку, то искал долго.
На старых машинах For - Next работал заметно шустрее.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
21.08.2012, 18:51
Цитата Сообщение от Formanter Посмотреть сообщение
На старых машинах For - Next работал заметно шустрее
- шустрее ЧЕГО?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
22.08.2012, 10:37
- шустрее ЧЕГО?
видимо этого
Цитата Сообщение от Catstail Посмотреть сообщение
уж лучше While
естественно со счётчиком...
0
13 / 13 / 2
Регистрация: 07.04.2010
Сообщений: 74
22.08.2012, 16:15  [ТС]

Не по теме:

Прошу прощения, отсутствовал.


Quiet Snow ответил верно. Цикл For - Next работал быстрее чем While-счетчик-Wend
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
22.08.2012, 17:37
Про ZX-Spectrum не скажу, но вот результат тестирования трех видов циклов, которые делают одно и то же для Visual Basic:

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
47
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub Test_1()
    TBeg& = GetTickCount
    For i& = 1 To 1000
        S# = 0
        For j& = 1 To 10000   ' Обычный For-Next
            S# = S# + 2 * (j& - 1) + 1
        Next j&
    Next i&
    TEnd& = GetTickCount
    Me.Label1.Caption = CStr(TEnd& - TBeg&)
End Sub
 
Sub Test_2()
    TBeg& = GetTickCount
    For i& = 1 To 1000
        S# = 0
        j& = 1
        Do While (j& <= 10000) ' DO-While
            S# = S# + 2 * (j& - 1) + 1
            j& = j& + 1
        Loop
    Next i&
    TEnd& = GetTickCount
    Me.Label2.Caption = CStr(TEnd& - TBeg&)
End Sub
 
Sub Test_3()
    TBeg& = GetTickCount
    For i& = 1 To 1000
        S# = 0
        j& = 1
        Do                   ' бесконечный DO с явным выходом
            S# = S# + 2 * (j& - 1) + 1
            j& = j& + 1
            If j& > 10000 Then Exit Do
        Loop
    Next i&
    TEnd& = GetTickCount
    Me.Label3.Caption = CStr(TEnd& - TBeg&)
End Sub
 
Private Sub Command1_Click()
    Test_1
    Test_2
    Test_3
End Sub
Результат тестирования представлен на миниатюре. Действительно, For-Next незначительно (весьма незначительно!) быстрее Do While и вполне сопоставим с Do Loop...
Изображения
 
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
22.08.2012, 18:09
Ну во-первых, лонга нам не надо при тестировании конструкций

j& = j& + 1

т.е. ставим инты на внешнем и внутреннем цикле + увеличиваем внешний цикл(внутренний цикл ставим - предел инта).

а во-вторых вот эта штука хавает всё время(вычитание, умножение, конверт типа и 2
сложения дабла), хуже только тригонометрия и извлечение корня

S# = S# + 2 * (j& - 1) + 1

уберите её вообще оттуда и измеряйте чистое время работы циклов, в for счётчик уже есть,
его не может не быть т.к. сам for работает, если не верите что он работает, поставьте глобальный каунтер и смотрите по таймеру...
+ время работы программы должно быть большое, секунд 30 минимум, чтобы разницу было явно видно.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
22.08.2012, 18:13
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Ну во-первых, лонга нам не надо
- почему? Во-первых, long для современных процессоров - более родной тип данных, чем integer, а во-вторых - ведь все три цикла используют один тип...

Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
вот эта штука хавает всё время
- и что? Ведь она одинаково "хавает" во всех трех случаях.


Заменил long на integer. Результат ниже. Выводы? 1) Производительность циклов сопоставима 2) циклы с long работают быстрее (о чем я и говорил).

Кстати, "чистое время цикла For без тела" не так-то просто замерить... Не исключено, что компилятор такой цикл просто выкинет. Да и зачем нужен "пустой цикл"?
Изображения
 
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
22.08.2012, 18:21
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
время работы программы должно быть большое, секунд 30 минимум, чтобы разницу было явно видно.
- я считаю системные "тики". Нет необходимости ждать 30 сек. Все и так достаточно.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
22.08.2012, 18:29
- и что?
Считаем не то время, не время работы циклов, а время выполнения ЭТОЙ конструкции,
которая хавает в десятки раз больше времени, чем работа цикла.
Создам как я ща макрос и тоже проверю, самому интересно.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
22.08.2012, 18:32
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Создам как я ща макрос и тоже проверю, самому интересно.
- я тестировал не макросы, а нативный код в VB (в VBA выполняется интерпретация и результат будет другой).


Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Считаем не то время, не время работы циклов, а время выполнения ЭТОЙ конструкции,
- а зачем нужны циклы без тела?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
22.08.2012, 18:57
а нативный код в VB
А человек говорит про цитирую

Цитата Сообщение от Formanter Посмотреть сообщение
VBA
поэтому мой код на основе вашего и результат теста в Excel макросе:
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
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub Test_1()
    TBeg& = GetTickCount
    For i% = 1 To 1000
        For j% = 1 To 32000
        Next j%
    Next i%
    TEnd& = GetTickCount
    Label1.Caption = CStr(TEnd& - TBeg&)
End Sub
 
Sub Test_2()
    TBeg& = GetTickCount
    For i% = 1 To 1000
        j% = 1
        While j% <= 32000
            j% = j% + 1
        Wend
    Next i%
    TEnd& = GetTickCount
    Label2.Caption = CStr(TEnd& - TBeg&)
End Sub
 
Sub Test_3()
    TBeg& = GetTickCount
    For i% = 1 To 1000
        j% = 1
        Do
            j% = j% + 1
            If j% > 32000 Then Exit Do
        Loop
    Next i%
    TEnd& = GetTickCount
    Label3.Caption = CStr(TEnd& - TBeg&)
End Sub
 
Private Sub CommandButton1_Click()
    Test_1
    Test_2
    Test_3
End Sub
Результат:
250
2125
2250

Но если хотите, я специально для вас, накакаю себе в комп визуал бейсиком и
протестирую, делов то 15 минут...

в VBA выполняется интерпретация
Я вкурсе, потому и не понимаю нафига оно ТС'у сдалось , ничего он не выжмет с VBA не припаяв к нему dll'ку написанную на асме или на с...

- а зачем нужны циклы без тела?
За тем что счётчик... Я же говорю если не верите, ставьте глобал каунтер и смотрите по таймеру...
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
22.08.2012, 19:28
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
Но если хотите, я специально для вас, накакаю себе в комп визуал бейсиком и протестирую, делов то 15 минут...
- вы полагаете, что я фальсифицирую результаты тестирования? Зря...

Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
За тем что счётчик...
- что вы понимаете под "счетчиком"?

Добавлено через 8 минут
В VBA цикл FOR примерно вдвое быстрее. Мой тест на длинных целых дает:

1344
2297
2156

На коротких целых:

1406
2312
2906

Так что, применительно к VBA вы правы.

Добавлено через 1 минуту
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
я специально для вас, накакаю себе в комп
- ради Бога, не нужно!
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
22.08.2012, 19:47
- вы полагаете, что я фальсифицирую результаты тестирования? Зря...
Зачем, я вам верю. Вижу же код. Просто хочу показать другую сторону монеты.
Мой код и данные тоже реальны, то что цикл работает - тоже реально...
Создайте макрос запустите посмотрите.

- что вы понимаете под "счетчиком"?
То что в конструкции FOR он встроен как бы, а в других конструкциях приходится гениально
"высокоуровнево" решать этот вопрос, если вы когда н-ть кодили на асме, то понимаете как
неповоротлив ВУ-код, он не раскладывается по конвеерам, не оптимизирует работу с регистрами,
переходы ставит не там где надо, убивая кеш команд насмерть и предсказание переходов.
Человек не спроста задал этот вопрос, значит он упёрся в эту производительность и есть вероятность,
что он пытается что-то мелкое делать и видит существенную разницу ставя разные циклы.
И тут ему приходится ставить лишний счётчик и проверку условия(всё это ведь в FOR'е работает
побыстрее ясен пень, чем отдельно).
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
22.08.2012, 19:51
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
значит он упёрся в эту производительность
- уперся в производительность, программируя на бэйсике?
0
22.08.2012, 19:59

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
уперся в производительность, программируя на бэйсике
А что программируя на бейсике, компы автоматом начинают работать на сверхпроводниковых чипах в производительностью стремящейся к бесконечности?:D=-O

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
22.08.2012, 20:05
Цитата Сообщение от locm Посмотреть сообщение
А что программируя на бейсике, компы автоматом начинают работать
- "...подъезжая к сей станции, с моей головы слетела шляпа! (А.П. Чехов)" Но, если серьезно, то все очень просто: если бэйсик-программист "упирается в нехватку производительности", то есть только 2 способа:

1) радикально изменить алгоритм задачи
2) сменить язык программирования (на C/С++ или ассемблер)

И, вне всякого сомнения, выигрывать копейки на цикле FOR - не тот путь, который приведет к решению.
0
22.08.2012, 20:09

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
2) сменить язык программирования (на C/С++ или ассемблер)
Зачем сразу асм?
Достаточно асм вставок в код. Это позволит получить желаемую производительность при минимальных модификациях кода.

0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
22.08.2012, 20:10
- уперся в производительность, программируя на бэйсике?
В другом смысле, не в смысле выжал всю производительность из компа, а тупо упёрся, зная
что прога может работать быстрее и работает на других видах бейсика, я же тоже смотрел и
сравнивал как QB работает с циклами, человек явно в недоумении, про спектрум я ваще молчу
с его 3-мя мегагерцами, там каждый такт на счету...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2012, 20:10
Помогаю со студенческими работами здесь

Изменить переменную внутри цикла for
Сегодня только начал знакомиться с Go. Столкнулся с таким поведением: программа принимает 2 числа x, y. и должна y раз уменьшить x на...

Задать количество итераций цикла по несмежным диапазонам
Доброго времени суток всем! Столкнулся с такой задачей: есть цикл для заполнения ячеек определенных строк значением, для которого нужно...

Функция которая возвращает количество итераций цикла
Написать функцию, которая для заданного в качестве параметра числа возвращает количество итераций цикла, в котором из заданного числа...

Подсчитать количество итераций цикла в единицу времени
Хочу подсчитать производительность проги, зациклив её на час и подсчитав количество итераций. Как это проще всего сделать? Не обязательно...

Количество итераций цикла с одинаковым значением кратного
Здраствуйте. Подскажите пожалуйста как подсчитать количество итераций с одинаковым значением кратного. Вот незаконченный код: x=30 a=0 ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru