Чего мне не хватает в FreePascal
Модератор: Модераторы
В основном сравниваются только хеш - 32 битное число, как только мы нашли нужное число, мы сравниваем и ключ (строку) для избежания коллизий, если строки не совпали идем дальше сравнивать хеши и все повторяется до того момента, пока мы не найдем нужный ключ.
-
Шурик Сетевой
- новенький
- Сообщения: 11
- Зарегистрирован: 05.03.2009 20:42:42
devels писал(а):Операционка Win XP 32.
Хеш функция у меня самая простая и максимально быстрая, быстрее сделать нереально:
По-моему в FPC тоже простая функция.
У вас используется умножение в цикле, это дорого. Функция FPHash из Contnrs, скорее всего, окажется существенно быстрее - у них там только сдвиги и вычитания.
Куда рыть в смысле оптимизации хеш-функций, я точно не скажу, не помню, где видел сравнение быстродействия и коллизионной устойчивости, но вроде бы сойдет PJW-32 (есть в Википедии), там всего одно деление (в конце вычисления), а в цикле только сдвиги и сложение. Насколько я помню, ее коллизионная стойкость примерно 1 коллизия на 30000 ключей
Шурик Сетевой писал(а):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
http://www.strchr.com/hash_functions
Чего не хватает мне:
1. Скорости компиляции. В 10 раз медленнее Delphi. И ладно бы код был лучше...
2. Нормальной обработки исключений. То что сейчас есть - это тоска...
1. Скорости компиляции. В 10 раз медленнее Delphi. И ладно бы код был лучше...
2. Нормальной обработки исключений. То что сейчас есть - это тоска...
В 32 битной версии компилятора до сих пор в цикле FOR нельзя использовать переменную INT64. Зравствуй goto и while, причём while велосипед 
Сквозняк писал(а):Зравствуй goto и while, причём while велосипед
Ну goto даже мэтры просят не использовать (Страуструп, Вирт, Кнут), хотя есть и оговорки, мол с Гото в ОЧЕНЬ редких случаях будет красивши и меньше.
Лично я всегда обхожусь одним while (без ГОТО), если это не так это ОДНОЗНАЧНО ошибка в подходе решения задачи. ИМХО.
«причём while велосипед» Почему это? Вот к сожалению не помню в какой книге, я встречал что то в этом роде: «Цикл for в таких языках, которые используют проверку переменной цикла на равенство (=), при незначительных сбоях могут перешагнуть и начать считать не правильно. По этому желательно использовать сравнения типа: <, >, >=, <=, <>, которые защитят вас от подобных недоразумений». Да я понимаю, что в современном мире такое поведение процессора почти не возможно, но истина в этом есть…
Я выше вроде отписывал, что в языках Си и С++ мне нравится именно цикл for, с возможностью задания шага приращения. Такое в языках Паскаль, можно сделать лишь при добавлении в цикл еще одной проверки If (вот это чистой воды Велосипед). Но зато эта задача решается легко в цикле while.
ИМХО:
1. Гото нужно потихоньку забывать, (если программируете на ассемблере это чистой воды jmp, но там и идеология другая, там без этого никуда). Если же перед гото стоит IF это условные переходы на асме (JB, JBE). Но там это норма, в высоких языках - ЗЛО.
2. Можно вообще программировать без цикла For, использовать только while, по этому почему: «while велосипед» я не понял.
C-шный for имеет еще одно преимущество, в том, что верхняя граница в нем, обычно, задается как: i < count, а в Pascal приходится писать: to Count - 1. Вроде мелочь, но как следствие переменные цикла должны быть знаковыми, а если Count беззнаковый, то можно нарваться на проблемы... Вообщем куча геморроя на пустом месте...
Кнут очень спорный авторитет. Вирта больше интересовал учебный аспект паскаля, ему несложно было для отказа от гото несколько новых языков придумать. Теперь приходится придумывать, чем же они "лучше" "древнего" паскаля.Ну goto даже мэтры просят не использовать (Страуструп, Вирт, Кнут)
Случайно не Вольво натолкнул на такую мысль?Лично я всегда обхожусь одним while (без ГОТО), если это не так это ОДНОЗНАЧНО ошибка в подходе решения задачи.
А куча указателей, define, деления, вещественные числа и высшая математика (дублирующая формулы компилятора) там где они не нужны это хорошо и логично.
При программировании на низком уровне, есть множество задач в которых известно начало и конец диапазона вычисления - то чем занимается for. Также, важно знать текущую позицию вычисления и может понадобиться выйти раньше чем диапазон закончится. Если всё это делать внутри while, то это будет эмуляция for, а для goto это естественно, поэтому оно не велосипед.«причём while велосипед» Почему это?
Ну да, с вещественными числами сплошная лажа, последний знак после запятой может округлиться или неточно сосчитаться - целочисленные числа наше всё. Знаки < и > лучше ещё и тем, что использовать их намного спокойнее, они подстрахуют при ошибках вычисления. Пусть фаны математики переживают за дроби, им без них сложно думать.«Цикл for в таких языках, которые используют проверку переменной цикла на равенство (=), при незначительных сбоях могут перешагнуть и начать считать не правильно. По этому желательно использовать сравнения типа: <, >, >=, <=, <>, которые защитят вас от подобных недоразумений».
В спектрумбейсике такое было и в борландпаскале.Я выше вроде отписывал, что в языках Си и С++ мне нравится именно цикл for, с возможностью задания шага приращения.
Это легко решается при использовании goto и при этом не надо значительно переписывать цикл рискуя налепить ошибок, которые потом придётся долго отлавливать.Такое в языках Паскаль, можно сделать лишь при добавлении в цикл еще одной проверки If (вот это чистой воды Велосипед). Но зато эта задача решается легко в цикле while.
Как удобно в тестовой программе отрубить большой кусок кода при помощи goto, это что-то1. Гото нужно потихоньку забывать, (если программируете на ассемблере это чистой воды jmp, но там и идеология другая, там без этого никуда). Если же перед гото стоит IF это условные переходы на асме (JB, JBE). Но там это норма, в высоких языках - ЗЛО.
Можно, но неудобно и постоянно придётся ломать подвал чтобы прилепить балкон. Это задача для программ кодогенераторов. Ты просто не пользовался этим оператором, взял готовое чужое мнение и не проверил, только ли правду ли пишут в книжках.2. Можно вообще программировать без цикла For, использовать только while, по этому почему: «while велосипед» я не понял.
Сквозняк писал(а):Ты просто не пользовался этим оператором, взял готовое чужое мнение и не проверил, только ли правду ли пишут в книжках.
Сквозняк - Спасибо, Вы мне открыли глаза.
Как удобно в тестовой программе отрубить большой кусок кода при помощи goto, это что-то Никакого траха с тоннами // и { }. Используя goto можно писать программы методом раскрутки прототипа без постоянных переписываний, да даже в исхолдниках fpc оно есть. А как сделать переход из цикла в нужное место да так чтобы было хорошо видно куда производится переход?
Любителям GOTO курить FORTRAN IV. Вот там стастье то!!!!! Чего только стоят вычисляемые GOTO. Типа GOTO (A+B*C)*D/16.
Уважаемый, Сквозняк, текст программы пишут для человеков а не для компьютеров. Если человек читающий ваш код не понимает что вы там наворотили, грош цена вашему коду. Место его на помойке, даже если он выполняется быстрее скорости света.
ЗЫ. Помница, где-то читал, программистам дали задание реализовать такой алгоритм - если на вход блока подается 1, то выходить должно 2, и на оборот - если прихродит 2 выходить должно 1. Просто? Однако вариантов реализации десятки. Самый чумовой A := 3 - A; А чего! Задание выполнено. Только вот понять никто не может что тут имелось в виду.
debi12345 писал(а):АгаСмотрел С++ код Blender-а - сказка !
Страшная...
