#!/usr/bin/perl use strict; use warnings; use Time::HiRes qw(usleep gettimeofday); my $microseconds = 1_000_000; my $iter = 10; my $tflux = 0; my $flux = 0; my $titer = $iter; my $sleep = $microseconds; my $count = 0; my ($start_s, $start_m) = gettimeofday; my ($is, $im) = ($start_s, $start_m); my ($seconds, $micro) = ($start_s, $start_m); my $diff = 0; foo: { # tflux serves as gravity # flux serves as inertia $diff = int ( ($flux + $tflux) / 2 + 0.5); $sleep -= $diff; print "sleeping for $sleep\nelapsed time: " . (($start_s - $is) * 1_000_000 + $start_m - $im) . "\ntotal correction: $tflux\ncorrected from last: $flux\naverage: $diff\n"; for (1 .. $iter){ action(); usleep $sleep; } ($seconds, $micro) = gettimeofday(); $flux = # difference from the last iteration ( (($seconds - $start_s) * 1_000_000) # elapsed seconds + $micro - $start_m # elapsed micro seconds - $microseconds * $iter # desired interval of entire loop ) / $iter; $tflux = # difference from desired total time ( (($seconds - $is) * 1_000_000) # elapsed seconds + $micro - $im # elapsed micro seconds - $microseconds * $titer # desired interval of entire loop ) / $titer; $titer += $iter; ($start_s, $start_m) = gettimeofday(); redo foo; } sub action { $count++; usleep 100; } 1; # keep your mother happy __END__