current-jiffy is not usable portably

In addition to current-second, the R7RS draft adds a timer function, current-jiffy. Obviously the Theoretical Right Thing for a timer is a high-resolution version of the same linear timescale used for dates, which current-second can (in an ideal implementation) provide. But in some applications (especially the rather important one of profiling), the timer can be called very frequently, so it must avoid allocation, which means either returning a fixnum or modifying some sort of mutable timer object. This is the point of current-jiffy.1

The main use case is something like this:

;;; Evaluate the body. Return multiple values: the time taken in
;;; seconds, followed by whatever values the body returned.
;;; This returns the time in seconds, not jiffies, for human
;;; readability. It returns the time as a number, rather than
;;; printing it somewhere, so it can be used programmatically.
(define-syntax time
  (syntax-rules ()
    ((time forms ...)
     (let ((start (current-jiffy)))
       (let-values ((vals (begin forms ...)))
         (apply values (/ (mod (- (current-jiffy) start) jiffy-modulus)
                          (jiffies-per-second))
                       vals))))))
> (time (/ (factorial 100) (factorial 99)))
0.0124525432
100 ;hopefully

Presumably R7RS-large will include such a macro. (time? elapsed-time? profile? bench?) But in the current R7RS-small, users can't portably write it, or do anything else with jiffies reliably, because they can't deal with overflow.

High-precision fixnum timers overflow fast. A 32-bit microsecond clock, for instance, overflows every 71 minutes, and a 30-bit fixnum every 17 minutes. This is too frequent to ignore, so all subtraction and comparison of jiffies needs to be modulo the word size, so all programs using current-jiffy need to know jiffy-modulus. In theory they could determine it by experiment, but that takes a while and is imprecise, so in practice portable code can't use current-jiffy for anything but setting random seeds.

This could be fixed by adding jiffy-modulus (jiffy-limit? max-jiffies?) to the standard. But since current-second already covers timing fairly well, it might be better to leave current-jiffy to R7RS-large. Efficient timers are a useful feature, but not one that belongs in Small Scheme.

By the way, shouldn't jiffies-per-second be a constant, not a function? It's in the section called “Standard Procedures”, which does not describe a numeric constant, but it's better to change the title of the section (Standard Definitions? Standard Procedures and Constants?) than to change the language to fit the title.

1IIUC it originally had another point: to provide a linear timescale even if current-second didn't. But now that current-second is supposed to provide TAI, current-jiffy is no longer needed for this, and even if current-second only provides disguised POSIX time, its nonlinearities are infrequent enough for most applications to ignore.

9 comments:

  1. It's reasonable to provide "jiffy-modulus", I agree; ticket #465 posted. "Jiffies-per-second" is a procedure because there's no way in Scheme to provide an immutable variable.

    ReplyDelete
  2. Ticket #465 added to the current ballot.

    ReplyDelete
  3. If jiffies-per-second can be assigned, making it a function doesn't help. Like any standard definition, it can be replaced, potentially breaking all code that uses it.

    But in any implementation that supports constants, all standard definitions would presumably be constant, so this problem will not arise.

    ReplyDelete
  4. Alas, the WG was unconvinced: #465 did not pass, and R7RS-small users will have to live with a constant jiffy origin.

    ReplyDelete
  5. It can be replaced, but only by excluding it from the (scheme time) import and importing something else, which is statically detectable. It can't be mutated at a random point in the code.

    ReplyDelete
  6. Le magasin a résolu des problèmes pour moi, le service est très patient,gucci pas cher c’est une expérience de magasinage parfaite. Quand j'ai reçu les chaussures, j'ai pensé que c'était une bonne copie des chaussures.gucci lunettes de soleil pas cher J'aime cette boutique en ligne, cette chaussure est simple et généreuse. Très satisfait de cet achat.

    ReplyDelete
  7. Cette réplique de chaussures Christian Louboutin est de qualité parfaite et très agréable à porter.replique de christian louboutin Vous pouvez donc la porter lorsque vous voyagez, sans vous fatiguer.pas cher louboutin butin Je recommande ce site à mes bons amis, ils sont très heureux de pouvoir acheter de telles chaussures pas chères Christian Louboutin

    ReplyDelete
  8. The quality of this replica jersey is perfect, cheap Soccer Jerseys and it is very comfortable to wear. It is comfortable to wear when traveling. The fabric is comfortable, soft, heavy, not thin, elastic, and anti-wrinkle.cheap belgium national team Jerseys I recommend this site to my good friends, they are very happy to get such cheap clothes

    ReplyDelete
  9. I have been paying attention to watches.fake rolex watches After receiving the goods, I was surprised. The leather strap is comfortable, the watch is lightweight, high quality, and the price is good.replica rolex milgauss watches If you are looking for a watch that suits your daily wear, this replica watch is definitely the perfect outfit. I will buy again!

    ReplyDelete

It's OK to comment on old posts.