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?
|
Автор: | 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/ |