如何循环一段代码x次并取平均值

时间:2013-04-13 22:46:05

标签: java

我希望循环下面代码的主要部分,然后计算从循环中收集的结果的平均值

这是代码:

class PingPongVariousLengths {

    static public void main(String[] args) {

        MPI.Init(args);
        int myrank = MPI.COMM_WORLD.Rank();
        int tag = 99;
        int maxlen = 104857600; //200 megabytes     104857600 characters * 2 bytes per character = 209715200 bytes total, or 200 megabytes
        int minlen = 1; // 2 bytes
        char [] sendbuff = new char [maxlen];
        char [] recvbuff = new char [maxlen];
        long speedKbps;
        long speedMbps;


        if (myrank == 0) {
            for (int len = minlen; len <= maxlen; len *= 2) { //len=*2 doubles the ping size each time
                long startTime = System.nanoTime();                  
                 MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag);
                 MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag);
                long endTime = System.nanoTime();
                long duration = endTime - startTime;
                long durationseconds = (duration * 10-9); // Converts nanoseconds to seconds
                System.out.println("Time for the ping to be sent and recived of " + (len*2) + " bytes is " + durationseconds + " seconds"); // multiples by 2 becuase 1 character is 2 bytes
                //double transferRate = ((len*2.0) / durationseconds ) ; //amount of data in bytes transferred in 1 second. Currently returning 0 for every result
                //System.out.println("transferRate: " + transferRate + " bytes per second");
                double transferRateMb = ((len*524288.0) / durationseconds ) ; //amount of data in megabytes transferred in 1 second. 
                System.out.println("transferRate (megabytes) : " + transferRateMb + " megabytes per second");
                }
        } else if (myrank == 1) {
            for (int len = minlen; len <= maxlen; len *= 2) {
                 MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag);
                 MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag);
            }
        }


        MPI.Finalize();
    }
}

我试图循环它说10或20次,来自

的代码
            for (int len = minlen; len <= maxlen; len *= 2) { //len=*2 doubles the ping size each time

                long durationseconds = (duration * 10-9); // Converts nanoseconds to seconds

我希望运行20次,然后duration的结果平均超过10或20

我怎样才能最好,最有效地解决这个问题

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要每个长度增量的平均持续时间秒。为了获得持续时间的平均值,您需要将长度循环移动到平均循环之外。请参阅下面的代码段。

long durationseconds;
int MAX_LOOPS = 20;

for (int len = minlen; len <= maxlen; len *= 2) {
        if (myrank == 0) {
                durationseconds = 0;
                for (int i = 0; i < MAX_LOOPS; i++) {
                        long startTime = System.nanoTime();           
                        MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag);
                        MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag);
                        long endTime = System.nanoTime();
                        long duration = endTime - startTime;
                        durationseconds = durationseconds + (duration * 10-9);
                }
                durationseconds = durationseconds / MAX_LOOPS;
                System.out.println("Average time for the ping to be sent and recived of " + (len*2) + " bytes is " + durationseconds + " seconds");
                double transferRateMb = ((len*524288.0) / durationseconds );
                System.out.println("average transferRate (megabytes) : " + transferRateMb + " megabytes per second");
        } else if (myrank == 1) {
                MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag);
                MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag);
        }
}

答案 1 :(得分:0)

long totalDuration = 0;
for (int i = 0; i<nTimes;i++){
... //Code N stuff here
totalDuration += duration;
}
long avgDuration = totalTime /nTimes;