Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
http://govnokod.ru/23357#comment390273
> Говорят что в ВК в начале была такая херь: "уже зарегистрировано N" и это N увеличивалось джаваскриптом со случайной скоростью вообще без связи с сервером
Если я правильно понял, вконтакт продолжает пиздеть по поводу фактического количества зареганых на нем пользовалелей, но теперь делает это на бэкенде
большинство баз в лоб считают количество строк в таблице по индексу. как ты это не кэшируй, как ты там деревья и хэши не строй - уже на миллион записей в таблице это становится весьма заметным числом.
Думаю там самопальная нереляционная велосипедная БД, написанная олимпиадниками, под руководством Егорова. Он об этом сам пейсал.
В частности http://codeforces.com/blog/entry/53274
Ну вот как мы видим в ВК считают что олимпиадники это круто. Я правда не знаю как они это поддепрживают. Может быть пишут с ноля каждый раз. В любом случае яца у них, вероятно, стальные.
В лоховской MySQL (для примера) запрос count() стоит дёшево только для лоховских таблиц типа MyISAM, потому что там количество строк хранится в заголовке (и именно поэтому в MyISAM при любом изменении данных блокируется вся таблица целиком, ведь каждый раз нужно подправлять заголовок). У таблиц типа InnoDB (поддерживающих транзакции и построчную блокировку) в заголовке нет поля, хранящего количество строк, поэтому такие таблицы при вызове count() перебирают все строки.
Подозреваю, что и в других СУБД поддержка транзакций и построчной блокировки тоже приведёт к «дорогому» count().
Вообще говоря желание знать количество записей в реальном времени выглядит подозрительно.
Если это база живых транзакций (OLTP) то в ней конечно могут быть нужны точные данные в реальном времени, но записей там обычно очень мало.
Если же это база для отчетов/аналитики (OLAP) то там во-первых обычно не нужны данные с точностью до хомячка (хватит и примерно) а если уж нужны то отчет можно построить и за ночь, оффлайново.
А хранить "активных пользователей сайта" в базе и каждый раз их считать это как-то странно.
> Всё равно 99.999% юзеров не догадаются.
1. Всё равно 99.999% юзерам это число в точном виде не нужно.
2. Всё равно через пару минут младшие разряды можно выбрасывать.
Мгновенное количество никому снаружи ВК не нужно, усреднённое за время хорошо аппроксимируется формулой.
> инкрементить кол-во юзеров в JS - это самое оптимальное
И, возможно, даже по точности не/не сильно уступает реальному вычислению этого количества.
Это обоснованная оптимизация, что бы там ни говорили.
Карл Фридрих Гаусс отмечал: «Недостатки математического образования с наибольшей отчётливостью проявляются в чрезмерной точности численных расчётов».
А что если во вкудахте будет настолько много пользователей, что при умножении их количества на 1.1, будет получаться число, которое в int уже обратно не влазит? Население земного шара - 7,442 миллиарда, это 7 422 000 000, а INT_MAX это на большинстве платформ всего-навсего 2 147 483 647. Ну ок, допустим что во вконтакте зарегалось 2 147 483 000 людей
int b = 2147483000;
b *= 1.1;
printf("%d", b);
И вот тут 2147483000 умножается на 1.1 (неявно кастуясь при этом в плавучего питуха) и потом кастуется обратно в int, но это число в int не влазит, мы натыкаемся UB, см. https://stackoverflow.com/a/526283
> To answer your question: The behaviour when you cast out of range floats is undefined or implementation specific.
> Speaking from experience: I've worked on a MIPS64 system that didn't implemented these kind of casts at all. Instead of doing something deterministic the CPU threw a CPU exception. The exception handler that ought to emulate the cast returned without doing anything to the result.
А вообще, типичный олимпиадный код
большинство баз в лоб считают количество строк в таблице по индексу. как ты это не кэшируй, как ты там деревья и хэши не строй - уже на миллион записей в таблице это становится весьма заметным числом.
Ты думаешь там большая-большая таблица users в реляционной бд?
В частности http://codeforces.com/blog/entry/53274
мама дорогая
Можно бесконечно обсирать олимпиадный код, но это бессмысленно.
Подозреваю, что и в других СУБД поддержка транзакций и построчной блокировки тоже приведёт к «дорогому» count().
Вообще говоря желание знать количество записей в реальном времени выглядит подозрительно.
Если это база живых транзакций (OLTP) то в ней конечно могут быть нужны точные данные в реальном времени, но записей там обычно очень мало.
Если же это база для отчетов/аналитики (OLAP) то там во-первых обычно не нужны данные с точностью до хомячка (хватит и примерно) а если уж нужны то отчет можно построить и за ночь, оффлайново.
А хранить "активных пользователей сайта" в базе и каждый раз их считать это как-то странно.
Всё равно 99.999% юзеров не догадаются.
1. Всё равно 99.999% юзерам это число в точном виде не нужно.
2. Всё равно через пару минут младшие разряды можно выбрасывать.
Мгновенное количество никому снаружи ВК не нужно, усреднённое за время хорошо аппроксимируется формулой.
> инкрементить кол-во юзеров в JS - это самое оптимальное
И, возможно, даже по точности не/не сильно уступает реальному вычислению этого количества.
Это обоснованная оптимизация, что бы там ни говорили.
Карл Фридрих Гаусс отмечал: «Недостатки математического образования с наибольшей отчётливостью проявляются в чрезмерной точности численных расчётов».
Пятого-десятого, второго нам сюда
Потому что это плохая примета?
А вообще нормально в няшной юзать int когда есть типы явного размера?
И что такое f ?
Это чемпион Питера по спортивному программированию среди учащихся 11 классов писал?
Умножать int на не целое чисто это какое-то очень сильное колдунство.
Очень важный ассерт.
А что если во вкудахте будет настолько много пользователей, что при умножении их количества на 1.1, будет получаться число, которое в int уже обратно не влазит? Население земного шара - 7,442 миллиарда, это 7 422 000 000, а INT_MAX это на большинстве платформ всего-навсего 2 147 483 647. Ну ок, допустим что во вконтакте зарегалось 2 147 483 000 людей
И вот тут 2147483000 умножается на 1.1 (неявно кастуясь при этом в плавучего питуха) и потом кастуется обратно в int, но это число в int не влазит, мы натыкаемся UB, см. https://stackoverflow.com/a/526283
> To answer your question: The behaviour when you cast out of range floats is undefined or implementation specific.
> Speaking from experience: I've worked on a MIPS64 system that didn't implemented these kind of casts at all. Instead of doing something deterministic the CPU threw a CPU exception. The exception handler that ought to emulate the cast returned without doing anything to the result.
В общем, не туда олимпиадники ассерт втулили
> qfree
Похоже вконтакте написан на Qt.
вконтакте все очень быстрое просто
если сортировка то qsort
если аллокатор то qalloc
сопроцессор фирмы cray
можно срать в два унитаза
в сорок тысяч раз быстрей
Пиздец теперь усложнили свой пиздеж до языка си