Пожалуйста, можете подтвердить результат? А то меня числа как-то засмущали... вот тест на других языках:
http://blog.dhananjaynene.com/2008/0...-jruby-groovy/
И вот мой код на AS3, который его вобщем-то один в один повторяет, безо всяких попыток что-то оптимизировать. Результат получается совсем даже не плохой (у меня в релиз плеере 64 бит Убунту около 9.6 микросекунд). Но что-то мне не верится, что все так хорошо... может я что-то пропустил?

Код AS3:
package org.wvxvw.josef
{
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getTimer;
public class JosefTester extends Sprite
{
private var _field:TextField = new TextField();
public function JosefTester()
{
super();
super.addChild(this._field);
test(this._field);
}
private static function test(field:TextField):void
{
var count:int = 100000;
var time:int = getTimer();
var chain:Chain;
for (var i:int; i < count; i++)
{
chain = new Chain(40);
chain.kill(3);
}
field.text = "Time per iteration: " + (getTimer() - time) * 1000 / count + " microseconds";
}
}
}

Код AS3:
package org.wvxvw.josef
{
public class Chain
{
public function get first():Person { return this._first; }
private var _first:Person;
public function Chain(size:int)
{
super();
var last:Person;
var current:Person;
for (var i:int; i < size; i++)
{
current = new Person(i);
if (!this._first) this._first = current;
if (last)
{
last.next = current;
current.prev = last;
}
last = current;
}
this._first.prev = last;
last.next = this._first;
}
public function kill(nth:int):Person
{
var current:Person = this._first;
var shout:int = 1;
while (current.next != current)
{
shout = current.shout(shout, nth);
current = current.next;
}
this._first = current;
return current;
}
}
}

Код AS3:
package org.wvxvw.josef
{
public class Person
{
public function get count():int { return this._count; }
public function get prev():Person { return this._prev; }
public function set prev(value:Person):void
{
this._prev = value;
}
public function get next():Person { return this._next; }
public function set next(value:Person):void
{
this._next = value;
}
private var _count:int;
private var _prev:Person;
private var _next:Person;
public function Person(count:int)
{
super();
this._count = count;
}
public function shout(theShout:int, deadIf:int):int
{
if (theShout < deadIf) return theShout + 1;
this.prev.next = this.next;
this.next.prev = this.prev;
return 1;
}
}
}