Тема открыта по просьбе жителей Королевства и посвящена обсуждению вопросов оптимизации кода. Выставляйте свои лучшие и худшие тексты и не стесняйтесь их обсуждать. В споре рождается истина. Или, по крайней мере, оптимизация.
Всего в теме 737 сообщений
Добавить свое сообщение
Отслеживать это обсуждение
- Тестирование проекта. Отладка.
- Подводные камни
- Централизованная обработка ошибок
- Бета-тестирование
- Давайте учиться на ошибках.
- Почему программисты допускают ошибки?
- Автоматизированные тесты для GUI
- О системах контроля ошибок
№ 717 25-05-2009 04:01 | |
Не помню где недавно вычитал примерно следующее.
При упоминании распределённых вычислений
теоретики правильного программирования впадают в панику.
№ 716 25-05-2009 03:58 | |
Ответ на »сообщение 713« (S.)
___________________________
ПРОЦЕДУРА Имя;
НАЧАЛО
...
Получаем управляющие данные от другого модуля (ещё один вход)
...
ЕСЛИ что-то проверяем ТО выходим из процедуры
что-то делаем
...
КОНЕЦ;
2 входа, 2 выхода.
Оболочка только очерчивает группу переходов.
№ 715 25-05-2009 03:51 | |
Ответ на »сообщение 713« (S.)
___________________________
>>> ***Точка входа в конструкцию ветвления
>>> ЕСЛИ условие ТО алгоритм1 ИНАЧЕ алгоритм2
>>> ***Точка выхода из конструкции ветвления
Какое же это ветвление?
Это выполнение по условию.
То есть можно заменить на последовательное.
ЕСЛИ условие ТО алгоритм1
ЕСЛИ НЕусловие ТО алгоритм2
Ветвление, это когда переходим на разные логические потоки
со своими дальнейшими вариантами ветвления в том числе.
Другое дело, что так называемое структурное программирование
с принципом разработки "сверху вниз" действительно подразумевает
последовательное, цепочечное выполнение программы.
Именно от этого устойчивого заблуждения
появилась упрощенческая формула "один вход, один выход".
Если вспомнить про параллельное программирование,
то подобная "структура" с очевидностью выморочна.
№ 714 25-05-2009 02:30 | |
Ответ на »сообщение 713« (S.)
___________________________
>>> На этом обсуждение оптимизации кода можно заканчивать :)
:D
Знаете, обычно я на ассемблер перехожу, когда что-то не получается эффективно реализовать на уровне ЯВУ. В частности, я очень люблю машинные команды для обработки строк, и меня дико раздражает, что при компиляции программы на Паскале вместо этих команд используется перебор элементов массива.
>>> Всегда?
Да, всегда. Сделаем Вашу процедуру внутренней и для нее допишем процедуру-оболочку
ПРОЦЕДУРА Оболочка;
НАЧАЛО
ВЫЗОВ ПРОЦЕДУРЫ Имя;
КОНЕЦ;
Итого имеем один вход и один выход.
Я ведь сразу уточнил, что всегда относится к ситуации, "Если же речь идет о реализации" ;-)
№ 713 24-05-2009 23:03 | |
>>>Функция достаточно эффективна. Размер -- 17 байт.
На этом обсуждение оптимизации кода можно заканчивать :). Из двух конструкций на языке высокого уровня выбираем тот, для которого транслятор генерирует более короткий и быстродействующий код.
>>>Ветвление не проходит под формулу "один вход, один выход".
Если под ветвлением понимать только одно условие, то да. А если всю конструкцию, то нет.
***Точка входа в конструкцию ветвления
ЕСЛИ условие ТО алгоритм1 ИНАЧЕ алгоритм2
***Точка выхода из конструкции ветвления
Впрочем у меня сейчас нет под рукой работ "классиков" по этому вопросу. Что они сами имели в виду утверждать пока не могу. Надо поискать первоисточники...
>>>Если же речь идет о реализации, то тут проблем никаких: упаковываем
>>>реализацию алгоритма в процедуру и всегда получаем один вход и один
>>>выход ;-)
Всегда?
;-)
ПРОЦЕДУРА Имя;
НАЧАЛО
что-то делаем
...
ЕСЛИ что-то проверяем ТО выходим из процедуры
что-то делаем
...
выходим из процедуры
КОНЕЦ;
Здесь 1 вход, но 2 выхода!
№ 712 22-05-2009 07:25 | |
Ответ на »сообщение 687« (S.)
___________________________
Я все же поразвлекался дома и сделал реализацию на ассемблере
function FindPos(FindVal : Byte; BufPtr : Pointer; BufLen : Integer) : Integer; register;
asm
push edi
mov edi,edx
mov edx,ecx
repne scasb
je @Found
xor edx,edx
@Found:
mov eax,edx
sub eax,ecx
pop edi
end;
Здесь FindVal -- значение, которое нкужно найти (тип -- Byte). BufPtr -- указатель на начало буфера данных. BufLen -- длина буфера. Возвращает позицию байта в буфере, имеющего значение равное FindVal. Нумерация начинается с единицы. Если элемент не найден, возвращается ноль.
Функция достаточно эффективна. Размер -- 17 байт. И работать будет быстрее, чем предложенные варианты на Паскале, так как оптимизатор ни доля одного варианта не предлагает поиск через REPNE SCAS, а занимается последовательным перебором элементов массива, сравнивая каждый с искомым значеним.
№ 711 21-05-2009 12:06 | |
Ответ на »сообщение 705« (S.)
___________________________
>>> у структурного алгоритма должна быть 1 точка входа и 1 точка выхода
У Дейкстры было последовательное выполнение, цикл и ветвление.
Ветвление не проходит под формулу "один вход, один выход".
Либо Вы имели в виду что-то другое.
№ 710 21-05-2009 07:49 | |
Ответ на »сообщение 700« (Александр Алексеев)
___________________________
Цикл for тоже можно исключить из грамматики языка "без какого-либо ущерба".
Ага. в Python так и сделали. Есть только for-in и while.
№ 709 21-05-2009 06:28 | |
Ответ на »сообщение 701« (S.)
___________________________
>>> А моделировать for с помощью while или repeat - это неудобно
Думаю, что программисты на Си не поймут данного утверждения. Преимущество цикла FOR в Паскале -- скорость работы. Недостаток -- ограничение на использование переменной цикла. Ну и еще к недостаткам можно отнести, что в цикле WHILE нужно инкремент переменной самростоятельно выполнять, но зато шаг цикла можно делать произвольным. Вот и все различия, которые я смог придумать. А в остальном, что вариант
for i:=1 to N do
begin
end;
что вариант
i:=1;
while i <= N do
begin
Inc(i);
end;
да хотя бы и вариант
for(i=0;i<=N;i++)
все это -- вещи одного порядка, и особой сложности в переходе с одного на другой не наблюдается.
Ответ на »сообщение 705« (S.)
___________________________
>>> А какое отношение у общественности к такому принципу структурного программирования: "у структурного алгоритма должна быть 1 точка входа и 1 точка выхода"?
Не понял, причем тут это. Ну, ладно. Про вход согласен. А вот с выходами -- не совсем. Если рассуждать на уроыне алгоритма, то иногда для полнимания удобнее остановитья на нескольких выходах (например, правильный и ошибочный). Единственно, нужно четко выделять терминальные элементы алгоритма.
Если же речь идет о реализации, то тут проблем никаких: упаковываем реализацию алгоритма в процедуру и всегда получаем один вход и один выход ;-)
№ 708 21-05-2009 06:14 | |
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|