Форум: "Прочее";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];
ВнизВакансия программиста (преимущественно Delphi) Найти похожие ветки
← →
Дмитрий С © (2011-07-08 07:03) [40]
> Rouse_ © (07.07.11 17:38) [21]
А почему inline-ить процедуры нельзя?
← →
Rouse_ © (2011-07-08 09:40) [41]
> Дмитрий С © (08.07.11 07:03) [40]
> А почему inline-ить процедуры нельзя?
у инлайна свои ограничения, плюс ты когда еще у нас был, я вроде тебе показывал момент, когда при инлайне генерируется неверный код (тупо косяк компилера)
← →
Игорь Шевченко © (2011-07-08 09:45) [42]
> Поиск по хэш-массиву быстрее, чем прямой перебор всех вариантов
> case"ом
обычно после этой фразы приводится тест-кейс
← →
Palladin © (2011-07-08 10:10) [43]Ну case-то будет побыстрей на самом деле... ибо не перебор, а прямой jmp...
← →
Игорь Шевченко © (2011-07-08 10:53) [44]
> ибо не перебор, а прямой jmp...
не всегда
← →
Компромисс (2011-07-08 11:10) [45]Ну case-то будет побыстрей на самом деле... ибо не перебор, а прямой jmp...
Там зависимости разные, время case линейно зависит от размера, а map - гораздо меньше (не знаю точную формулу, logN, что ли). Так что при некотором N map будет быстрее. Например, при N=миллион никто оспаривать не будет, что case умрет, а map вполне справится.
← →
RWolf © (2011-07-08 11:18) [46]
> Например, при N=миллион никто оспаривать не будет, что case
> умрет
Не умрёт же, ну.
Начиная с некоторого (довольно малого) количества кейсов, перебор вариантов (O(N)) заменяется на прыжок по смещению (O(1)).
Полагаю, что case быстрее хэш-таблицы адресов функций всегда. Не говоря уже о том, что хэш-таблица в данном случае — лишняя сущность и усложнение.
← →
Компромисс (2011-07-08 11:21) [47]RWolf © (08.07.11 11:18) [46]
Тем хуже для Delphi-программистов в таком случае. Магия Delphi-компилятора прививает низкую культуру программирования.
← →
Кщд (2011-07-08 11:22) [48]>NkzAlex © (07.07.11 16:55) [8]
разницу между повышением квалификации и карьерным ростом понимаем?
← →
DiamondShark © (2011-07-08 11:30) [49]
> обычно после этой фразы приводится тест-кейс
Валидный тест пейсать лениво. А то, что не лениво -- будет весьма малоадекватно.
Реализация switсh -- это от полного перебора (худший случай) до двоичного поиска (лучший случай). Сложность поиска (что полного, что двоичного) -- O(n).
Сложность хэш-поиска (без коллизий) -- O(1).
Так что в сферическом вакууме (много значений, равномерно случайный поток данных) хэш быстрее.
В жЫзни же, как обычно, есть нюансы. O(n), конечно же, никуда не девается, но на коротких наборах основную роль играют накладные расходы, и алгоритм O(n) может оказаться (до некоторой длины набора) быстрее алгоритма O(1).
Вручную отсортированный switсh на коротком наборе с не равномерно распределённым потоком данных может уделать любой хэш.
Фишка хэша не в том, что он (якобы) ВСЕГДА быстрее, а в том, что конструкция, типа:
Handlers[switchKey].Execute();
в пятьдесят раз читабельнее, и в бесконечное число раз масштабируемее, чем switсh на пятьдесят вариантов.
Хотя, конечно, в некоторых случаях может быть и заметно медленнее.
← →
Компромисс (2011-07-08 11:38) [50]Оказывается, case автоматически компилируется в jump table не только в Delphi, но и например, в С. Так что case просто must die. Где-то когда-то читал, что в хорошей ООП программе не должно быть case, это атавизм от процедурного программирования.
← →
Palladin © (2011-07-08 11:43) [51]case это конструкция языка, а не парадигма разработки
← →
Компромисс (2011-07-08 11:52) [52]case это конструкция языка, а не парадигма разработки
Case c 50 ветвями - уже парадигма разработки :)
Даешь новое предупреждение компилятора "Case has too many branches, consider replacing it with a hash table" :)
← →
DiamondShark © (2011-07-08 11:58) [53]
> Даешь новое предупреждение компилятора "Case has too many
> branches, consider replacing it with a hash table" :)
И выдавать при количестве веток чуть более, чем 3.1415.
А если меньше трёх, то выдавать
"Case has too few branches, consider replacing it with IF statement"
← →
Компромисс (2011-07-08 12:07) [54]А если меньше трёх, то выдавать
"Case has too few branches, consider replacing it with IF statement"
Правильно, switch имеет смысл как отдельная конструкция только при 3 ветках. Квартетный оператор, так сказать.
← →
Нехочуха (2011-07-08 12:14) [55]
> Компромисс (08.07.11 12:07) [54]
> switch имеет смысл как отдельная конструкция только при 3 ветках.case PointInfo.PointType of
agrptFin: PointInfo.PointType := agrptLeftBottom;
agrptStart: PointInfo.PointType := agrptRightTop;
agrptRightTop: PointInfo.PointType := agrptStart;
agrptLeftBottom: PointInfo.PointType := agrptFin;
end;
Меня расстрелять.
← →
Компромисс (2011-07-08 12:19) [56]Меня расстрелять.
Конечно. См. DVM © (07.07.11 18:34) [25] в качестве правильного кода.
Да уже за PointInfo.PointType в каждой ветке можно ногами бить. Хорошо еще, что не MyPoints[PointIndex + PointShift].PointType
← →
Игорь Шевченко © (2011-07-08 12:19) [57]
> Так что case просто must die
must die не case
← →
Компромисс (2011-07-08 12:20) [58]must die не case
Согласен. must die case на 50 веток, который легко заменить.
← →
Inovet © (2011-07-08 12:23) [59]> [45] Компромисс (08.07.11 11:10)
> время case линейно зависит от размера
Надо в компиляторе оптимизацию case делать. В VC есть же? А вообще таблица как-то наглядней, удобней, имхо.
← →
Игорь Шевченко © (2011-07-08 12:27) [60]
> А вообще таблица как-то наглядней, удобней, имхо.
Таблица чего, блин ? Фрагментов кода ? Замени case на таблицы в коде VCL для начала.
← →
Inovet © (2011-07-08 12:30) [61]> [50] Компромисс (08.07.11 11:38)
> case автоматически компилируется в jump table не только в Delphi
Уже есть
← →
Inovet © (2011-07-08 12:38) [62]> [60] Игорь Шевченко © (08.07.11 12:27)
> Таблица чего, блин ? Фрагментов кода ?
Так здесь речь ведут об однотипных вызовах в каждой ветке. Ты типа не понял. А 50 веток с разным кодом в каждой тяжко читать.
← →
Компромисс (2011-07-08 12:40) [63]А 50 веток с разным кодом в каждой тяжко читать.
50 веток с одинаковым (похожим) кодом еще более тяжко читать.
← →
Inovet © (2011-07-08 12:42) [64]> [63] Компромисс (08.07.11 12:40)
> 50 веток с одинаковым (похожим) кодом еще более тяжко читать.
Да пофиг, и так и так можно нормально сделать. Главное в религию не удариться.
← →
DiamondShark © (2011-07-08 12:52) [65]
> Таблица чего, блин ? Фрагментов кода ?
Фрагмент кода называется процедурой.
В таблице процедур нет ничего сверхестественного.
← →
Думкин © (2011-07-08 12:56) [66]А c goto то как теперь?
← →
Anatoly Podgoretsky © (2011-07-08 13:04) [67]В справке этого нет, но ранее в любой книжке было написано, указывайте варианты в порядке возрастания, так как будет сгенерирован более оптимальный код. Как сейчас не знаю, не буду я ломать голову ради каких то 50 вариантов, это же не замерить даже
← →
Anatoly Podgoretsky © (2011-07-08 13:07) [68]Нужно эе время на генерацию хеш кода и на поиск в хешь таблице. Не знаю каким динным должно быть выражение CASE, что бы можно было что то ощутить.
← →
Компромисс (2011-07-08 13:07) [69]Anatoly Podgoretsky © (08.07.11 13:04) [67]
Я вообще удивляюсь с некоторых компиляторов - сгенерировать таблицу переходов они могут, а упорядочить case перед использованием (с учетом отсутствия fallthrough в Pascal) не могут и требуют ручной сортировки от программиста...
← →
Anatoly Podgoretsky © (2011-07-08 13:08) [70]> Думкин (08.07.2011 12:56:06) [66]
А тебе оно нужно?
← →
Anatoly Podgoretsky © (2011-07-08 13:10) [71]> Компромисс (08.07.2011 13:07:09) [69]
Так в некоторых языках просто нельзя менять положение, чтобы не разрушить
последовательность выполнения, например в СИ
← →
Anatoly Podgoretsky © (2011-07-08 13:10) [72]И не дело компилятора решать дурак программист или нет.
← →
Думкин © (2011-07-08 13:10) [73]> Anatoly Podgoretsky © (08.07.11 13:08) [70]
Переживаю за чистоту кодинга. А то мало ли. И стоит ли использовать repeat и т.п. Кто его знает, какие там веяния и к чему готовиться на собеседованиях. :)
← →
DiamondShark © (2011-07-08 13:20) [74]
> Думкин © (08.07.11 12:56) [66]
> А c goto то как теперь?
Эти в соседней палате. Мы туда не ходим, буйные они там.
← →
Компромисс (2011-07-08 13:40) [75]Anatoly Podgoretsky © (08.07.11 13:10) [71]
Я это знаю. Поэтому и написал "(с учетом отсутствия fallthrough в Pascal)" . То есть в Паскале всегда можно пересортировать и это абсолютно безопасно.
← →
Игорь Шевченко © (2011-07-08 13:43) [76]DiamondShark © (08.07.11 12:52) [65]
Всякий овощ приносит пользу, будучи употреблен надлежащим образом в надлежащее время.
Преобразовывать case в таблицу процедур, увеличивая размер кода, только потому что в этой ветке кто-то посчитал это кошерным есть пустая и вредная трата времени.
← →
Компромисс (2011-07-08 13:53) [77]Преобразовывать case в таблицу процедур, увеличивая размер кода, только потому что в этой ветке кто-то посчитал это кошерным есть пустая и вредная трата времени.
Действительно, дело немного в другом. Наличие такого case говорит о том, что программист не совсем владеет advanced навыками ООП. Построением архитектуры, правильным делением на объекты, шаблоном команда и т.д.
← →
Игорь Шевченко © (2011-07-08 14:02) [78]Компромисс (08.07.11 13:53) [77]
> Наличие такого case говорит о том, что программист не совсем
> владеет advanced навыками ООП
Обратное говорит о том, что программист привык усложнять код в угоду теориям вместо поиска оптимальных решений.
← →
Думкин © (2011-07-08 14:04) [79]> Компромисс (08.07.11 13:53) [77]
Это же не самоцель. Или нет? Иногда такие дебри в итоге разбирать приходится.
← →
Компромисс (2011-07-08 14:05) [80]Обратное говорит о том, что программист привык усложнять код в угоду теориям вместо поиска оптимальных решений.
Да, бывает и такое.
Страницы: 1 2 3 4 вся ветка
Форум: "Прочее";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.006 c