- ベストアンサー
UDP送信レートの改善方法とは?
- UDPで帯域測定プログラムを作成しましたが、送信レートを改善したいと考えています。
- 現在のプログラムには100個のパケットを送信する処理と無駄なループがありますが、より効率的な方法を模索しています。
- もし他の良い方法があれば、アドバイスをいただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 私の作ったプログラムは、紹介していただいたサイトのプログラムのようにスレッド化していません。 > ですから、スリープはできないと思うのですが、どうすればよいでしょうか? マルチスレッド化していなくても、メインのスレッドは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); を入れることでいけると思います。
その他の回答 (1)
- mtaka2
- ベストアンサー率73% (867/1179)
「無駄なループ」はやめましょう。それこそ、無駄にCPUパワーを消費していまいます。 それよりも、Sleep を使ってください。 http://msugai.fc2web.com/java/thread/sleep.html
お礼
回答ありがとうございます。 私の作ったプログラムは、紹介していただいたサイトのプログラムのようにスレッド化していません。 ですから、スリープはできないと思うのですが、どうすればよいでしょうか? 私の作ったプログラムを載せます。ご指導していただければ幸いです。 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(); } }
お礼
回答ありがとうございます。 アドバイスしていただいたことを参考したらうまくできました。 ありがとうございました。