OberonCore
https://forum.oberoncore.ru/

Динамический массив. Алгоритм ввода числ.последовательности
https://forum.oberoncore.ru/viewtopic.php?f=35&t=513
Страница 3 из 3

Автор:  Илья Ермаков [ Четверг, 14 Июнь, 2007 14:34 ]
Заголовок сообщения: 

Vlad писал(а):
Это все схоластика и мне неинтересно в нее вдаваться. Конкретный код с break/return как минимум удобнее и нагляднее.

Все споры на эту тему как раз и показывают, что это - субъективно и дело привычки. А вот то, какой вариант формально грамотнее, вполне доказуемо.

Автор:  Сергей Губанов [ Четверг, 14 Июнь, 2007 14:54 ]
Заголовок сообщения: 

Если совместить операцию чтения с возвращением статуса, то получится цикл WHILE без компромисов:

WHILE ReadNext(i) DO ... END

Автор:  slava [ Четверг, 14 Июнь, 2007 15:29 ]
Заголовок сообщения: 

Сергей Губанов писал(а):
Если совместить операцию чтения с возвращением статуса, то получится цикл WHILE без компромисов:

WHILE ReadNext(i) DO ... END

Функция с побочным эффектом - нехорошо.

Может так?
Код:
WHILE HasNext() DO i := Next() END;

Автор:  Сергей Губанов [ Четверг, 14 Июнь, 2007 15:45 ]
Заголовок сообщения: 

Вообще-то любая процедура/функция чтения сдвигающая позицию курсора является процедурой/функцией с побочным эффектом. У Вас побочным эфектом обладает функция Next().

PROCEDURE ReadInteger (OUT i: INTEGER): BOOLEAN;

возвращающая статус операции - это просто "сокращенная запись" вот такой процедуры:

PROCEDURE ReadInteger (OUT i: INTEGER; OUT status: BOOLEAN);

первый вариант этой процедуры как раз предназначен для подстановки в цикл WHILE.

Автор:  Trurl [ Четверг, 14 Июнь, 2007 16:38 ]
Заголовок сообщения: 

Сергей Губанов писал(а):
первый вариант этой процедуры как раз предназначен для подстановки в цикл WHILE.

И чег после этого стоят все рассуждения о преимуществах while и недостатках loop?

Автор:  PGR [ Четверг, 14 Июнь, 2007 16:47 ]
Заголовок сообщения: 

Trurl писал(а):
И чег после этого стоят все рассуждения о преимуществах while и недостатках loop?

:oops:

Автор:  Vlad [ Пятница, 15 Июнь, 2007 12:00 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Vlad писал(а):
Это все схоластика и мне неинтересно в нее вдаваться. Конкретный код с break/return как минимум удобнее и нагляднее.

Все споры на эту тему как раз и показывают, что это - субъективно и дело привычки. А вот то, какой вариант формально грамотнее, вполне доказуемо.


Докажи ;) Заодно еще докажи, что WHILE формально "правильнее" рекурсии. Я уже говорил, что формальность сама по себе ничего не стоит, если на практике она оборачивается несопровождаемым кодом.

С точки зрения сопровождения для меня, например, принципиально, чтобы для случая когда "код инициализации" по определению повторяет "код итерирования", этот код был гарантировано одинаковым. Такую гарантию дает только написание этого кода в одном экземпляре внутри цикла. А вот цикл, написанный "по общей схеме", такой гарантии мне не дает, только формальные размышления о формальности такого подхода, не учитывающие банальные человеческие факторы (читабельность и способность ошибаться).

Автор:  PGR [ Пятница, 15 Июнь, 2007 14:17 ]
Заголовок сообщения: 

Vlad писал(а):
С точки зрения сопровождения для меня, например, принципиально, чтобы для случая когда "код инициализации" по определению повторяет "код итерирования", этот код был гарантировано одинаковым. Такую гарантию дает только написание этого кода в одном экземпляре внутри цикла.

Так уже переписали с WHILE и без повторений :)

Вместо
Код:
Берем_след_элемент;
WHILE Взят_успешно() DO
   Используем элемент;
   Берем_след_элемент;
END;


использовать
Код:
WHILE Прочитан_элемент(e) DO
   Используем_элемент(e);
END;

Автор:  Vlad [ Пятница, 15 Июнь, 2007 15:28 ]
Заголовок сообщения: 

PGR писал(а):
использовать
Код:
WHILE Прочитан_элемент(e) DO
   Используем_элемент(e);
END;


Да, так лучше, если только написание отдельной функции того стоит.

Автор:  PGR [ Пятница, 15 Июнь, 2007 16:03 ]
Заголовок сообщения: 

Vlad писал(а):
PGR писал(а):
использовать
Код:
WHILE Прочитан_элемент(e) DO
   Используем_элемент(e);
END;


Да, так лучше, если только написание отдельной функции того стоит.

Кроме того, BlackBox не выполняет inline подстановку функций и при больших объёмах вычислений можно серьёзно потерять в производительности.

Автор:  Евгений Темиргалеев [ Пятница, 15 Июнь, 2007 16:06 ]
Заголовок сообщения: 

Vlad писал(а):
Гы :) Кстати к вопросу о "первосортных" программистах, которые пишут "правильные" циклы для использования "второсортными". Я тут глянул реализацию стандартного сишного find. Ужасайтесь :)

Код:
{
  _STLP_DIFFERENCE_TYPE(_RandomAccessIter) __trip_count = (__last - __first) >> 2;

  for ( ; __trip_count > 0 ; --__trip_count) {
    if (*__first == __val) return __first;
    ++__first;

    if (*__first == __val) return __first;
    ++__first;
...


Тут вам и множественные return (даже не break) из цикла, и switch (о ужас!) без break'ов.

P.S. Только не надо кричать, что STLPort писали "второсортные" программисты. Скромнее надо быть (c).

Могу предположить, что этот нетривиальный код - оптимизация. Ручное разворачивание цикла. Чтобы быстрее выполнялось на МП с суперскалярной архитектурой.

Однако, этот код стандартной библиотеки. Если предположить, что еще есть какие-либо системы (встроенные) с не суперскалярными МП, то там будет хуже. Выигрыша по времени нету, а места занимает больше. Гораздо больше....

Автор:  dk [ Суббота, 16 Июнь, 2007 16:22 ]
Заголовок сообщения: 

Евгений Темиргалеев писал(а):
Vlad писал(а):
Гы :) Кстати к вопросу о "первосортных" программистах, которые пишут "правильные" циклы для использования "второсортными". Я тут глянул реализацию стандартного сишного find. Ужасайтесь :)

Тут вам и множественные return (даже не break) из цикла, и switch (о ужас!) без break'ов.

Могу предположить, что этот нетривиальный код - оптимизация. Ручное разворачивание цикла. Чтобы быстрее выполнялось на МП с суперскалярной архитектурой.


Абсолютно верно, это ручное разворачивание цикла с целью оптимизации. И суперскалярность здесь не при чем, даже на обычном Pentium-процессоре должен быть выигрыш во времени исполнения. Дело в том, что передача управления в машинном коде выполняется медленно, поскольку приводит к очистке конвейера процессора. Соответственно, для уменьшения числа переходов делается раскрутка цикла.

Автор:  slava [ Воскресенье, 17 Июнь, 2007 21:35 ]
Заголовок сообщения: 

Не очень понимаю все эти развороты циклов вручную, современные компиляторы сами умеют делать это тогда когда надо, более того у самого процессора есть свои "предсказатели переходов" Branch Prediction. В большинстве случаев угадывают неплохо (до 97% попадания, кажется). Вот и "разворачивай" после этого.

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/