ivagor (05.02.2025), metamorpho (05.02.2025)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Спасибо, я умудрился скопировать хвост варианта NEXT из варианта GOTO, а правильный вариант такой
1 REM
10 REM
100 REM
199 FORI=.TO1STEP.:GOTO234
200 REM
234 REM
999 NEXT
metamorpho (05.02.2025), svofski (05.02.2025)
Не хотел там править, чтобы было понятен последующий диалог. Сейчас поправил, надеюсь с разными датами исходного сообщения и правки будет понятнее.
Могу только повторить, что для варианта с GOTO199 это перебивание кеширования номера строки в 2.996, чтобы лучше соответствовало реальным программам, у которых внутри циклов бывают переходы.
Узкоспецифический вопрос - какой вариант записи дробных чисел быстрее для парсинга и преобразования во внутреннее представление?
В 2.5 A=.1 или A=.9 быстрее, чем A=1E-1 или A=9E-1. Но при наличии нулей после запятой вариант с E становится предпочтительнее: A=1E-2 или A=9E-2 быстрее, чем A=.01 или A=.09.
В 2.996 вариант с E всегда быстрее.
Ну и я уже писал, что при частом использовании числа большой (по модулю) степени и/или с большим количеством знаков после запятой его выгоднее присвоить переменной и пользоваться ей.
metamorpho (06.02.2025)
Понятно. То есть это попытка приблизить бенчмарк к реальности, а не часть рекомендованного паттерна. Тебе наверное трудно в это поверить, но это совершенно не очевидно. Это выглядит в контексте примера как какой-то особый трюк, который позволяет все разогнать в два раза. По-моему совсем не вредно такие примеры подробно документировать.
Больше игр нет
metamorpho (06.02.2025)
Согласен, надо было четче разграничить суть и дополнительные бантики.
Суть простая - в "бесконечных" циклах вместо
GOTO назад
быстрее делать так
FORI=.TO1STEP.
...
NEXT
Переменная I выбрана случайным образом, можно использовать и другие буквы.
Improver (07.02.2025), metamorpho (06.02.2025), svofski (06.02.2025)
В msbasicах (даже версий 5.x) нет команды досрочного прерывания цикла FOR...NEXT, но есть как минимум два варианта, как это сделать.
1. Очевидный.
Если мы проверили внутри цикла некое условие и оказалось, что надо цикл прервать, то присваиваем переменной цикла конечное значение и переходим на NEXT.
Строго говоря можно взять значение чуть меньше, главное чтобы (это значение+шаг цикла)>конечное значение. Это может иметь смысл, например если конечное значение дробное, а мы хотим для краткости и скорости использовать целое.
2. Менее очевидный. Годится при наличии вложенных циклов.
Если нам надо досрочно окончить внутренний цикл, то делаем переход за пределы внутреннего NEXT. Главное - надо в NEXT внешнего цикла обязательно добавить имя переменной этого цикла.
NEXT с указанием переменной сбросит со стека "лишнее" и дойдет до своей переменной. Особенно эффективен этот вариант для прерывания сразу нескольких внутренних циклов с выходом во внешний.
Вариант 1 при наличии вложенных циклов тоже годится, но скорее всего вариант 2 будет чуть быстрее, хотя лучше проверять конкретные случаи.
metamorpho (08.02.2025)
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)