Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.008 c
2-1311757172
SQLEXPRESS
2011-07-27 12:59
2011.11.20
Работать с Word, не через буфер обмена


8-1218318649
MS_TAURUS
2008-08-10 01:50
2011.11.20
выбор звуковой карты по умолчанию


15-1311252880
Дмитрий С
2011-07-21 16:54
2011.11.20
Как можно так стремно делать программы в 21 веке?


15-1311625800
Юрий
2011-07-26 00:30
2011.11.20
С днем рождения ! 26 июля 2011 вторник


15-1311915862
И. Павел
2011-07-29 09:04
2011.11.20
Восстановление бекапа БД в другую БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский