Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Или, если бы не Гугл, его бы никто не стал использовать.
Основным критерием выбора сложного инструмента остается производитель и поставщик, а не функциональность.Это где так? Кроме госзаказа или больших корп. закупок с таким не сталкивался.
В стандартной библиотеке языка Си, насколько я помню, до сих пор не оптимизировали сортировку.
/* Order size using quicksort. This implementation incorporates
four optimizations discussed in Sedgewick:
1. Non-recursive, using an explicit stack of pointer that store the
next array partition to sort. To save time, this maximum amount
of space required to store an array of SIZE_MAX is allocated on the
stack. Assuming a 32-bit (64 bit) integer for size_t, this needs
only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
Pretty cheap, actually.
2. Chose the pivot element using a median-of-three decision tree.
This reduces the probability of selecting a bad pivot value and
eliminates certain extraneous comparisons.
3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
insertion sort to order the MAX_THRESH items within each partition.
This is a big win, since insertion sort is faster for small, mostly
sorted array segments.
4. The larger of the two sub-partitions is always pushed onto the
stack first, with the algorithm then concentrating on the
smaller partition. This *guarantees* no more than log (total_elems)
stack size is needed (actually O(1) in this case)! */
все имеет сакральный предопределенный смысл, который, если вам не понятен — значит, не вашего ума дело
Как раз ошибка относится к коду так же, как математическим доказательствам
Если написано как-то, это еще не значит, что так и надо.
Какое вам дело до многих?
Ответ: развенчать то, что «немногие» — это закрытая каста, куда с меньше чем IQ 200 не берут, или по блату/везению, или вовсе мифическая группа людей.
Тысячи людей заглядывают в код glibc.
Почему никто не пишет в рассылку «ребят, а почему в вас так неправильно хеш-таблица реализована? Сортировка?»
Почему никто не пишет в рассылку «ребят, а почему в вас так неправильно хеш-таблица реализована? Сортировка?»
vector<bool>. Вот такие дела.Пишут, постоянно пишут люди: вот я прочитал/придумал новый супер алгоритм, давайте его вставим. С такими библиотеками проблема в том, что они должны одинаково хорошо работать для всех миллионов пользователей, для тысяч типов задач. И значит надо доказать, что новый алгоритм никогда или почти никогда будет не хуже чем старый. Вот тут и начинаются проблемы. Потому что обычно эти алгоритмы показывают сильное улучшение в каком-то классе задач, важном для автора, ценой ухудшения на других классах.
И вы упомянули хороший пример с хэш-таблицами. Да, во многих классах задач реализация хэш-таблиц из стандартной библиотеки не самая лучшая. Но она универсальна. А другие — нет.Эти фразы значат то же самое, что «хеш-таблица в стандартной библиотеке, такая, какая она есть, потому что так надо». Яркий пример искажения, которое повлияло и на вас. Чем конкретно она универсальнее других хеш-таблиц?
У меня была одна программка, производительность которой ограничивалась производительностью хэш-таблицы. Так вот я попробовал несколько «супербыстрых» реализаций, и ни один из них не дал ускорения в моей задаче. А знаете какая структура данных оказалась самой быстрой в итоге? Так ругаемый и считающийся сверхмедленным vector bool. Вот такие дела.Ну если вам нужна была прямая адресация, действительно, зачем брать хеш-таблицы.
Про вектор:Опять вы меня незаметными движениями пытаетесь подвести к мысли, что лучше бы я не лез в стандартную библиотеку со своими рацпредложениями.
Извините, но почему вы считаете, что неэффективно? Есть и другие мнения на этот счет. Разница, если и есть, очень мала.
А многие аллокаторы лучше работают на размерах блоков, равных степени двойкиАллокатор стандартной библиотеки glibc (ptmalloc) к ним не отностится.
И переиспользование памяти на самом деле довольно маловероятно, потому что для него нужно, чтобы во время роста вектора в этом куске памяти не произошло никакое другое выделение.Пушим элементы в вектор в цикле. Очень частый случай.
И FBVector полагается на особенности их аллокатора.В чем полагается?
Я не нашёл в сети независимых тестов подтверждающих сильное превосходство.Вероятно, потому что их просто нет. Некому померять банально. У всех и без этого дел невпроворот. Я же говорю, непочатый край работы. Любой может пойти, сравнить и стать молодцом.
То что я видел — прирост производительности на ~5 процентов.По вашему, это слишком мало? Если нет побочных эффектов (а я их не вижу), даже 0,001% прироста — достаточно.
Эти фразы значат то же самое, что «хеш-таблица в стандартной библиотеке, такая, какая она есть, потому что так надо». Яркий пример искажения, которое повлияло и на вас. Чем конкретно она универсальнее других хеш-таблиц?
Пушим элементы в вектор в цикле. Очень частый случай.
В чем полагается?
Некому померять банально.
Не уверен. По моему опыту, если мы просто пушим в цикле элементы, то можно с некоторой точностью предсказать их количество и вызвать reserve.Есть такое. Но тогда и текущий std::vector работает точно так же хорошо. Идея, по-видимому, того же FBVector, в том, чтобы подменить реализацию и ускорить большие объемы какого-то стороннего кода, где не так задумывались о производительности.
В справке же написано, ну и в самом коде можете посмотреть. Используются оптимальные для jemalloc размеры блоков, а также используется расширенный интерфейс xallocx, решающий проблему realloc.А, ну да, я читал про это, но запамятовал. Тут просто дело в том, что у jemalloc большая internal fragmentation, и их вектор это учитывает, чтобы не тратить память зря. У стандартного аллокатора с этим сильно лучше, поэтому эту оптимизацию fbvector можно просто исключить под ptmalloc, что не умалит других преимуществ fbvector.
Ну вот я тогда померял на своих задачах (правда, с glibc аллокатором). Никакого прироста не получил, совсем. Разочаровался.Если у вас везде, где надо, есть reserve() — вы и не могли ничего получить. Потому что просто индексацию все-таки невозможно как-то сделать медленнее, чем надо.
Это, кстати, тоже важное (и вредное) искажение: все, что уже закоммичено в основной код, тут же покрывается слоем золота, мол это проверенное временем, гибкое решение… Даже измысливаются сотни клиентов, которые завязались на производительность этого кода в неких специальных случаях, про которые даже никто не знает.
if it turns out that applications (or hardware) that people use
end up breaking noticeably, then *that* is a regression.
And the important part there are those weasel-words: «that people use»
and «noticeably»
N dual merge std::sort inplace dual merge std::sort inplace
53928959 6485 7088 7315 7168 4.682 5.117 5.281 5.175
69807231 8483 9386 9640 9300 4.664 5.16 5.3 5.113
73984767 9069 10012 10234 10123 4.689 5.177 5.292 5.234
81071871 10322 10995 11294 11309 4.846 5.162 5.302 5.309
82337663 10112 11170 11443 11351 4.671 5.159 5.285 5.243
85282815 10491 11622 11820 11592 4.669 5.173 5.261 5.159
86380287 10609 11758 12096 11753 4.658 5.163 5.311 5.161
92177919 11373 12626 12927 12831 4.663 5.177 5.3 5.261
93555143 9555 11478 13087 12834 3.857 4.633 5.283 5.181
98161567 12179 13406 13735 13701 4.673 5.144 5.27 5.257
average 9867 10954 11359 11196 4.607 5.106 5.288 5.209
rel.avg 0.8687 0.9643 1 0.9857 0.8712 0.9656 1 0.985
Method Dual Merge std::sort Inplace
Random 5316 6849 7528 7381
2 values 939 2386 344 2927
8 values 1142 3387 795 3727
64 values 1557 4018 1569 4314
Short Blocks 6246 6915 7409 7403
Long Blocks 3215 2084 3361 5041
N/2 Swaps 5268 5693 7110 6799
N/64 Swaps 1577 2321 1874 3659
Unbalanced 2103 4382 2078 4609
dual merge std::sort inplace
Random 5617 7575 7818 7732
Two_Values 347 2614 378 3117
8_Values 760 3571 820 3999
64_Values 1489 4253 1632 4722
Short_Blocks 5482 7292 7634 7752
Long_Blocks 2332 2353 3498 5374
Half_Swaps 5017 6072 7385 7187
N/64_Swaps 1499 2487 1904 3845
Unbalanced 1796 4564 2159 4899
Len=10 513 1767 835 1263
Len=100 1289 2142 1764 2558
Len=1000 2024 2945 2838 3539
Len=10000 2755 3772 3921 4326
Len=100000 3506 4797 4943 4856
Len=1000000 4248 5843 6035 5926
Len=10000000 5008 6746 7017 7085
Если кто-то читает этот пост сейчас: в течение года я стал одним из основных разработчиков одного очень заметного data processing / data store проекта, без какого-то сверхусилия, просто планомерно работая (пусть мне и платили за эту работу).
«Сперва добейся» не имеет оправдания, никогда.
Но уверяю вас, миллионы людей, читающие хабр, хотят видеть ответы, а не поучаствовать в споре (можете с этим поспорить).Надеюсь, я открыл глаза некоторым из этих миллионов на возможности, о которых они не подозревали, но которые могут из заинтересовать. Те, кто поворотят нос от этой информации, только потому что я недостаточно авторитетен — ну, ССЗБ.
Те, кто поворотят нос от этой информации, только потому что я недостаточно авторитетен — ну, ССЗБ.
Спорьте с тем, что я сказал, а не с моей личностью.
Ненене, Дэвид Блэйн. Вы сделали некоторое предположение, а теперь предлагаете читателям его опровергать. Вместо того, чтобы подкрепить его какими-то примерами, показывающими, что хотя бы иногда оно верно. Читатель вполне праве по умолчанию считать, что предположение ложно.Я привел больше дюжины примеров в посте и комментариях.
Я вот например сомневаюсь в вашем алгоритме, ибо вы предлагаете «решать сложную проблему в популярной софтине из интересующей области» вместо, например, «решать проблему, которая непосредственно мешает и хорошие решения для которой отсутствуют». В моем варианте у решающего более высокая мотивация решение таки найти.Это пункт 3. б
«Сперва добейся» не имеет оправдания, никогда.
Хорошо Декарту, или, тем более, всяким древнегреческим математикам, доказывать простенькие теоремки
объём кода, который необходимо написать для минимально работающего стартапа, сильно превысил физические возможности одного человека; проще говоря, нужно изначально находить сотрудников, т.е. идти не по пути «пилю по ночам в гараже», а открывать контору со всеми вытекающими;
Java (пожалуй, самая популярная платформа, на данный момент)полез сразу в коменты.
Все уже украдено до нас