Цитата: GaLL от ноября 27, 2010, 14:38Эта оговорка и показывает бессмысленность сей затеи.
Я сделал специальную оговорку:
Цитата: GaLL от ноября 27, 2010, 14:38Кроме хэширования строк ничего не надо, да?
Мне неоднократно доводилось писать самопальный хэш, и ничего близкого к человекочасам не возникало: уж очень прост алгоритм хэширования строк.
Цитата: GaLL от ноября 27, 2010, 14:38А как сами сочетания в результат выводить?
Не будет выделение память под подстроку. Если хэш самопальный, то и копировать эту подстроку необязательно.
Цитата: GaLL от ноября 27, 2010, 14:38Это время тоже часть решения задачи?
За время, ушедшее на обсуждение этой темы участниками - ещё больше раз.
Цитата: GaLL от ноября 27, 2010, 14:38Ваши соображения по оптимизации были бы интересны для более общей задачи, где размер сочетания переменный. Если Вы с C++ (точнее с микрософтовской реализацией) хорошо знакомы, то, может, подскажете, как выключить синхронизацию в библиотеке. Они однопоточную библиотеку выкинули зачем-то, а судя по показаниям профилёра, как раз на одной из блокировок съедается куча времени.
Я просто высказал соображения по поводу возможной оптимизации, решив (вероятно ошибочно), что это действительно имеет отношение к теме и будет кому-то интересно.
ЦитироватьЯ сделал специальную оговорку:
А если понадобится другой размер сочетаний или даже диапазон длин, передаваемый как параметр? А если уникод? Как выводить результаты?
Цитировать
Если размер алфавита около 100 или меньше
ЦитироватьЕсли же число возможных подстрок слишком велико, конечно, надо хэш.
трёхбуквенных сочетаний
ЦитироватьМне неоднократно доводилось писать самопальный хэш, и ничего близкого к человекочасам не возникало: уж очень прост алгоритм хэширования строк.
Знаем мы эти программистские 5 минут, плавно превращающиеся в человеко-часы.
За эти пять минут самое медленное искаробочное решение отработает 2 раза.
Цитировать
То есть Вы предлагаете вручную выделять массивы символов в куче и копировать в них? И где здесь профит?
ЦитироватьЗа время, ушедшее на обсуждение этой темы участниками - ещё больше раз.
За эти пять минут самое медленное искаробочное решение отработает 2 раза.
Цитата: GaLL от ноября 27, 2010, 13:53А если понадобится другой размер сочетаний или даже диапазон длин, передаваемый как параметр? А если уникод? Как выводить результаты?
Возможно, мне следовало так выразиться: просто в реализации и эффективнее по времени работы.
Цитата: GaLL от ноября 27, 2010, 13:53Из этих 35 секунд половина — чтение данных.
Куда больше пары секунд для таких больших данных.
Цитата: GaLL от ноября 27, 2010, 13:53Знаем мы эти программистские 5 минут, плавно превращающиеся в человеко-часы.
Не понимаю, чего плохого в реализации тех или иных алгоритмов, если это занимает пять минут и если действительно есть смысл оптимизировать.
Цитата: GaLL от ноября 27, 2010, 13:53То есть Вы предлагаете вручную выделять массивы символов в куче и копировать в них? И где здесь профит?
Я об этом:string piece = str.Substring(pos, ngram_size);
Не из какого астрала мы длину строки тут не узнаём, она же равна ngram_size.
ЦитироватьВозможно, мне следовало так выразиться: просто в реализации и эффективнее по времени работы.
Чем проще?
ЦитироватьКуда больше пары секунд для таких больших данных. Не понимаю, чего плохого в реализации тех или иных алгоритмов, если это занимает пять минут и если действительно есть смысл оптимизировать.
Ога, ради экономии пары секунд только самопала и не хватало. И это нечестно по отношению к конкурентам. Там искаробочные решения.
Цитата: myst от ноября 27, 2010, 13:44
Конечно, не даёт. Мы же длину строки узнаём из астрала, а автоматическое управление памятью — это неудобно.
string piece = str.Substring(pos, ngram_size);
Цитата: GaLL от ноября 27, 2010, 11:45Чем проще?
Если размер алфавита около 100 или меньше, то для подсчёта числа различных трёхбуквенных сочетаний проще обойтись прямой индексацией, т. е. массивом вида count[C][C][C], C - размер алфавита.
Цитата: GaLL от ноября 27, 2010, 11:45Ога, ради экономии пары секунд только самопала и не хватало. И это нечестно по отношению к конкурентам. Там искаробочные решения.
Если же нужен хэш, то тогда можно написать несложный самопальный, который будет быстрее hash_map'а.
Цитата: GaLL от ноября 27, 2010, 11:45Конечно, не даёт. Мы же длину строки узнаём из астрала, а автоматическое управление памятью — это неудобно.
Использование std::string'а в данном случае не даёт особых удобств, поэтому можно (для оптимизации по времени) юзать массив символов фиксированной длины.
Цитата: myst от ноября 27, 2010, 09:54Очорт! Я забыл отладочный вывод закомментировать. Без него — 0:35. Наконец-то всё встало на свои места.
С hash_map C++ — 1:10. Максимальное потребление памяти ок. 9 мегабайт.
Цитата: Алексей Гринь от ноября 27, 2010, 09:43Дык, не в два: 0:53 vs 1:09
Дотнет медленнее в два раза серверной версии, зато потребляет ресурсов меньше в 14 раз.
Цитата: myst от ноября 27, 2010, 08:51Да там есть конфигурационные файлы какие-то, не разбирался.
.NET'овые программы нельзя никак потюнить, чтобы они, когда надо, память не экономили и выдавали максимальную скорость?
Цитата: myst от ноября 27, 2010, 08:51Ну вот. Дотнет медленнее в два раза серверной версии, зато потребляет ресурсов меньше в 14 раз. Поэтому он выигрывает.
У серверной машины максимум где-то в районе 190 мегов. У клиентской — 35, но она работает полторы минуты.
У дотнетовой программы — 13,5.
В производительность входит количество работы в единицу времени.
Страница создана за 0.085 сек. Запросов: 20.