digitalmars.D.learn - Real Time-ing
- Taylor Hillegeist (13/13) Dec 08 2015 So, I mostly do programming that is of run to completion verity.
- Kagamin (4/4) Dec 08 2015 prev=now;
- Kagamin (4/4) Dec 08 2015 Oops, no.
- Taylor Hillegeist (3/7) Dec 08 2015 what calls does this use from the std library? to get the current
- Taylor Hillegeist (26/27) Dec 08 2015 I took a stab at the problem:
- BBaz (21/48) Dec 08 2015 1) a computer is not real-time, for example audio is always
- Kagamin (4/6) Dec 09 2015 Do you want to get precision better than period of thread
- Chris Wright (5/10) Dec 08 2015 Busy-wait and access the CPU's high precision clock.
- Andrea Fontana (26/39) Dec 09 2015 import core.thread;
- Andrea Fontana (16/61) Dec 09 2015 Anyway in order to avoid error accumulation it's probably a good
So, I mostly do programming that is of run to completion verity. But I have a dream of calling functions periodically. So my question is: What is the best (most time accurate) way to call a function every n time units? What is the best way to measure the jitter of these calls? I'm also interested in waiting vs calling periodically eg. call wait(1 ms) call is not the same as 1 ms from call to call, due to the time duration of the function call. Thanks!
Dec 08 2015
On Tuesday, 8 December 2015 at 15:50:35 UTC, Kagamin wrote:Oops, no. next+=dur; wait(next-now); call();what calls does this use from the std library? to get the current time? Wait a amount of time?
Dec 08 2015
On Tuesday, 8 December 2015 at 15:35:18 UTC, Taylor Hillegeist wrote:So, I mostly do programming that is of run to completionI took a stab at the problem: http://dpaste.dzfl.pl/2eef530d00fc 0 nsecs with jitter of :500000000 nsecs 498937256 nsecs with jitter of :1062744 nsecs 499036173 nsecs with jitter of :963827 nsecs 500025650 nsecs with jitter of :25650 nsecs 500020735 nsecs with jitter of :20735 nsecs 499057062 nsecs with jitter of :942938 nsecs 498932033 nsecs with jitter of :1067967 nsecs 591037317 nsecs with jitter of :91037317 nsecs 499032794 nsecs with jitter of :967206 nsecs 499034637 nsecs with jitter of :965363 nsecs 499022963 nsecs with jitter of :977037 nsecs 498976577 nsecs with jitter of :1023423 nsecs 499076723 nsecs with jitter of :923277 nsecs 499023885 nsecs with jitter of :976115 nsecs 499018048 nsecs with jitter of :981952 nsecs 499004224 nsecs with jitter of :995776 nsecs 499048461 nsecs with jitter of :951539 nsecs 499013747 nsecs with jitter of :986253 nsecs 499018048 nsecs with jitter of :981952 nsecs 499007604 nsecs with jitter of :992396 nsecs However i seem to get jitter of around 1 ms. Is there anything else i can do to improve?
Dec 08 2015
On Tuesday, 8 December 2015 at 16:40:04 UTC, Taylor Hillegeist wrote:On Tuesday, 8 December 2015 at 15:35:18 UTC, Taylor Hillegeist wrote:1) a computer is not real-time, for example audio is always buffered (e.g 512 samples) 2) thread are not good for timing. In a simple test you could get satisfying results while in a stressed IRL environment it won't work as well. so you should rather use the OS API to make a timer (or the one proposed by a framework if it applies, for example gui app with SDL: SDL timer). However if you want to have better times you can use core.time in a thread callback: ~~~~~~~~~~~~~~~~~ // to, t1 and interval are uint; if (!t0) t0 = TickDuration.currSystemTick.msecs; t1 = TickDuration.currSystemTick.msecs; if ((t1 - t0) > interval) { t0 = 0; onTimer(); } ~~~~~~~~~~~~~~~~~So, I mostly do programming that is of run to completionI took a stab at the problem: http://dpaste.dzfl.pl/2eef530d00fc 0 nsecs with jitter of :500000000 nsecs 498937256 nsecs with jitter of :1062744 nsecs 499036173 nsecs with jitter of :963827 nsecs 500025650 nsecs with jitter of :25650 nsecs 500020735 nsecs with jitter of :20735 nsecs 499057062 nsecs with jitter of :942938 nsecs 498932033 nsecs with jitter of :1067967 nsecs 591037317 nsecs with jitter of :91037317 nsecs 499032794 nsecs with jitter of :967206 nsecs 499034637 nsecs with jitter of :965363 nsecs 499022963 nsecs with jitter of :977037 nsecs 498976577 nsecs with jitter of :1023423 nsecs 499076723 nsecs with jitter of :923277 nsecs 499023885 nsecs with jitter of :976115 nsecs 499018048 nsecs with jitter of :981952 nsecs 499004224 nsecs with jitter of :995776 nsecs 499048461 nsecs with jitter of :951539 nsecs 499013747 nsecs with jitter of :986253 nsecs 499018048 nsecs with jitter of :981952 nsecs 499007604 nsecs with jitter of :992396 nsecs However i seem to get jitter of around 1 ms. Is there anything else i can do to improve?
Dec 08 2015
On Tuesday, 8 December 2015 at 16:40:04 UTC, Taylor Hillegeist wrote:However i seem to get jitter of around 1 ms. Is there anything else i can do to improve?Do you want to get precision better than period of thread switches?
Dec 09 2015
On Tue, 08 Dec 2015 15:35:18 +0000, Taylor Hillegeist wrote:So, I mostly do programming that is of run to completion verity. But I have a dream of calling functions periodically. So my question is: What is the best (most time accurate) way to call a function every n time units?Busy-wait and access the CPU's high precision clock. If you have an extended wait and don't want to busy-wait the whole time, sleep up to, say, 5ms before the time you want to call the function, then busy-wait.
Dec 08 2015
On Tuesday, 8 December 2015 at 15:35:18 UTC, Taylor Hillegeist wrote:So, I mostly do programming that is of run to completion verity. But I have a dream of calling functions periodically. So my question is: What is the best (most time accurate) way to call a function every n time units? What is the best way to measure the jitter of these calls? I'm also interested in waiting vs calling periodically eg. call wait(1 ms) call is not the same as 1 ms from call to call, due to the time duration of the function call. Thanks!import core.thread; import std.datetime; import std.algorithm.comparison; import std.math; import std.stdio; import core.time; long loopTime = 0; long CmdTime = 500_000_000; //Time in ns void main() { for(int x = 0; x<20; x++){ auto time = TickDuration.currSystemTick.nsecs; myPrinter(loopTime); while(TickDuration.currSystemTick.nsecs - time < CmdTime){} loopTime = TickDuration.currSystemTick.nsecs - time; } } void myPrinter(long time){ writeln(time," nsecs with jitter of :", abs(CmdTime-time), " nsecs"); } What about this?
Dec 09 2015
On Wednesday, 9 December 2015 at 10:00:46 UTC, Andrea Fontana wrote:On Tuesday, 8 December 2015 at 15:35:18 UTC, Taylor Hillegeist wrote:Anyway in order to avoid error accumulation it's probably a good idea not to reset timer every time if possibile. If you know the operations you need to perform, probably it works better to store target time rather than delta. So instead of: - move x for 5 seconds - move y for 3 seconds - move z for 4 seconds - ... I think this works better: - move x since second 5 - move y since second 8 - move z since second 12 So errors won't accumulate.So, I mostly do programming that is of run to completion verity. But I have a dream of calling functions periodically. So my question is: What is the best (most time accurate) way to call a function every n time units? What is the best way to measure the jitter of these calls? I'm also interested in waiting vs calling periodically eg. call wait(1 ms) call is not the same as 1 ms from call to call, due to the time duration of the function call. Thanks!import core.thread; import std.datetime; import std.algorithm.comparison; import std.math; import std.stdio; import core.time; long loopTime = 0; long CmdTime = 500_000_000; //Time in ns void main() { for(int x = 0; x<20; x++){ auto time = TickDuration.currSystemTick.nsecs; myPrinter(loopTime); while(TickDuration.currSystemTick.nsecs - time < CmdTime){} loopTime = TickDuration.currSystemTick.nsecs - time; } } void myPrinter(long time){ writeln(time," nsecs with jitter of :", abs(CmdTime-time), " nsecs"); } What about this?
Dec 09 2015