Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.20;
Скачать: CL | DM;

Вниз

Вакансия программиста (преимущественно 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;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.014 c
15-1311193788
Юрий
2011-07-21 00:29
2011.11.20
С днем рождения ! 21 июля 2011 четверг


15-1311763634
KSergey
2011-07-27 14:47
2011.11.20
Про хитро-задачки


15-1311773579
xayam
2011-07-27 17:32
2011.11.20
C++ => Object Pascal


15-1311797726
Petr V. Abramov
2011-07-28 00:15
2011.11.20
киньте сцылку на хорошую книжку по business objects


1-1273589288
guest
2010-05-11 18:48
2011.11.20
Закорючки в Excel