|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Alexander Dilevsky 2:5020/400 08 Oct 2001 10:31:21 To : Sergey Kubushin Subject : Re: несусветное поведение clock() -------------------------------------------------------------------------------- "Sergey Kubushin" <ksi@cyberbills.com> wrote in message news:9pr9lb$rav$1@news.gamma.ru... > Vladimir Mosgalin <Vladimir.Mosgalin@p17.f1041.n5030.z2.fidonet.org> wrote: > > Hello Sergey. > > > 07 Окт 01 20:10, Sergey Kubushin wrote to Andrew Rodionoff: > > > >> Greetings, all > > > >> Hарод, я худею. Валял тут как-то простенькую приблуду на питоне и > > >> вдруг обнаружил, что time.clock() возвращает каждый раз одно и то же > > >> значение. Делаю программульку вида: #include <time.h> main() { > > >> clock_t t; > > > >> while (1) { > > >> sleep(1); > > >> t = clock(); > > >> printf("%i\n",t); > > >> } > > >> } > > >> Та же картина. Перепробовал ядра 2.2.5, 2.2.14, 2.2.19, glibc-2.1.1, > > >> 2.1.3-15, 2.1.3-22. Это же ужас. strace показывает, что буфер при > > >> вызове times(...) заполняется какой-то х-ней. У кого-нибудь такое > > >> было? > > > SK> А чему ты, собственно, удивляешься? Компиллятор соптимизировал твою > > SK> программку. Ему-то откуда знать, что clock() каждый раз новое значение > > SK> возвращает? > > > SK> Объяви свою переменную volatile и волосы станут шелковистыми. Именно > > SK> для этого оно и предназначено. > > > Бред какой-то. А почему он clock соптимизировал? А если бы там что-то другое > > было? Тогда как он догадался, что sleep оптимизировать не надо? > > Потому что sleep() не возвращает значения. А соптимизировал он не clock(), а > оператор присваивания, повторяющийся в цикле. Да где ж вы такую траву берете? Компилятор имеет право оптимизировать присваивание (в виде его полного исключения :) _только_ если присвоенное значение больше нигде не используется. А здесь оно, очевидно, используется. Чтобы не быть голословным, привожу кусок cc -O6 -S test1.c от вышеуказанной программы: main: pushl %ebp movl %esp,%ebp .align 4 .L8: call clock pushl %eax pushl $.LC0 call printf addl $8,%esp jmp .L8 clock() честно каждый раз вызывается, и его значение честно печатается. > > Это достаточно частая ошибка (например, при определенной оптимизации не > будет работать цикл, читающий что-то из памяти и проверяющий не изменилось > ли значение). Hо здесь таки да, может быть и то, что просто процессор ничего > не наработал, поэтому clock() действительно возвращает одинаковое значение. Именно. > Хотя это и не освобождает от необходимости использования модификатора > volatile - одна и та же программа может работать по-разному в зависимости от > цифирки после -O, от наличия -g и т.п. Использование volatile позволяет > этого избежать. ??? volatile относится только к переменным, и подразумевает, что значение переменной может быть изменено в любой момент времени извне того кода, который в данный момент компилирует компилятор. Функция же имеет право возвращать каждый раз разное значение. > > --- > Sergey Kubushin Sr. Unix Administrator > Metavante, Inc. Phone: 702-567-8857 > 874 American Pacific Dr, Fax: 702-567-8808 > Henderson, NV 89014 -- Alexander DIlevsky mailto:dil@cea.ru всего лишь Brainbench Master C programmer --- ifmail v.2.15dev5 * Origin: Yandex Technologies Ltd. (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/104678ab5de7d.html, оценка из 5, голосов 10
|