о сколько нам открытий чудных

две задачи

1. написать функцию, которая всегда выполняется ровно 30 msec (допустимая погрешность 0.1 мсек)
сначала под Windows, потом мультиплатформенную.


for ( ;; )
{
fn_30_msec();
}

2. померять, сколько выполняется функция fn_30_msec(). для тех-же платформ.

  • http://www.leningrad.spb.ru/ shodan

    idle windows box
    min=29627 max=33080 avg=30002 usec
    min=15873 max=31855 avg=31235 usec

    slightly loaded linux box
    min=29587 max=34126 avg=30053 usec
    min=29627 max=33080 avg=30002 usec

  • http://alll.livejournal.com alll

    Обе задачи нерешаемы. Среднепотолочная Windows (и среднепотолочный Linux) никак не является ОС реального времени. Хотя Windows CE, говорят, таки риалтаймовая, для неё может и получится.

  • http://aruslan.livejournal.com/ aruslan

    Боря, а в чём пойнт?
    Или эта функция спать должна ровно 30 мс?

    Обычный Windows бокс:
    Timer frequency is 2813.01MHz
    min=30000.49129 us, max=30001.21329 us, median=30000.63597 us, mean=30000.65236 us, stddev=0.12814
    min=30000.52471 us, max=30000.83789 us, median=30000.66939 us, mean=30000.66788 us, stddev=0.05757
    min=30000.53679 us, max=30007.43190 us, median=30000.63526 us, mean=30000.85701 us, stddev=1.20260
    min=30000.52293 us, max=30000.84465 us, median=30000.67366 us, mean=30000.66210 us, stddev=0.07785

    Похожий на Windows но на другом процессоре:
    Timer frequency is 50.00MHz
    min=30000.24001 us, max=30000.98001 us, median=30000.29999 us, mean=30000.33419 us, stddev=0.13337
    min=30000.25998 us, max=30000.40001 us, median=30000.30002 us, mean=30000.31742 us, stddev=0.04181
    min=30000.23999 us, max=30004.00002 us, median=30000.34000 us, mean=30000.44903 us, stddev=0.64970
    min=30000.24001 us, max=30000.53999 us, median=30000.31999 us, mean=30000.32645 us, stddev=0.06513

    Непохожий на Windows на другом процессоре:
    Timer frequency is 79.80MHz
    min=30000.30075 us, max=30000.60150 us, median=30000.45113 us, mean=30000.44426 us, stddev=0.08456
    min=30000.31328 us, max=30000.60150 us, median=30000.43860 us, mean=30000.44547 us, stddev=0.08039
    min=30000.30075 us, max=30012.33083 us, median=30000.42607 us, mean=30001.13995 us, stddev=2.40665
    min=30000.30075 us, max=30000.57644 us, median=30000.43860 us, mean=30000.43375 us, stddev=0.07367

  • http://aruslan.livejournal.com/ aruslan

    На случай если хотелось не >=30 а как можно ближе к 30:

    Timer frequency is 2813.01MHz
    min=30000.12620 us, max=30000.48951 us, median=30000.25027 us, mean=30000.26051 us, stddev=0.09574

    Timer frequency is 50.00MHz
    min=29999.86000 us, max=30000.02002 us, median=29999.94002 us, mean=29999.93742 us, stddev=0.04242

    Timer frequency is 79.80MHz
    min=29999.91228 us, max=30000.20050 us, median=30000.03759 us, mean=30000.04042 us, stddev=0.09018

  • http://aruslan.livejournal.com/ aruslan

    То есть я понимаю что в век FCC и плавающих частот понятие “30 мсек” расплывчато само по себе.
    Но пойнт тем не менее не ясен.

  • look4awhile

    2 aruslan: задача, очевидно, одна и таже. опять-же теоретически не решаема
    а практически “я подойду достаточно близко”, кроме тех случаев когда нет
    пойнт, собственно, в том – что меряем мы попугаев
    особенно там, где пишем средства измерения
    и, наконец, никакой стабильной производительности на реальной задаче мы показывать вообще не можем
    потому как даже если специально стараемся, убиваемся, и близко ни к чему не можем подойти

  • http://aruslan.livejournal.com/ aruslan

    2 look4awhile:

    Ну я бы сказал что просто не нужно время измерять совсем.
    Нужно чтобы синхронное плавание было – параллельное и гармоничное.
    Время здесь за тебя посчитают – на телевизоре, в аудиообработке или там на блюрее.

    Но если уж прижимает посчитать – то по мне так 30 000 us – вполне себе точность.
    Точнее уж всяко не будет – ибо всё плавает кругом.

  • look4awhile

    последний раз когда я мерял, на известной тебе чёрной коробке тактовая частота плавала в пределах 3%. т.е в нашем случае 1мсек разницы.

  • http://aruslan.livejournal.com/ aruslan

    Похоже на FCC. Он меня очень удивил на коробоксе, я тогда еще не курсе был, что частоты плавают.
    Т.е. я так понимаю ты в цифры типа 30000 не веришь? ;)

  • http://aruslan.livejournal.com/ aruslan

    Я к тому что 30 мс по QPC vs 30 мс по атомным часам – существенно разные вещи.
    Но если мерять всё в одних и тех же локальных попугаях – то получается синхронное плавание.

    Хуже, когда попугая использовать уже нельзя.

  • look4awhile

    локальные попугаи заканчиваются там, где начинается vblank

  • IronPeter

    Помню свое удивление, когда увидел два Wintel PC ( с одной и той XP ), стоящие рядом. На каждом – открытые системные часики. За время порядка минуты стрелочка одних часиков убегала на пару-тройку секунд. А потом возвращалась назад, как на резиночке.

    Т.е. это не пространственно-временная аномалия, это обычное поведение. И с этим надо жить. Даже не в контексте vblank, а контексте мультиплеера.

    Если надо ждать vblank – наверное надо повесить свое прерывание и ждать.

  • http://aklk.com.ua klk

    Я когда попробвал ограничивать FPS, по 2 причинам — чтобы не грузить GPU сверх меры и чтобы dt был фиксированным, я сделал цикл ожидания на Sleep или на Waitable Timer — чтобы не по возможности грузить CPU, пока до целевого dt оставалось достаточно времени, а потом цикл с QPC. Когда целевой FPS был 60, точность dt была порядка 1/1000000 секунды, опять же, если верить QPF/QPC. Визуально я это смог проконтролировать по развёртке — сделал очистку экрана чёрным/белым по чётным/нечётным кадрам.