added a comment - - edited
Part 3 is complete, I got these results with the following program, if they are sufficient we can make the remaining tasks a 1.7.4 bug otherwise I will continue work.
Rail: initialise = 0.131934644
Rail: work = 0.127145883
RailWrapper: initialise = 0.443303999
RailWrapper: work = 0.537448934
FinalRailWrapper: initialise = 0.111745609
FinalRailWrapper: work = 0.137191966
FinalFieldsRailWrapper: initialise = 0.119469072
FinalFieldsRailWrapper: work = 0.121270821
-O3 -mtune=native -march=native -DNO_CHECKS
g++ (Ubuntu 4.3.2-1ubuntu11) 4.3.2
Linux lenin 2.6.27-9-generic #1 SMP Thu Nov 20 21:57:00 UTC 2008 i686 GNU/Linux
import x10.io.Console;
class RailWrapper[T] implements (Int)=>T {
public static def makeVar[T](length:Int) = new RailWrapper[T](length);
var wrapped : Rail[T];
val length : Int;
public def this (length:Int) {
wrapped = Rail.makeVar[T](length);
this.length = length;
}
public def apply (index:Int) {
return wrapped(index);
}
public def set (v:T, index:Int) {
wrapped(index) = v;
}
}
final class FinalRailWrapper[T] implements (Int)=>T {
public static def makeVar2[T](length:Int) = new FinalRailWrapper[T](length);
var wrapped : Rail[T];
val length : Int;
public def this (length:Int) {
wrapped = Rail.makeVar[T](length);
this.length = length;
}
public def apply (index:Int) {
return wrapped(index);
}
public def set (v:T, index:Int) {
wrapped(index) = v;
}
}
class FinalFieldsRailWrapper[T] implements (Int)=>T {
public static def makeVar2[T](length:Int) = new FinalFieldsRailWrapper[T](length);
var wrapped : Rail[T];
val length : Int;
public def this (length:Int) {
wrapped = Rail.makeVar[T](length);
this.length = length;
}
public final def apply (index:Int) {
return wrapped(index);
}
public final def set (v:T, index:Int) {
wrapped(index) = v;
}
}
public class InlineTest {
public static def do_test[T] (name:String, rail:T) {
}
public static def main (args : Rail[String]) {
val sz = 20 * 1000000; {
val rail = Rail.makeVar[Double](sz);
val t1 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = i;
}
val t2 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = rail(i) / 2;
}
val t3 = System.nanoTime();
Console.OUT.println("Rail: initialise = "+(t2-t1)/1E9);
Console.OUT.println("Rail: work = "+(t3-t2)/1E9);
}
{
val rail = RailWrapper.makeVar[Double](sz);
val t1 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = i;
}
val t2 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = rail(i) / 2;
}
val t3 = System.nanoTime();
Console.OUT.println("RailWrapper: initialise = "+(t2-t1)/1E9);
Console.OUT.println("RailWrapper: work = "+(t3-t2)/1E9);
}
{
val rail = FinalRailWrapper.makeVar2[Double](sz);
val t1 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = i;
}
val t2 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = rail(i) / 2;
}
val t3 = System.nanoTime();
Console.OUT.println("FinalRailWrapper: initialise = "+(t2-t1)/1E9);
Console.OUT.println("FinalRailWrapper: work = "+(t3-t2)/1E9);
}
{
val rail = FinalFieldsRailWrapper.makeVar2[Double](sz);
val t1 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = i;
}
val t2 = System.nanoTime();
for (var i:Int=0 ; i<rail.length ; ++i) {
rail(i) = rail(i) / 2;
}
val t3 = System.nanoTime();
Console.OUT.println("FinalFieldsRailWrapper: initialise = "+(t2-t1)/1E9);
Console.OUT.println("FinalFieldsRailWrapper: work = "+(t3-t2)/1E9);
}
}
}
Part 3 is complete, I got these results with the following program, if they are sufficient we can make the remaining tasks a 1.7.4 bug otherwise I will continue work.
Rail: initialise = 0.131934644
Rail: work = 0.127145883
RailWrapper: initialise = 0.443303999
RailWrapper: work = 0.537448934
FinalRailWrapper: initialise = 0.111745609
FinalRailWrapper: work = 0.137191966
FinalFieldsRailWrapper: initialise = 0.119469072
FinalFieldsRailWrapper: work = 0.121270821
-O3 -mtune=native -march=native -DNO_CHECKS
g++ (Ubuntu 4.3.2-1ubuntu11) 4.3.2
Linux lenin 2.6.27-9-generic #1 SMP Thu Nov 20 21:57:00 UTC 2008 i686 GNU/Linux