Форум » Clipper » Влияние вызова дисковых функций на быстродействие TIME() / SECONDS() » Ответить

Влияние вызова дисковых функций на быстродействие TIME() / SECONDS()

p519446: hi all. Clipper 5.2e + Blinker6. Мне давно известен один эффект, но я не понимаю его природы. Кто-нибудь может объяснить, почему этот вот цикл: #DEFINE I_MAX 20000 // двадцать тысяч FOR I=1 TO I_MAX K:=TIME() // или K:=SECONDS() -- всё равно NEXT -- выполняется на машине P-2400/RAM 512 то 15 секунд, то 20, а то и все 50 сек. При этом процессор грузится практически на 0 (ноль) процентов и, чтобы его раскочегарить, надо держать нажатым Shift или Ctrl или Alt. Замена вызова TIME() на SECONDS() не помогает (имхо, в этом ничего неожиданного нет). Но этот же цикл, добавленный внутри всего лишь одной функцией, обращающейся к... ДИСКУ (!!), выполняется практически мгновенно: #DEFINE I_MAX 20000 FOR I=1 TO I_MAX K:=TIME() FILE('C:\1') NEXT Почтеннейшая публика! Объясните, плз, почему это всё так происходит. ЗЫ-1. Забавно, что если вызывать ф-цию FILE() с аргументом = пустой строке или с некорректным именем (типа "C:\><"), то будет опять всё плохо (т.е. она перестаёт волшебным образом помогать). ЗЫ-2. Тесты проверялись на МИНИМАЛЬНО необходимом наборе библиотек. Никаких приблуд типа SIX,DBFAXF, __WAIT_B, DISIDLE etc. Сборка шла только с BLXCLP52 и CLIPPER.LIB

Ответов - 29, стр: 1 2 All

Dima: suv3 Получил , спасибо !!!

ort: suv3 пишет: куда давать-то Да и я не отказываюсь - хочется попробовать! ort sobaka ukrpost net

Dima: ort пишет: Да и я не отказываюсь - хочется попробовать! Если Юра не против я могу сложить прямо сюда в формате MIME , потому как чую что это не последняя просьба


suv3: клади конечно)

Dima: Текст , файл пойдет ниже. Итак, экспериментально установлено, что байты в памяти (область данных биос), хранящие кол-во тиков с полуночи (время) обновляются только в определенные моменты, то есть при обращении к некоторым сервисам дос. К каким - точно не установил. Помню, что при определенных циклах (например, проход по базе) время практически стояло на месте. А при других, вроде бы таких же - шло нормально. Потом вдруг было установлен сервис, при обращении к которому байты обновляются. Забор времени происходит след образом - дергается сервис клавиатуры. а потом считывается счетчик тиков. Этот счетчик тиков уже клипперными средствами (ну так мне тогбы было гибче сделать) делится на коэффициент (я не был уверен в коэффициенте, поэтому я сделал это деление не в ассемблере, а в клиппере) в sound.obj - функция tcounter() в клиппер так #define TimeMultiplier 54.9254834838 func xpSeconds() local i i := TCounter() i := i / 1000 i := i * (TimeMultiplier) ret i Файлик MIME-Version: 1.0 Content-Type: application/octet-stream; name="SOUNDOBJ.ZIP" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="SOUNDOBJ.ZIP" UEsDBBQAAAAIAOGQkzXLurefqgIAAOIDAAAJAAAAU09VTkQuT0JKVZNPaNNQHMd/Sdq03bp0ylQc etMpKJ7EHbwsTV67sizpkrTuDxh7UKTsMlx3ckMYyLYqVJCiQ0Q9edyhSPXgf1DXFQR38OJBmKXg UWUw6uLvvSQDD+/l8/v+vr9vXh/pjW6IWUZOV8/I1uhmlQe4uiTA0OO71X3QxRqOTcbtkGKoRLgX geEYxwtcrBqHsKPKthyi21vaAAiFuUQ1CqKaNo1ctrwaAtHlp27VuZjjZGUzo6cM2EMZRIaKLyka 0SHCUM8EoAWg+qBa/hjrWLaB810+0ICox5gQkLZHakAY4g9rNM0kNjsEffqHQPQOQUELQPXBOwSC hpdAnzR4XNY0Q6GO8ZRJCIO0KSch7qiGZRJZy+i2CQksmJMqFkmDhEKa2MOGZY/iHUMv1rRpExWN GdliDhoZTCT82iIaUfBHQBcKmDhCm3HknB5UPV541jTsPFFYaf1fYjeZoWoaotR5Aa8HwpQ0WK0k ALioreBnYBOzAXC40oOKOJJUjVSqBtCp9GIdG81oWsYiivoSgK9IKEUcm308EYBD3oxXTwIcDwwq 0eSJc3SChTi2bjAPAMxX4iiF6Xv05wCDSyEYesLdedTDcQBbhWOdVqHxEX3li2L929kX++H8l2v9 27/KX7cKT4VSNC60CmvPWsrKu1Zy5UMr+WmdB2rPWmPm4oIIs1K9LWxfEcvr5c+1m80DkxNT48wj ep4it4puWFCWUztF3uPB5VSnKDC+fqok1Dk4zfVxS6ldd25Has+47lxHat93pbbj1nshK7Vvu7v6 buk7y26s/Wldaqz9xs3PRsO026hxzYM/jwSvC3W/LiVq0OwfM5mw+D7UEC8UhyKvpmGgnOMHymEn Ymb3en8fHIWNy/kTGzO45nG9wbWZP7nxI9/X5PJ9D1fw7zz7D1BLAQIUABQAAAAIAOGQkzXLuref qgIAAOIDAAAJAAAAAAAAAAAAIAAAAAAAAABTT1VORC5PQkpQSwUGAAAAAAEAAQA3AAAA0QIAAAAA

