Текущий архив: 2011.11.06;
Скачать: CL | DM;
Вниз
if или case Найти похожие ветки
← →
начинающий2 (2011-07-13 14:04) [0]функция возвращает один из трех возможный результатов. нужно написать обработчик результата функции. так возможных результатов только 3 что разумнее всего использовать if или case
← →
Омлет © (2011-07-13 14:08) [1]Если это не узкое место, то выбирай более читабельный вариант.
← →
Сергей М. © (2011-07-13 14:12) [2]А если узкое, то выбирай более оптимальный с т.з. компилятора вариант.
← →
начинающий2 (2011-07-13 14:16) [3]что значил узкое место, во код:
какой вариает лучше
function TConnectionDataModule.GoToNext: Integer;
begin
try
except
on E: Exception do
begin
Result := -1;
if FRecordsGroup = RG_PRODUCTS then
FLastErrorMessage := Format(CannotGoToNextProductRecord, [E.Message])
else
if FRecordsGroup = RG_CATEGORIES then
FLastErrorMessage = Format(CannotGoToNextCategoryRecord, [E.Message])
else
FLastErrorMessage := Format(CannotGoToNextRecord, [E.Message]);
end;
end;
end;
function TConnectionDataModule.GoToNext: Integer;
begin
try
except
on E: Exception do
begin
Result := -1;
case FRecordsGroup of
RG_PRODUCTS: FLastErrorMessage := Format(CannotGoToNextProductRecord,
[E.Message]);
RG_CATEGORIES: FLastErrorMessage := Format(CannotGoToNextCategoryRecord,
[E.Message]);
else
FLastErrorMessage := Format(CannotGoToNextRecord, [E.Message]);
end;
end;
end;
end;
← →
начинающий2 (2011-07-13 14:22) [4]спрашиваю потому как где-то слышал что case генерит более оптимальный код.
← →
Медвежонок Пятачок © (2011-07-13 14:25) [5]ты смотрел старый советский фильм "не болит голова у дятла"?
← →
SQLEXPRESS (2011-07-13 15:05) [6]посмотрите по ctrl+alt+с
case i of
1: ShowMessage( "1");
2: ShowMessage( "2");
3: ShowMessage( "3");
else
ShowMessage( "123");
end;
if i = 1 then ShowMessage( "1") else
if i = 2 then ShowMessage( "2") else
if i = 3 then ShowMessage( "3") else
ShowMessage( "123");
uReestr.pas.146: case i of
0057BCDC 8BC3 mov eax,ebx
0057BCDE 48 dec eax
0057BCDF 7408 jz +$08
0057BCE1 48 dec eax
0057BCE2 7411 jz +$11
0057BCE4 48 dec eax
0057BCE5 741A jz +$1a
0057BCE7 EB24 jmp +$24
uReestr.pas.147: 1: ShowMessage( "1");
0057BCE9 B868BD5700 mov eax,$0057bd68
0057BCEE E8FD9EEBFF call ShowMessage
0057BCF3 EB22 jmp +$22
uReestr.pas.148: 2: ShowMessage( "2");
0057BCF5 B874BD5700 mov eax,$0057bd74
0057BCFA E8F19EEBFF call ShowMessage
0057BCFF EB16 jmp +$16
uReestr.pas.149: 3: ShowMessage( "3");
0057BD01 B880BD5700 mov eax,$0057bd80
0057BD06 E8E59EEBFF call ShowMessage
0057BD0B EB0A jmp +$0a
uReestr.pas.151: ShowMessage( "123");
0057BD0D B88CBD5700 mov eax,$0057bd8c
0057BD12 E8D99EEBFF call ShowMessage
uReestr.pas.154: if i = 1 then ShowMessage( "1") else
0057BD17 83FB01 cmp ebx,$01
0057BD1A 750C jnz +$0c
0057BD1C B868BD5700 mov eax,$0057bd68
0057BD21 E8CA9EEBFF call ShowMessage
0057BD26 EB2C jmp +$2c
uReestr.pas.155: if i = 2 then ShowMessage( "2") else
0057BD28 83FB02 cmp ebx,$02
0057BD2B 750C jnz +$0c
0057BD2D B874BD5700 mov eax,$0057bd74
0057BD32 E8B99EEBFF call ShowMessage
0057BD37 EB1B jmp +$1b
uReestr.pas.156: if i = 3 then ShowMessage( "3") else
0057BD39 83FB03 cmp ebx,$03
0057BD3C 750C jnz +$0c
0057BD3E B880BD5700 mov eax,$0057bd80
0057BD43 E8A89EEBFF call ShowMessage
0057BD48 EB0A jmp +$0a
uReestr.pas.157: ShowMessage( "123");
0057BD4A B88CBD5700 mov eax,$0057bd8c
0057BD4F E89C9EEBFF call ShowMessage
← →
SQLEXPRESS (2011-07-13 15:06) [7]по мне - case. Нагляднее.
← →
stas © (2011-07-13 15:27) [8]if начинающий2=нчинающий95 then exit;
← →
Игорь Шевченко © (2011-07-13 15:28) [9]
> except
> on E: Exception do
> begin
Уже за одно это надо пускать пулю в лоб тремя очередями
← →
начинающий2 (2011-07-13 15:32) [10]
> Игорь Шевченко © (13.07.11 15:28) [9]
>
>
> > except
> > on E: Exception do
> > begin
>
>
> Уже за одно это надо пускать пулю в лоб тремя очередями
а что не так? я вывожу сообщения вида:
нельзя переместиться на следующую запись, так как [сообщение эксепшена]
← →
SQLEXPRESS (2011-07-13 15:43) [11]except
on E:Exception do
begin
E.Message := E.Message + #13#10 + " поэтому думаю, что нельзя переместиться на следующую запись";
raise;
end;
end;
← →
начинающий2 (2011-07-13 15:44) [12]Или вот, например, функция добавления записи (все функции храняться в DLL библиотеке).
function TConnectionDataModule.AddRecord(GroupId, CategoryId: Integer): Integer;
var
IsProductRecord: Boolean;
begin
IsProductRecord := GroupId <> GROUP_0;
try
if (SocketConnectionStatus <> SCS_CONNECTED) or
not HasConnectedToDatabase then
raise Exception.CreateRes(@COnnectionNotAvailable);
if not GroupIdIsValid(GroupId) then
raise Exception.CreateRes(@InvalidGroupId, [GroupId]);
if not CategoryIdIsValid(CategoryId) then
raise Exception.CreateRes(@InvalidCategoryId, [CategoryId]);
{ ... }
except
on E: Exception do
begin
Result := -1;
if IsProductRecord then
FLastErrorMessage := Format(CanNotAddProductRecord, [E.Message])
else
FLastErrorMessage := Format(CanNotAddCategoryRecord, [E.Message]);
end;
end;
Человек ее вызывает, смотрит, что она возвратила. Если -1, то вызывает из этой же библиотеки функцию GetLastErrorMessage и смотрит текст ошибки. Сообщения при таком механизме получаются такого плана:
- Не удалось добавить товар, так как подключение к серверу отсутствует.
- Не удалось добавить раздел, так как подключение к серверу отсутствует.
- Не удалось добавить товар, так как группа (id = 14) не найдена.
- Не удалось добавить раздел, так как группа (id = 14) не найдена.
- Не удалось добавить товар, так как раздел (id = 17) не найден.
- Не удалось добавить раздел, так как раздел (id = 17) не найден.
Что вам не нравится, не понятно.
← →
Inovet © (2011-07-13 15:52) [13]> [12] начинающий2 (13.07.11 15:44)
> Что вам не нравится, не понятно.
Ты скрываешь и теряешь исходное сообщение об ошибке, взамен пишешь нечто, что может совсем не указывать на причину её возникновения. Как потом это поддерживать если ошибка неустойчивая и не повторить в лабораторных условиях, а тётенька по телевону скажет "Рамочка выскочила и на ней чё-то написано - не могу перемиститься"?
← →
sniknik © (2011-07-13 15:53) [14]> Что вам не нравится, не понятно.
с точки зрения поддержки получив "- Не удалось добавить товар, так как подключение к серверу отсутствует." исправь ситуацию, скажи что делать "чтобы работало"???
а ведь ты перекрыл как раз самое информативное - "нет доступа", "нет сети", "блокирован сокет", и т.д. та самая причина, что нужна, и от чего "подключение отсутствует".
т.е. ты просто сообщаешь об ошибке, как о факте, с тем же успехом можно поставить везде - "операция завершилась ошибкой, т.к. произошла ошибка."... а закрываешь причину из-за чего она произошла.
семь лет расстрела, через день до смерти!
← →
stas © (2011-07-13 15:54) [15]начинающий2 (13.07.11 15:32) [10]
except
on E: Exception do MySuperProcedure (E);Procedure MySuperProcedure (E:EException)
begin
...
end;
← →
Игорь Шевченко © (2011-07-13 15:55) [16]
> Что вам не нравится, не понятно.
- Не удалось добавить товар, так как Access violation at ...
читать: http://delphikingdom.com/asp/viewitem.asp?catalogid=1392
← →
stas © (2011-07-13 15:57) [17]Inovet © (13.07.11 15:52) [13]
Почему скрывает?
он выводит - Format(CanNotAddCategoryRecord, [E.Message]);
← →
sniknik © (2011-07-13 15:57) [18]> Человек ее вызывает, смотрит, что она возвратила.
"вызывающему человеку" похрену на все твои "изящества" (проверено практикой) у него 2 состояния - работает/не работает. и если не работает то вызывает он поддержку... которая с твоей программой затр... умучается то есть, но ничего не решит.
← →
начинающий2 (2011-07-13 16:15) [19]дело в том, что библиотека с функциями (..., AddRecord, GoToNextRecord, GoToPreviousRecord, ...) - это api для работы c торговой системой, представляет из себя ком-сервер и работать с ней будет не просто тетенька, а программист (все функции должны возвращать целочисленный результат при успешном выполнении и при ошибке). Я же стараюсь придерживаться механизма как в windows api. когда для получения подробных сведений об ошибке необходимо вызывать функцию GetLastError.
← →
Медвежонок Пятачок © (2011-07-13 16:27) [20]тогда ты не нужен, если будет работать программист.
← →
Сергей М. © (2011-07-13 16:31) [21]
> не просто тетенька, а программист
В смысле что-то бесполое ?)
← →
stas © (2011-07-13 16:38) [22]начинающий2 (13.07.11 16:15) [19]
ИспользуйCase
и не парься ))
← →
Юрий Зотов © (2011-07-13 16:42) [23]> начинающий2 (13.07.11 14:04)
> что разумнее всего использовать if или case
Ни то, ни другое.
1. Делаем такие объявления:
type
TRG = (RG_PRODUCTS, RG_CATEGORIES, ...); // тип результата FRecordsGroup
const
ErrMsg: array[TRG] of string =
(CannotGoToNextProductRecord, CannotGoToNextCategoryRecord, ...);
2. И теперь не нужны ни if, ни case - все стало просто и коротко:
on E: Exception do
begin
Result := -1;
FLastErrorMessage := Format(ErrMsg[FRecordsGroup], [E.Message]);
end;
← →
Rouse_ © (2011-07-13 19:15) [24]
> Игорь Шевченко © (13.07.11 15:28) [9]
> Уже за одно это надо пускать пулю в лоб тремя очередями
Правильно - и в первую очередь в лоб всем разработчикам VCL, или отказаться от использования оного...
зы: воть на вскидку из генофонда:except
on E: Exception do
Text := SBCDOverflow;
end;
← →
KilkennyCat © (2011-07-14 03:12) [25]генофонд уже давно не пример для подражания...
А на мой взгляд, в большинстве случаев, писать надо просто безглючно и удобно, базируясь на имеющихся знаниях (если их достаточно). Процессоры сейчас мощные, винчестеры большие. Заказчик интересуется лишь конечным результатом, за который и платит. Оплата позволяет некоторое время жить. Так что, если влияние на результат пренебрежимо мало, можно вместо цикла копи-пасте забабахать, а уж потом, на полученные средства купить книжку и почитать про циклы. Если же сначала купить книжку и прочитать про циклы, то прибыль меньше.
← →
Dennis I. Komarov © (2011-07-14 08:52) [26]
> Игорь Шевченко © (13.07.11 15:28) [9]
>
> > except
> > on E: Exception do
> > begin
>
>
> Уже за одно это надо пускать пулю в лоб тремя очередями
НЕ согласен. Софт, работает 24/7. Ну не надо мне видеть (особенно когда некому) исключения на экране, все в лог сваливается. Так за что сразу к стенке?
← →
SQLEXPRESS (2011-07-14 09:04) [27]
> Софт, работает 24/7.
тогда к программе с такими конструкциями
except
on E:Exception do
begin
E.Message := E.Message + #13#10 + " поэтому думаю, что нельзя переместиться на следующую запись";
raise;
end;
end;
просто добавляем ApplicationEvents, где на onError все пишем в фал
а если потребуется смотреть реальные ошибки,
тогда просто достаточно один метод убрать/обойти, а не лазить по всему тексту, вставляя Raise везде, где спрятал
← →
Dennis I. Komarov © (2011-07-14 10:12) [28]
> SQLEXPRESS (14.07.11 09:04) [27]
Не надо передергивать. Вопрос был за что к стенке при:except
?
on E: Exception do begin
> просто добавляем ApplicationEvents,
Куда?
> а не лазить по всему тексту, вставляя Raise везде, где спрятал
Все что спрятал отправил в лог...
← →
SQLEXPRESS (2011-07-14 11:25) [29]
> Не надо передергивать. Вопрос был за что к стенке при:
> except
> on E: Exception do begin?
Дэн, читай все. Стрелять за
except
on E: Exception do
begin
ToLog(E);
ToBuffer(E);
ToXXX(E);
end;
без перевозбуждения если. :)
> а не лазить по всему тексту, вставляя Raise везде, где спрятал
> Все что спрятал отправил в лог...
Твой код используют, он проглотил ошибку.
Пока еще разберутся, куда он что логгирует, проклянут 3 раза.
> > просто добавляем ApplicationEvents,
> Куда?
Вот. Куда - решит тот, кто использует.
Если это гуй - то на форму, если нет, то породит что-то в реал-тайме и привяжет.
Используя чужой код, ожидаешь от него реальную ошибку. А что с ней делать - решает обработчик выше.
Если это твой обработчик(для себя пишешь), пишешь в лог.
т.е.
если надо не стопорить приложение,
то твой обработчик самого последнего, верхнего уровня может писать в лог и гасить ошибку.
но
если его убрать,
то что бы все ошибки остались не обработанными.
А
если ты их неперевозбуждаешь,
то придется по коду лазить.
Вот ты уволился, дай бог в Газпром ушел :), твой код отдали следующему.
Он решил что-то доработать, вызвал твою функцию, она съела ошибку, он гадает, что же там такое.
vs
он отменил твой обработчик верхний, и сам получает все ошибки.
Что с ними делать - сам решает.
и ставит один свой верхний, если их опять надо гасить
← →
Игорь Шевченко © (2011-07-14 11:37) [30]Rouse_ © (13.07.11 19:15) [24]
Dennis I. Komarov © (14.07.11 08:52) [26]
> НЕ согласен.
Для несогласных дана ссылка на статью, читайте и воздастся
← →
Dennis I. Komarov © (2011-07-14 12:06) [31]
> Дэн, читай все. Стрелять за
А я про [9] и только. Ибо к коду [3] и т.п. не имею никакого...
> Вот. Куда - решит тот, кто использует.
> Если это гуй - то на форму, если нет, то породит что-то
> в реал-тайме и привяжет.
> Используя чужой код, ожидаешь от него реальную ошибку. А
> что с ней делать - решает обработчик выше.
> Если это твой обработчик(для себя пишешь), пишешь в лог.
>
А вот нету даже TApplication :P
З.Ы. Так стоило быть на столько категоричним???
> Игорь Шевченко © (14.07.11 11:37) [30]
Не конструктивно, слишком много букв... Суть где?
З.Ы.Ы.
Я ниразу не ЗА, чтоб ошибки прятали за своим "красивым" текстом...
← →
SQLEXPRESS (2011-07-14 12:50) [32]
> А вот нету даже TApplication :P
Джедаи помогут :)
(даже с № строки и текстом оператора ошибку покажут)
> З.Ы. Так стоило быть на столько категоричним???
Наверное, нет :)
> Я ниразу не ЗА, чтоб ошибки прятали за своим "красивым"
> текстом...
да это понятно..
я, напрмер, устал гадать.
как же надоело подключаться к юзерам и видеть надпись "Ошибка! Обратитесь разработчику"
Человек, писавший ее, безусловно, рубил в предмете, но как же напрягает после часового просмотра трейса всяких xxxMonitir от SysInternals, обнаружить, что она пробует в монопольном режиме открыть файл,
или писать в порт,
обламывается и вот так вот говорит об этом.
← →
Игорь Шевченко © (2011-07-14 13:28) [33]Dennis I. Komarov © (14.07.11 12:06) [31]
> Не конструктивно, слишком много букв...
Статья полезная, претензии по объему - к автору. Суть в статье.
← →
sniknik © (2011-07-14 16:06) [34]> Человек, писавший ее, безусловно, рубил в предмете
да ламер он, тот кто "рубит", имеет опыт ("книжное" "рубление" это немного не то) никогда так не напишет.
← →
Rouse_ © (2011-07-14 16:07) [35]
> Игорь Шевченко © (14.07.11 11:37) [30]
> Для несогласных дана ссылка на статью, читайте и воздастся
Для несогласных есть QualityCentral где ты совершенно спокойно можешь отписаться о багах в коде VCL и прикрепить линк на статью :)
← →
sniknik © (2011-07-14 16:11) [36]> "книжное" "рубление" это немного не то
можно прочитать кучу книг, и даже все, что там есть хорошо выучить, знать, но не использовать в работе... просто потому что не сталкивался/не воспринимаешь всерьез последствия.
← →
SQLEXPRESS (2011-07-14 16:32) [37]
> sniknik © (14.07.11 16:06) [34]
не, я имел ввиду немного другое
то что он знал, что если тут такая цифра а тут такая, то тут должна быть такая
Это правила предметной области, он тут спец.
т.е. он формализовал и алгоритмизировал то, что не каждый бы не смог.
А вот как это реализовал - да :)
это оставляет желать лучшего
← →
SQLEXPRESS (2011-07-14 16:34) [38]
> что не каждый бы не смог.
прямо по Фрейду :)
следует читать: * не каждый бы смог такое на алгоритм положить
← →
Dennis I. Komarov © (2011-07-14 17:26) [39]
> то что он знал, что если тут такая цифра а тут такая, то
> тут должна быть такая
> Это правила предметной области, он тут спец.
Что-то там не заметно, что он генерировал собственные исключения...
← →
SQLEXPRESS (2011-07-14 17:28) [40]
> Что-то там не заметно, что он генерировал собственные исключения.
> "Ошибка! Обратитесь разработчику"
except
тут что-то проверяет, пытается выкрутится
и если не выкрутились то ShowMessage
end;
← →
Dennis I. Komarov © (2011-07-14 18:02) [41]
> SQLEXPRESS (14.07.11 17:28) [40]
И что? Исключение то не его (скорее всего), он его только обрабатывает...
← →
Игорь Шевченко © (2011-07-14 18:42) [42]Rouse_ © (14.07.11 16:07) [35]
VCL и без меня найдется, кому лечить, а вот местных - уж извини
← →
Rouse_ © (2011-07-14 18:58) [43]Дык вот тоже времени нет :)
← →
_Юрий (2011-07-16 00:46) [44]
> SQLEXPRESS (14.07.11 11:25) [29]
> Дэн, читай все. Стрелять за
> except
> on E: Exception do
> begin
> ToLog(E);
> ToBuffer(E);
> ToXXX(E);
> end;
> без перевозбуждения если. :)
> начинающий2 (13.07.11 16:15) [19]
> все функции должны возвращать целочисленный результат при
> успешном выполнении и при ошибке
Читайте все, SQLEXPRESS
← →
Германн © (2011-07-16 02:49) [45]Для Enumerated всегда предпочитаю case, если есть выбор из трех и более.
Ей-богу гораздо нагляднее (по крайней мере при моем типе форматирования кода). Да и комментарии для вариантов удобно вставлять.
← →
sniknik © (2011-07-16 14:02) [46]> Это правила предметной области, он тут спец.
а... ну, видел как математик пишет... (бывший препод), при полной уверенности в, и "пропаганде" лозунга - "только хороший математик может быть хорошим программистом".
уравнения переведенные в код буквально... на пять страниц, никакой оптимизации, разделения на блоки, или использования одного пред рассчитанного результата в нескольких местах если нужно.
он как то нам дал задание "сделать хоть чуть лучше" за автомат по предмету (исходя из лозунга), я то как раз считаю "главное программистское мышление, и способность разбираться в том, что нужно для задачи... если она не математическая, то хоть всю жизнь пиши не зная математики".
ну вот тогда то и увидел, когда взялся... автомат тогда не получил, наоборот... не, если бы сделал "на чуть лучше" получил бы, и даже если просто "покаялся, типа не могу, у вас идеал" то получил бы четыре. но я сделал лучше на порядок (у него массив считался 15 на 15, у меня 255 на 255, у него ~5 мин, у меня ~3 сек, результаты расчета в реальном времени, а он любил об этом поговорить типа "вот когда компы станут мощнее, мы все это будем видеть наглядно"). он в общем обиделся, сказал что надо быть математиком лучше него чтобы так сделать, я не лучше, и значит это не я делал... в общем вместо автомата пришлось сдавать на комиссии (экзамен и пересдача у своего препода, а он сразу ставил 2 едва я входил в аудиторию, сильно видать обиделся, а вот на комиссии преподы чужие, могут быть даже с другого института. и вот другие поставили 4, ну как же комиссия, 5 нельзя. хотя и удивлялись как это студент с такими хорошими знаниями умудрился попасть на комиссию).
← →
SQLEXPRESS (2011-07-16 22:19) [47]
> sniknik © (16.07.11 14:02) [46]
гордыня, сударь :)
И, хоть и, как по-моему, заслуженная. Но все таки
А в моем случае что то с деньгами связано. Что-то с законом, что-то с бизнес логикой.
т.е. человек подошел конкретно, взял закон, взял бух.пособие и накатал.
там такие if if if if - чтоо 100% можно оптимальнее, но надо понять!!! прежде все это..
> _Юрий (16.07.11 00:46) [44]
Вы считаете, что один программист(группа) за короткий срок напишут обертку не уступающую исходному обработчику?
← →
Sha © (2011-07-16 23:48) [48]> sniknik
Также примерно было, только в школе.
В 9й класс пришлось уйти в мат. школу.
← →
Юрий Зотов © (2011-07-17 08:42) [49]У студента, с которым я когда-то занимался, тоже было подобное. В паскалевской программе под DOS было объявление массива с максимально возможным размером, что-то вроде этого:
type
TMyReal = real;
TMyRealArray = array[0..(65535 div SizeOf(TMyReal)] of TMyReal;
Препод начал возмущаться, что программа жрет огромную лишнюю память (хотя реально ни одной переменной такого типа в программе, конечно же, не было, этот тип использовался лишь для передачи параметра в подпрограмму). Студент начал ему доказывать, что никакой лишней памяти программе не жрет. Тот не верит. Тогда студент открывает книжку и тычет в нее пальцем - а в книжке показан этот самый прием с полным разжевыванием всей сути. Пришлось преподу согласиться, но на экзамене он отыгрался по полной. Трижды парень сдавал (хотя знал все на отлично, это уж можете мне поверить) - пока не упомянул, что придется ему идти к завкафедрой.
← →
DiamondShark © (2011-07-18 11:30) [50]
> уравнения переведенные в код буквально... на пять страниц,
> никакой оптимизации, разделения на блоки, или использования
> одного пред рассчитанного результата в нескольких местах
> если нужно.
Оптимизация, в том числе выделение и предрасчёт инвариантов -- это задача компилятора.
Программисты очень любят побить себя пяткой в грудь на тему, как они доблестно сражались с деталями реализации компилятора, но нормальных оптимизирующих компиляторов как не было 50 лет назад, так и нет до сих пор. И никогда не будет. Потому что тогда 95% "квалифицированных" программистов должны будут пойти в дворники, потому что их т.н. "квалификация" и заключается в умении бороться с кривыми инструментами, созданными другими такими же "квалифицированными".
На программистов должен распространяться принцип коллективной ответственности, как на евреев в Риме. И если какой-то программист что-то там возвякнёт про то, как он героически побеждал реаллоки массивов и кеширование инвариантов, ему надлежит бить кованным самогом в хрюпло, потому что он хочет в этот момент получить второй раз бабло за то, что ниасилил его такой же наглый, ленивый и "квалифицированный" собрат -- автор компилятора.
← →
DiamondShark © (2011-07-18 11:38) [51]Ну а преподы -- да. Это такая же коррумпированная гнилая каста упырей, как и программисты.
← →
Юрий Зотов © (2011-07-18 13:03) [52]Другими словами, весь цирк в ... - и тут выхожу я в белом фраке.
var
N: integer;
procedure P;
begin
N := 1; // Больше N нигде не используется
end;
...
for i := 0 to 1000000 do P;
Особо умным предлагается написать компилятор, который распознает инвариант и вынесет вызов P из цикла, а сам цикл удалит. Хотя бы в этом, самом наипростейшем случае.
Фишка здесь в том, что компилятор не имеет права выносить вызовы подпрограмм из циклов, потому что он не искусственный интелллект и не может распознать, что эти подпрограммы делают. А делать они могут что угодно.
И подобных фишек - сколько хошь. Так что никакой компилятор не может оптимизировать программу так же, как это может сделать программист.
← →
Rouse_ © (2011-07-18 13:49) [53]
> И если какой-то программист что-то там возвякнёт про то,
> как он героически побеждал реаллоки массивов и кеширование
> инвариантов, ему надлежит бить кованным самогом в хрюпло,
> потому что он хочет в этот момент получить второй раз бабло
> за то, что ниасилил его такой же наглый, ленивый и "квалифицированный"
> собрат -- автор компилятора.
Т.е. ты, стало быть, пишешь корявый и не оптимизированный код и при этом за эту лабуду мало того что получаешь деньги, так еще и как истину в последней инстанции толкаешь в массы?
← →
sniknik © (2011-07-18 14:12) [54]> как он героически побеждал реаллоки массивов и кеширование инвариантов
как всегда читаем одно понимаем то что хотим?
никаких "побежданий", просто приведен в порядок, убран дублирующийся и т.д код. часть формул вообще заменена на константы, формулы тоже были переделаны (но это я себе в заслугу не ставил, т.к. база все одно была его).
но никаких "тонких настроек", разве при них что-то говорилось.
а вот сказанное открытым текстом - профи в одном не обязательно профи, и даже скорее всего дилетант, если занимается этим любительски, в другом. это конечно лучше проигнорировать... ну ведь если понять написанное то гневных рецензий не получится, так ведь? и потролить не удастся... уже наркотик?
← →
Юрий Зотов © (2011-07-18 14:58) [55]Удалено модератором
← →
DiamondShark © (2011-07-18 15:11) [56]
> Юрий Зотов © (18.07.11 13:03) [52]
Вот так:
for i := 0 to 1000000 do;
Круче.
И потом сказать, что компилятор не имеет права выкинуть цикл, потому что, возможно, программист был не пьян, а просто так временную задержку отмеряет.
А в чём, собственно, проблема определить, что "// Больше N нигде не используется", выкинуть присваивание и заменить вызов пустой процедуры на пустой оператор? Сейчас даже не самые крутые компиляторы умеют так делать.
А в исполняющей среде с динамической кодогенерацией сквозная оптимизация возможна даже через границы импорта/экспорта.
← →
SQLEXPRESS (2011-07-18 15:23) [57]не-не, не надо умного компилятора :)
я вот писал программу для 3.11
repeat
until false;
ставил ей максимальный приоритет! Зачем? Чтоб ЦП загрузить :)
В другой очень удобно работать сразу становилось,
а иначе все летало, не успеваешь заметить
← →
DiamondShark © (2011-07-18 15:23) [58]Удалено модератором
Примечание: Правила читаем...
← →
Rouse_ © (2011-07-18 15:26) [59]Удалено модератором
Страницы: 1 2 вся ветка
Текущий архив: 2011.11.06;
Скачать: CL | DM;
Память: 0.66 MB
Время: 0.01 c