Чего мне не хватает в FreePascal

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Ответить
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

В основном сравниваются только хеш - 32 битное число, как только мы нашли нужное число, мы сравниваем и ключ (строку) для избежания коллизий, если строки не совпали идем дальше сравнивать хеши и все повторяется до того момента, пока мы не найдем нужный ключ.
Шурик Сетевой
новенький
Сообщения: 11
Зарегистрирован: 05.03.2009 20:42:42

Сообщение Шурик Сетевой »

devels писал(а):Операционка Win XP 32.

Хеш функция у меня самая простая и максимально быстрая, быстрее сделать нереально:
По-моему в FPC тоже простая функция.


У вас используется умножение в цикле, это дорого. Функция FPHash из Contnrs, скорее всего, окажется существенно быстрее - у них там только сдвиги и вычитания.

Куда рыть в смысле оптимизации хеш-функций, я точно не скажу, не помню, где видел сравнение быстродействия и коллизионной устойчивости, но вроде бы сойдет PJW-32 (есть в Википедии), там всего одно деление (в конце вычисления), а в цикле только сдвиги и сложение. Насколько я помню, ее коллизионная стойкость примерно 1 коллизия на 30000 ключей
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

Шурик Сетевой писал(а):
devels писал(а):Операционка Win XP 32.

Хеш функция у меня самая простая и максимально быстрая, быстрее сделать нереально:
По-моему в FPC тоже простая функция.


У вас используется умножение в цикле, это дорого. Функция FPHash из Contnrs, скорее всего, окажется существенно быстрее - у них там только сдвиги и вычитания.

Куда рыть в смысле оптимизации хеш-функций, я точно не скажу, не помню, где видел сравнение быстродействия и коллизионной устойчивости, но вроде бы сойдет PJW-32 (есть в Википедии), там всего одно деление (в конце вычисления), а в цикле только сдвиги и сложение. Насколько я помню, ее коллизионная стойкость примерно 1 коллизия на 30000 ключей


Она там из-за AnsiString уже не так влияет на скорость - сравните - 3600 mlsec с ансистринг, и 200 mls c shortstring.

http://ru.wikipedia.org/wiki/PJW-32

По моим тестам моя хеш-функция в 2 раза быстрее этой, т.к. в ней полно левых операций. По научному моя функция называется BKDRHash.
Шурик Сетевой
новенький
Сообщения: 11
Зарегистрирован: 05.03.2009 20:42:42

Сообщение Шурик Сетевой »

да, нашел сравнение в инете, вроде бы K&R вполне быстрый, по крайней мере быстрее PJW32
http://www.strchr.com/hash_functions
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Чего не хватает мне:

1. Скорости компиляции. В 10 раз медленнее Delphi. И ладно бы код был лучше...
2. Нормальной обработки исключений. То что сейчас есть - это тоска...
Аватара пользователя
bw
постоялец
Сообщения: 359
Зарегистрирован: 01.12.2005 10:36:23
Откуда: Усть-Илимск
Контактная информация:

Сообщение bw »

Может стоит вынести рассуждения о хешах в отдельную ветку?

..bw
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

В 32 битной версии компилятора до сих пор в цикле FOR нельзя использовать переменную INT64. Зравствуй goto и while, причём while велосипед :mrgreen:
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Сквозняк писал(а):Зравствуй goto и while, причём while велосипед :mrgreen:

Ну goto даже мэтры просят не использовать (Страуструп, Вирт, Кнут), хотя есть и оговорки, мол с Гото в ОЧЕНЬ редких случаях будет красивши и меньше.
Лично я всегда обхожусь одним while (без ГОТО), если это не так это ОДНОЗНАЧНО ошибка в подходе решения задачи. ИМХО.

«причём while велосипед» Почему это? Вот к сожалению не помню в какой книге, я встречал что то в этом роде: «Цикл for в таких языках, которые используют проверку переменной цикла на равенство (=), при незначительных сбоях могут перешагнуть и начать считать не правильно. По этому желательно использовать сравнения типа: <, >, >=, <=, <>, которые защитят вас от подобных недоразумений». Да я понимаю, что в современном мире такое поведение процессора почти не возможно, но истина в этом есть…
Я выше вроде отписывал, что в языках Си и С++ мне нравится именно цикл for, с возможностью задания шага приращения. Такое в языках Паскаль, можно сделать лишь при добавлении в цикл еще одной проверки If (вот это чистой воды Велосипед). Но зато эта задача решается легко в цикле while.

