いつも参考にさせていただいているid:sumimさんにリンクされてしまいました。光栄だ~
Cokeは凄い人たちに任せてもっぱらpepsiで遊んでいるのですが、せっかくなのでたらい回し関数のpepsi版を晒します。
{ import: st80 } Time : Object() Time millisecondClockValue { struct timeval tv; gettimeofday(&tv, 0); return (oop)(((tv.tv_sec * 1000 + tv.tv_usec / 1000) &0x3fffffff) << 1 | 1); } Time millisecondsToRun: block [ | initialMilliseconds | initialMilliseconds := self millisecondClockValue. block value. ^ self millisecondClockValue - initialMilliseconds ] StaticBlockClosure timeToRun [ ^ Time millisecondsToRun: self ] TakY : Object () TakY x: x y: y z: z [ x <= y ifTrue: [^ y]. ^ self x: (self x: x - 1 y: y z: z) y: (self x: y - 1 y: z z: x) z: (self x: z - 1 y: x z: y) ] [ [TakY x: 12 y: 6 z: 0] timeToRun println. ]
例によって前半はミリ秒での計測をするためのコードです。定義や呼び出しの本体は最後の10行ほどです。(id:sumimさんと同じコードが使えます)
#TimeのmillisecondsToRunの実装はrolloverの処理をはしょってますので危険な用途には使わないでください 🙂