{"action":"created","issue":{"url":"https://api.github.com/repos/aabc/ipt-ratelimit/issues/9","repository_url":"https://api.github.com/repos/aabc/ipt-ratelimit","labels_url":"https://api.github.com/repos/aabc/ipt-ratelimit/issues/9/labels{/name}","comments_url":"https://api.github.com/repos/aabc/ipt-ratelimit/issues/9/comments","events_url":"https://api.github.com/repos/aabc/ipt-ratelimit/issues/9/events","html_url":"https://github.com/aabc/ipt-ratelimit/pull/9","id":197233311,"number":9,"title":"alexk99 patches","user":{"login":"alexk99","id":16037615,"avatar_url":"https://avatars.githubusercontent.com/u/16037615?v=3","gravatar_id":"","url":"https://api.github.com/users/alexk99","html_url":"https://github.com/alexk99","followers_url":"https://api.github.com/users/alexk99/followers","following_url":"https://api.github.com/users/alexk99/following{/other_user}","gists_url":"https://api.github.com/users/alexk99/gists{/gist_id}","starred_url":"https://api.github.com/users/alexk99/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexk99/subscriptions","organizations_url":"https://api.github.com/users/alexk99/orgs","repos_url":"https://api.github.com/users/alexk99/repos","events_url":"https://api.github.com/users/alexk99/events{/privacy}","received_events_url":"https://api.github.com/users/alexk99/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":27,"created_at":"2016-12-22T18:08:43Z","updated_at":"2016-12-26T10:26:56Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/aabc/ipt-ratelimit/pulls/9","html_url":"https://github.com/aabc/ipt-ratelimit/pull/9","diff_url":"https://github.com/aabc/ipt-ratelimit/pull/9.diff","patch_url":"https://github.com/aabc/ipt-ratelimit/pull/9.patch"},"body":"const u32 tok = delta_ms * (car->cir / (BITS_PER_BYTE * MSEC_PER_SEC));\r\n\r\nРаccчет tok не зависит от переменных, изменяемых внутри критической секции (cs).\r\nОн зависит от delte_ms, которая рассчитывается вне cs и от cir - фактически константа.\r\nЕсли в рассчет tok подставить формул delta_ms, пыполнить сокращения, то останется\r\n(now - car->last) * (car->cir / (HZ * BITS_PER_BYTE))\r\n\r\nМожно выссчитывать вот эту часть заранее, избавившись от лишнего деления (он ведь дорогие,\r\nвроде дороже умножения).\r\n\r\n car->cir_hz = (car->cir / (HZ * BITS_PER_BYTE))\r\n\r\nВ итоге получим\r\n const u32 tok = (now - car->last) * car->cir_hz;\r\n\r\nКонечно, добавится умножение в выводе статистике, она же должна много реже выводиться.\r\n\r\n2)\r\nкритическую секцию можно еще упростить, вынести статистику во вне и переведя ее на atomic операции.\r\nПравда в случае включенного RATE_ESTIMATOR укоратить cs вроде не получается, но вот я бы у себя\r\nего выключил. Это ведь тоже только статистика, правильно?\r\n\r\n3)\r\nпеременная struct ratelimit_stat.first нигде не используется.\r\nпросто удалил."},"comment":{"url":"https://api.github.com/repos/aabc/ipt-ratelimit/issues/comments/269197344","html_url":"https://github.com/aabc/ipt-ratelimit/pull/9#issuecomment-269197344","issue_url":"https://api.github.com/repos/aabc/ipt-ratelimit/issues/9","id":269197344,"user":{"login":"alexk99","id":16037615,"avatar_url":"https://avatars.githubusercontent.com/u/16037615?v=3","gravatar_id":"","url":"https://api.github.com/users/alexk99","html_url":"https://github.com/alexk99","followers_url":"https://api.github.com/users/alexk99/followers","following_url":"https://api.github.com/users/alexk99/following{/other_user}","gists_url":"https://api.github.com/users/alexk99/gists{/gist_id}","starred_url":"https://api.github.com/users/alexk99/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexk99/subscriptions","organizations_url":"https://api.github.com/users/alexk99/orgs","repos_url":"https://api.github.com/users/alexk99/repos","events_url":"https://api.github.com/users/alexk99/events{/privacy}","received_events_url":"https://api.github.com/users/alexk99/received_events","type":"User","site_admin":false},"created_at":"2016-12-26T10:26:56Z","updated_at":"2016-12-26T10:26:56Z","body":"Проще, конечно, на код смотреть. Пускай даже на псевдо код.\r\nЭто размышления о простом tbf без extended cir?\r\n\r\nИдея с CAS обновлением last мне очень нравится, тут никаких неточностей не будет. Каждый поток\r\nрассчитает свою долю пройденного корзиной времени, сумма этих значений должна быть в точности ровна действительно прошедшему времени с начала работы корзины - это будет гарантировать cas, неточности и race будут исключены. Здесь cas как раз отлично вписывается,\r\nпонятно, что делать в его цикле. Понятна гонка, которую он исключает -- это гонка за время, так чтобы не посчитать некоторые его отрезки дважды.\r\n\r\nА вот второй cas зачем? что будет перерассчитываться в его цикле в случае если cas видит конфликт, гонку чего он будет предотвращать?\r\nВ этой точке пройденное время мы уже знаем, оно уже не изменится никогда. Т.е. нам надо просто добавить токены в корзину, значение токенов зависит только от времени, т.е. уже тоже константа,\r\nновый цикл cas должен дать тотже рассчет.  Тут просто нужно атомарное добавление, которое можно объединить с pkt_len. \r\n\r\nВ итоге тут даже неточностей не будет, но и RED не будет. Его просто так не получить за счет ошибок. \r\n\r\nХорошее предложение. Может сюда и extended burst дальше прикрутить получится."}}
{"actor":{"display_login":"alexk99"}}