アプリ版:「スタンプのみでお礼する」機能のリリースについて

UDPで帯域測定プログラムを作りました。
このプログラムは、送信側で10000個のパケットを送信して、
受信側でスループット、パケット到達率、パケット到達間隔を測定するものです。

このプログラムに送信側で送信レートという機能を追加したいのです。
送信レートは、1秒間に何バイトのパケットを何個送ったかというものですよね?
私は1秒間に100個のパケットを送信しようと考えています。

私が考えたのは、100個のパケットを送る処理と一緒に、無駄なループを追加するということです。
こうすることで無駄なループで時間を稼ぐことができます。1秒に近づくようにループを調節すればよいと考えました。

時間を稼ぐためのループを作りたいのですが、ループの中はどう書いたらよいでしょうか?
また、ほかに良い方法があれば、アドバイスをいただきたいです。

A 回答 (2件)

「無駄なループ」はやめましょう。

それこそ、無駄にCPUパワーを消費していまいます。

それよりも、Sleep を使ってください。
http://msugai.fc2web.com/java/thread/sleep.html
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

私の作ったプログラムは、紹介していただいたサイトのプログラムのようにスレッド化していません。
ですから、スリープはできないと思うのですが、どうすればよいでしょうか?

私の作ったプログラムを載せます。ご指導していただければ幸いです。
import java.net.*;
import java.io.*;

public class UDPSpeedClient {
  public static void main(String[] args) throws IOException {
    final int BUF_MAX = 500;

    if (args.length != 2)
      throw new IllegalArgumentException("Parameter(s):<Server><Port>");

    InetAddress host = InetAddress.getByName(args[0]);
    int port = Integer.parseInt(args[1]);
    long send_start;
    long send_stop;
    int send_total = 0;
    byte[] send_buf = new byte[BUF_MAX];

    DatagramSocket socket = new DatagramSocket();
    send_start = System.nanoTime();
    System.out.println("送信開始");
    for(int i = 0;i<100;i++){
      DatagramPacket sendPacket = new DatagramPacket(send_buf,BUF_MAX,host,port);
      send_total += BUF_MAX;
      try{
        socket.send(sendPacket);
        for(;;){
          // ここで時間を稼ごうとしています。
          break;
        }
      }catch(IOException e){
        System.out.println(e);
      }
    }
    send_stop = System.nanoTime();
    System.out.println("送信完了");

    //結果表示
    socket.close();
    }
}

お礼日時:2009/12/06 00:36

> 私の作ったプログラムは、紹介していただいたサイトのプログラムのようにスレッド化していません。


> ですから、スリープはできないと思うのですが、どうすればよいでしょうか?

マルチスレッド化していなくても、メインのスレッドは1本走っています。
http://d.hatena.ne.jp/konchi/20090911/1252646115

あとは「i回目のsleep終了予定時刻」は「送信開始から(i+1)×10ミリ秒後」になるので、それと、sleep開始時刻との差が、sleepすべき時間になります。
ですから、socket.send の次に
Thread.sleep((i+1)*10-(System.nanoTime()-send_start)/1000000);
を入れることでいけると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
アドバイスしていただいたことを参考したらうまくできました。

ありがとうございました。

お礼日時:2009/12/15 16:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!