ort: Получил, вставил, заработало! Спасибо, Юрий! Спасибо, Паша! Не силен я в этих системных штучках - удивляюсь как можно обмануть или обойти систему!

ort: ort пишет: Спасибо, Юрий! Спасибо, Паша! Извините, должно быть так: Спасибо, Юрий! Спасибо, Дима! Просто, в последнее время все больше с Пашей общался.

Григорьев Владимир: Я проблему понимаю так (это я обнаружил по работе со своим классом SAY). Вы запускаете программу в Windows. Это - многозадачная система. Каждой задаче выделяется квант времени и назначается приоритет. Я так думаю, что дисковые операции - самые приоритетные и запускаются в первую очередь. Это делается в виду того, что 1) дисковые операции самые медленные, и поэтому желательно их пропускать вперед, чтобы совсем не сделать их медленными; 2) запуск дисковой операции освобождает процессор для решения других задач, так как дисковые операции в основном не требуют участия процессора. Итак, когда у вас стоит просто SECONDS(), то Windows выделяет вашей программе кванты времени в соответствии с "живой" очередью. Когда же у вас в цикле стоит обращение к дисковым функциям, то ваша программа получает управление "вне очереди", то есть ее приоритет увеличивается, она чаще получает управление, а значит чаще происходит обновление памяти для счетчика BIOS и обращение к нему.

p519446: Григорьев Владимир пишет: Итак, когда у вас стоит просто SECONDS(), то Windows выделяет вашей программе кванты времени в соответствии с "живой" очередью. Имхо, при наличии вопроса "скока щя время?" windows вообще отрубает задачу от ЦПУ. Потому что если это время НЕ спрашивать, а, скажем, выполнять что-то другое (например, вычислятьв цикле логарифм от квадратного корня счетчика), то задача всё же ПОЛУЧАЕТ кванты ЦПУ. Видимо, SUV прав: запрос времени виндуза воспринимает так: "ах, ты время вопрошаешь ?! получи, но делать тебе, братец, нечего видимо! так что обойдёшься дальше без квантов ЦПУ". Какое-то странное исключение из этого правила будет, если задача развёрнута на весь экран: кванты всё же даются (но не много :)). Или если в св-вах ярлыка .exe-шника задать приоритет при ожидании = 100% (см. мои посты вверху).



полная версия страницы