ИМХО:
1. Гото нужно потихоньку забывать, (если программируете на ассемблере это чистой воды jmp, но там и идеология другая, там без этого никуда). Если же перед гото стоит IF это условные переходы на асме (JB, JBE). Но там это норма, в высоких языках - ЗЛО.
2. Можно вообще программировать без цикла For, использовать только while, по этому почему: «while велосипед» я не понял. :(
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

C-шный for имеет еще одно преимущество, в том, что верхняя граница в нем, обычно, задается как: i < count, а в Pascal приходится писать: to Count - 1. Вроде мелочь, но как следствие переменные цикла должны быть знаковыми, а если Count беззнаковый, то можно нарваться на проблемы... Вообщем куча геморроя на пустом месте...
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Ну goto даже мэтры просят не использовать (Страуструп, Вирт, Кнут)
Кнут очень спорный авторитет. Вирта больше интересовал учебный аспект паскаля, ему несложно было для отказа от гото несколько новых языков придумать. Теперь приходится придумывать, чем же они "лучше" "древнего" паскаля.

Лично я всегда обхожусь одним while (без ГОТО), если это не так это ОДНОЗНАЧНО ошибка в подходе решения задачи.
Случайно не Вольво натолкнул на такую мысль?
А куча указателей, define, деления, вещественные числа и высшая математика (дублирующая формулы компилятора) там где они не нужны это хорошо и логично.

«причём while велосипед» Почему это?
При программировании на низком уровне, есть множество задач в которых известно начало и конец диапазона вычисления - то чем занимается for. Также, важно знать текущую позицию вычисления и может понадобиться выйти раньше чем диапазон закончится. Если всё это делать внутри while, то это будет эмуляция for, а для goto это естественно, поэтому оно не велосипед.

«Цикл for в таких языках, которые используют проверку переменной цикла на равенство (=), при незначительных сбоях могут перешагнуть и начать считать не правильно. По этому желательно использовать сравнения типа: <, >, >=, <=, <>, которые защитят вас от подобных недоразумений».
Ну да, с вещественными числами сплошная лажа, последний знак после запятой может округлиться или неточно сосчитаться - целочисленные числа наше всё. Знаки < и > лучше ещё и тем, что использовать их намного спокойнее, они подстрахуют при ошибках вычисления. Пусть фаны математики переживают за дроби, им без них сложно думать.

Я выше вроде отписывал, что в языках Си и С++ мне нравится именно цикл for, с возможностью задания шага приращения.
В спектрумбейсике такое было и в борландпаскале.

Такое в языках Паскаль, можно сделать лишь при добавлении в цикл еще одной проверки If (вот это чистой воды Велосипед). Но зато эта задача решается легко в цикле while.
Это легко решается при использовании goto и при этом не надо значительно переписывать цикл рискуя налепить ошибок, которые потом придётся долго отлавливать.

1. Гото нужно потихоньку забывать, (если программируете на ассемблере это чистой воды jmp, но там и идеология другая, там без этого никуда). Если же перед гото стоит IF это условные переходы на асме (JB, JBE). Но там это норма, в высоких языках - ЗЛО.
Как удобно в тестовой программе отрубить большой кусок кода при помощи goto, это что-то :D Никакого траха с тоннами // и { }. Используя goto можно писать программы методом раскрутки прототипа без постоянных переписываний, да даже в исхолдниках fpc оно есть. А как сделать переход из цикла в нужное место да так чтобы было хорошо видно куда производится переход?

2. Можно вообще программировать без цикла For, использовать только while, по этому почему: «while велосипед» я не понял.
Можно, но неудобно и постоянно придётся ломать подвал чтобы прилепить балкон. Это задача для программ кодогенераторов. Ты просто не пользовался этим оператором, взял готовое чужое мнение и не проверил, только ли правду ли пишут в книжках.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Сквозняк писал(а):Ты просто не пользовался этим оператором, взял готовое чужое мнение и не проверил, только ли правду ли пишут в книжках.

Сквозняк - Спасибо, Вы мне открыли глаза.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Как удобно в тестовой программе отрубить большой кусок кода при помощи goto, это что-то Никакого траха с тоннами // и { }. Используя goto можно писать программы методом раскрутки прототипа без постоянных переписываний, да даже в исхолдниках fpc оно есть. А как сделать переход из цикла в нужное место да так чтобы было хорошо видно куда производится переход?


Любителям GOTO курить FORTRAN IV. Вот там стастье то!!!!! Чего только стоят вычисляемые GOTO. Типа GOTO (A+B*C)*D/16.
Уважаемый, Сквозняк, текст программы пишут для человеков а не для компьютеров. Если человек читающий ваш код не понимает что вы там наворотили, грош цена вашему коду. Место его на помойке, даже если он выполняется быстрее скорости света.

ЗЫ. Помница, где-то читал, программистам дали задание реализовать такой алгоритм - если на вход блока подается 1, то выходить должно 2, и на оборот - если прихродит 2 выходить должно 1. Просто? Однако вариантов реализации десятки. Самый чумовой A := 3 - A; А чего! Задание выполнено. Только вот понять никто не может что тут имелось в виду.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

текст программы пишут для человеков а не для компьютеров.

И пофиг на синтаксис, главное, чтобы красиво было!

Правильнее сказать так: текст программы пишут не только для компьютеров, но и для людей.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

И пофиг на синтаксис, главное, чтобы красиво было!

Ага :) Смотрел С++ код Blender-а - сказка !
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

debi12345 писал(а):Ага :) Смотрел С++ код Blender-а - сказка !

Страшная... :D
Ответить