1. PHP / Говнокод #16282

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    function wait($time)
    {
        $tmp_time = time();
        $i = $tmp_time;
        $time = $tmp_time + $time;
        while ($i < $time)
        {
            If (time() != $i) { $i++; }
        }
    }

    Автор сего творения явно не подозревал о существовании функции sleep

    Запостил: phpcoder, 07 Июля 2014

    Комментарии (91) RSS

    • Одна итерация цикла = 1 секунда?
      Ответить
    • function wait($time) {
          $time += time();
          while (time() < $time);
      }
      Ответить
      • Результат противоположен функции sleep - sleep освобождает проц на заданное время, а тут проц будет забит
        Ответить
        • cleaned
          Ответить
          • И что же он не так сказал?
            PS> ИзУ борманда вышло отличное гавно!
            Ответить
            • cleaned
              Ответить
              • Упрлс? Sleep с любым параметром приостанавливает поток, отдавая управление оси, и просит возобновить его примерно через N миллисекунд.
                Ответить
                • cleaned
                  Ответить
                  • >давайте не будим
                    Правильно. Давайте раз-будим доктора Стретора!То он чёто тупит со своим sleep.
                    Ответить
                  • > Го на МСДН.
                    Го, я создал.

                    http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx

                    This function causes a thread to relinquish the remainder of its time slice and become unrunnable for an interval based on the value of dwMilliseconds.

                    > Sleep с ненулевым параметром блокирует поток намертво, он уже не может сообщить системе, что простаивает и идет кража процессорного времени.
                    Ищи пруф, ищи...
                    Ответить
                    • cleaned
                      Ответить
                      • A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run. If there are no other threads ready to run, the function returns immediately, and the thread continues execution.

                        Значение 0 вынуждает тред отказаться от оставшегося куска времени в пользу какого-то другого треда, который готов к работе. Если таких тредов нет, sleep возвращается немедленно, и тред продолжает исполняться.

                        Как эта строчка описывает поведение при ненулевом интервале? Никак. Пруф не зачтен.

                        > Нахуй тогда еще передавать ноль?
                        На случай, если ты просто хочешь скинуть управление, а интервал, через который оно к тебе вернется тебе совершенно не важен. Т.е. Sleep(0) почти никогда не имеет смысла (ось и так периодически будет прерывать тред, чтобы дать поработать другим), в отличие от Sleep(N), где N > 0.
                        Ответить
                        • >Т.е. Sleep(0) почти никогда не имеет смысла (ось и так периодически будет прерывать тред, чтобы дать поработать другим)
                          Имеет смысл. Редко, но имеет для смазки и тестирования всяких многопоточных алгоритмов (например неудавшийся захват самописного спинлока в CAS-алгоритмах)
                          Проблема в том что на разных платформах оно по-разному.
                          В том же шарпе, плюсах, жавах сделан метод yield(), который гарантированно делает сиё.
                          Ответить
                        • cleaned
                          Ответить
                          • Входит. Но если твоему потоку надо поспать хотя бы 10-20мс - на время переключения уже насрать, оно там совсем копеечное.
                            Ответить
                          • >А как же переключение контекста?
                            rep nop
                            Ответить
                            • cleaned
                              Ответить
                            • ЕМНИП, к nop сколько префиксы не приписывай, ничего не изменится. Разве что размером, что бывает иногда полезно для паддинга.
                              Ответить
                              • Это эквивалентно инструкции pause на intel-машинах.
                                Ответить
                      • http://risovach.ru/upload/2014/07/mem/no-ya-zhe_55162200_orig_.jpeg
                        Ответить
                • >Упрлс?
                  Интересно, он сам свой бред плюсует?
                  Ответить
                  • Попытка демократичного доказательства своей правоты - большинством голосов)
                    Ответить
              • using System;
                using System.Threading;
                
                
                namespace ConsoleApplication12
                {
                    internal class Program
                    {
                        private static void Main()
                        {
                            while (true)
                            {
                                Console.WriteLine("Sleep");
                                Thread.Sleep(10000);
                                Console.WriteLine("Wait");
                               Wait(new TimeSpan(0,0,0,10));
                            }
                        }
                
                       
                        static void Wait(TimeSpan time)
                        {
                            var endTime = DateTime.Now + time;
                            while (DateTime.Now < endTime) ;
                        }
                      
                    }
                }



                Скомпиль да помониторь ресы
                Ответить
                • cleaned
                  Ответить
                  • Да давно бы взял да попробовал... Запусти бесконечный цикл со Sleep(100) внутри, да посмотри в диспетчере задач, сколько он ест.
                    Ответить
                    • cleaned
                      Ответить
                      • > Нисколько не ест.
                        Вот именно, т.е. он отдал время планировщику ядра, а тот отдал его кому-то еще.

                        > Но не сообщает системе о том, что простаивает.
                        Почему? Есть какие-то доказательства?

                        > Процессор бы это время потратил на что-то другое.
                        Он и тратит, исполняя другие задачи (а скорее всего "бездействие системы", то бишь энергосберегающий hlt до ближайшего прерывания).
                        Ответить
                  • >>Но если мой "процессор" повиснет

                    Уйдет на второй слой зависаний - fixed
                    Ответить
              • >и идет кража процессорного времени
                Может грабёж? Ибо кража - тайное деяние, в отличии хищения, совершённого открыто.

                >Так можно делать только в вирусах на VBS или в несерьезных прогах на бейсике.
                >Го на мсдн.
                Microsoft начала выпускать PHP?
                Ответить
              • Sleep с ненулевым параметром блокирует поток намертво, он уже не может сообщить системе, что простаивает и идет кража процессорного времени. Если же сделать так
                while true do
                sleep(10);
                 то создастся видимость разгрузки проца, но на деле это лажа. Нет никакой разгрузки, тупо идет расход времени.

                Эх, жалко что это сообщение и так на гк. А то можно было бы как отдельный говнокод выложить.
                Ответить
                • Никогда не поздно. Только если выложишь - он же его засрет...
                  Ответить
                • cleaned
                  Ответить
                  • > но спутал с процессорным временем.
                    Ты просто долбоёб. И тот кто плюсанул твою чушь - тоже долбоёб.
                    Подозреваю что ты долбоёб во второй степени.

                    >Но хоть посмеялись - польза есть.
                    Сам обосрался, сам посмеялся.
                    Ответить
                    • cleaned
                      Ответить
                      • >>Табель о рангах

                        Это список самих рангов, а не назначений. Или 3.14159265, Kegdan и Bormand - теперь ранги?

                        Ты опять обосрался(
                        Ответить
                  • >>Я имел в виду перекл. контекста, но спутал с процессорным временем. . Так жаль. Но хоть посмеялись - польза есть.

                    Я имел в виду "рыбку сьесть", но спутал с "на хуй сесть". Так жаль. Но хоть потрахались - польза есть.
                    Ответить
    • Ну а что, а то отдашь процессорное время кому-то другому, а он возьмет и в критическую секцию в ядре войдет.
      Ответить
      • Тогда еще прерывания запретить надо. А то таймер тикнет, и проц уйдет обслуживать другой поток.
        Ответить
        • Прерывания в user space может отключить и не выйдет, но уж хотя бы sched_setscheduler(0, SCHED_RR, &param) вызвать можно.
          Ответить
      • ...Ты отдаешь мне процессорное время, и я плавно вхожу в твою критическую секцию...
        Ответить
        • И начинаю заниматься ДЛИННОЙ арифметикой
          Ответить
        • Так критическая секция же чужая (ядра). Прям какое-то netorare получается.
          Ответить
          • > netorare
            Неточто?
            Ответить
            • Немного копипасты с TV tropes:
              Netorare (寝取られ, lit. "cuckold", also commonly abbreviated as NTR) is a notoriously controversial genre of Hentai (or, in rarer cases, Ecchi), with a degree of infamy perhaps rivaled only by full-blown Guro.

              Typically, a heroine will be introduced as having a significant other, which may be a husband, a boyfriend, or even a partner in a BST affair. The story will then show the aforementioned heroine being intimate with another man, thus provoking jealousy in the audience by proxy.

              http://tvtropes.org/pmwiki/pmwiki.php/Main/Netorare
              Ответить
    • зачем в php-говносайте может понадобиться sleep?
      Ответить
      • cleaned
        Ответить
      • Задел на будущее же.

        Когда лень мутить что-то новое, можно уменьшить задержку в sleep'е, и написать в чейнжлоге "улучшена производительность".

        P.S. Где-то попадалась статейка о случае из жизни, когда програмер втыкал циклы до миллиона, чтобы потом их оптимизировать...
        Ответить
        • >>Когда лень мутить что-то новое, можно уменьшить задержку в sleep'е, и написать в чейнжлоге "улучшена производительность".

          Из оперы - если все работает - админ непричем - нет премии - поэтому надо идти на маленькие хитрости
          Ответить
      • Например, автор пишет сервис для прокачки рейтинга на других сайтах. Если плюсовать слишком часто, могут забанить.
        Ответить
      • я вообще не понимаю как язык с названием personal home page стал лидером рынка
        Ответить

    Добавить комментарий