Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:
Здравствуйте, Ka3a4oK, Вы писали:
KK>Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:
Откровенно говоря списки конкатенировать (в узких местах программы) вообще нельзя. Если появляется такая необходимость, то лучше взять SCG.List[T] и в конце преобразовать результат в список (если надо).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:
Народ, зокомитьте кто-нить. И проверьте есть ли тесты для этой функции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Откровенно говоря списки конкатенировать (в узких местах программы) вообще нельзя. Если появляется такая необходимость, то лучше взять SCG.List[T] и в конце преобразовать результат в список (если надо).
Я на коленке собрал алгоритм, который бы по текстовому файлу строил его словарь -> лексиграфически упорядоченый список токенов.
Мне не нужна была максимальная скорость, иначе бы я использовал С++. Но я хотел добиться приемлемой скорости, ибо каждый раз ждать по несколько минут пока обработается какой-то жалкий десяток мегабайт -- это бездарная трата времени. То что получилось не лезло ни в какие ворота.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Я на коленке собрал алгоритм, который бы по текстовому файлу строил его словарь -> лексиграфически упорядоченый список токенов.
KK>Я сделал так: KK>
KK>Мне не нужна была максимальная скорость, иначе бы я использовал С++.
Плюсы тут ровным счетом ничего не дадут. При правильной реализации все урпется в винт.
Я бы для данной задачи воспользовался бы хэш-таблицей или вообще линковским Distinct-том, а он уже сам бы hesh-Set использовал бы.
KK> Но я хотел добиться приемлемой скорости, ибо каждый раз ждать по несколько минут пока обработается какой-то жалкий десяток мегабайт -- это бездарная трата времени. То что получилось не лезло ни в какие ворота.
Ну, тогда списки тебе попросту не нужны. Или преобразуй к ним уже готовую последовательность.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Ka3a4oK, Вы писали:
KK>>Я на коленке собрал алгоритм, который бы по текстовому файлу строил его словарь -> лексиграфически упорядоченый список токенов.
KK>>Я сделал так: KK>>
KK>>Мне не нужна была максимальная скорость, иначе бы я использовал С++.
VD>Плюсы тут ровным счетом ничего не дадут. При правильной реализации все урпется в винт.
VD>Я бы для данной задачи воспользовался бы хэш-таблицей или вообще линковским Distinct-том, а он уже сам бы hesh-Set использовал бы.
Hash не сортирует. В итоге все это потом опять сливать в последовательность из сортиовать.
KK>> Но я хотел добиться приемлемой скорости, ибо каждый раз ждать по несколько минут пока обработается какой-то жалкий десяток мегабайт -- это бездарная трата времени. То что получилось не лезло ни в какие ворота.
VD>Ну, тогда списки тебе попросту не нужны. Или преобразуй к ним уже готовую последовательность.
Просто мне непонятно, почему Concat тут не к месту — это лишь O(n) операция(как и остальные Map-ы в алгоритме), тогда как сортировка, без которой не обойтись — это O(n*log(n)).
Здравствуйте, Ka3a4oK, Вы писали:
KK>Просто мне непонятно, почему Concat тут не к месту — это лишь O(n) операция(как и остальные Map-ы в алгоритме), тогда как сортировка, без которой не обойтись — это O(n*log(n)).
А зачем здесь она? У тебя какая задача? Получить список уникальных значений и отсортировать его (как я понял). Ну, так и надо ее решать самыми простыми средствами. Все хорошо к месту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Ka3a4oK, Вы писали:
KK>>Пытался понять почему тормозит программа, в итоге нашел проблему в очень неожиданном месте — функция NList.Concat. Она работает ужасающее медленно. Моя реализация, которая работает достаточно быстро приведена ниже:
VD>Народ, зокомитьте кто-нить. И проверьте есть ли тесты для этой функции.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>Стоит ли ConcatRev выносить в публичный доступ ?
VD>Стоит. Там где порядок не важен он позволит ускорить алгоритм. К тому же прецеденты есть (MapRev).
Может в подобныее методы добавить дополнительный параметр со значением по-умолчанию. Что-то типа:
Здравствуйте, Ka3a4oK, Вы писали:
KK>Может в подобныее методы добавить дополнительный параметр со значением по-умолчанию.
Такое изменение стоит проверить профайлером на предмет тормозов. Ведь эти методы часто используются, а опциональные параметры как-никак добавляют еще одну степень свободы при разрешении перегрузок.
Здравствуйте, catbert, Вы писали:
VD>>Стоит. Там где порядок не важен он позволит ускорить алгоритм. К тому же прецеденты есть (MapRev).
C>Ну, в данном случае ConcatRev == Concat |> Rev.
Все с точностью до наоборот. ConcatRev можно реализовать эффективно, а уже Concat реализовать через него и Rev.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.