• ベストアンサー

プログラムの時間を計りたい!!

tcpでのネットワークプログラムをつくりました。 そこでサーバからクライアントまで届くまでの時間を調べたいんですがどうすればよいでしょうか?? 実際にgettimeofday関数をつかったのですが、ミリセカンドまでしかでないようなので失敗しました。  サーバの送った時間   1月17日20時8分20秒877  届いた時間   1月17日20時8分20秒877 となって時間が測れません。 nttcpとかのソフトウェアでもできるみたいなこと書いてたから調べましたがどうもできそうにありません。ってか僕がよくわからない・・・・。 それにできればプログラムの要所要所の時間がしりたいもので。 あと、難しい設定をしてまで正確な時間は知らなくてもいいんです。 gettimeofdayがミリセカンドよりももっと細かい時間(ナノセカンド?)ぐらいまでできるだけでいいんです。 知ってる方おしえてください!!

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

OSがわかりませんが、普通gettimeofdayはマイクロ秒までの情報が入ります。 ただし、OSやマシン自体にそこまで細かい計測ができるかどうかは別です。 それよりも問題は、サーバとクライアントの時計の同期が取れていない限り、いくら細かく通信時間を計測しても無意味ということはありませんか?どうやってマイクロ病やナノ秒単位で同期させますか?ntpでもせいぜいミリ病単位でしか合わないと思います。 pingなどは、行って帰ってくるまでの時間を同一マシンで計測するため、その問題はありません。このようにすれば、ラウンドトリップタイムは数ミリ秒以上はあるので、gettimeofdayがたとえミリ秒単位であってもある程度の計測は可能でしょう。 プログラムの要所ごとの時刻を知りたいとのことですが、プログラムは非常に高速に実行される反面、典型的なOSでは100ミリ秒単位で割り込みをかけ、他のプロセスにスイッチしますので、正確な測定は意味をもたない可能性もあります。

teruhiko
質問者

お礼

親切な回答ありがとうございます!!僕が聞きたかったこと分かりやすく教えてくれて本当にありがとうございました!! OSはLinux7.3 C言語です。 ntpってのも調べました。でもntpややっこしそうなのであきらめました。時間がないもので。卒研の提出が・・・涙 で同期やっぱしなきゃ意味ないっすかねぇ~。 僕がやろうとしたこと まずサーバの時間のずれとクライアントの時間のずれを調べる。 送信した時間ー受信した時間+時間のずれ で計算しようと思ったんですが、駄目っすか?? できればもう一回おしえてください!!

その他の回答 (2)

回答No.3

gettimeofdayでマイクロ秒まで計測してそれを一応信用するなら、あとはサーバとクライアントの時差をどう計測するかです。 ここはやはりntpがもっとも信頼できると思います。ntpの内部動作までは知る必要はなく、両方でntpd(あるいはxntpd)を動かし同じntpサーバに同期させます。安定した状態で両方がそのntpサーバからどれだけずれているかをntpq -pでoffset欄(たぶんミリ秒)で調べ、その差をとれば両者のずれといえます。 ntpサーバに時刻情報を取りに行くとその時点のoffsetに更新されるので、その更新直後を手早く調べないとどんどんずれますので注意が必要です。いつ更新予定かはwhen欄を見ます。ずれの量にあわせてntpdがどんどん時刻を修正していきますので、手早い操作が必要です。それらしい値がいくつもえられるまで何度も繰り返すべきでしょう。 卒論にはそうした時間計測の方法をきちんと記載しないと、信頼性を問われますよ。

teruhiko
質問者

お礼

kaitouマンさん!!本当にありがとう!!よーーーーーーーく分かりました!! でも同じLAN内に時計サーバ(ntpサーバ)を自分で作っておいて、それにサーバとクライアントの時計を同期させるとかどない??でもntpサーバつくるのって難しいのかな・・・。汗 ちなみに調べるのはストリーミングサーバですtcpで作ったんですけど、一回で送信するバイト量を変化させることで送ってから再生するのにどれくらい時間が変わっていくのかを調べたくて。 とにかくなんとか頑張ってみます!!無理なら無理で勉強なりそうだし。卒研発表のときも努力したけどちゃんとできませんしたって言ってやる!! 本当にありがとうございました!!

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

>gettimeofdayがミリセカンドよりももっと細かい時間(ナノセカンド?) >ぐらいまでできるだけでいいんです。 そんなに簡単に高精度の時間計測はできません。 まず、ナノセカンドまでの値を取得できる関数はないと思います。 gettimeofday関数は、一応usecの値を返しますが、正確な(精度が保証された) 値というわけではありません。通常msecくらいまでが限界です。 他にも#1の方が言われるように、あなたのやろうとしていることには 無理があります。測定方法についてはもっと工夫が必要です。 こんなに苦労して測定されています。 http://mikilab.doshisha.ac.jp/dia/research/person/tecchan/parallelm1/GA7/ こちらもご参考に。 http://www.super-computing.org/sr8000/timer.html

teruhiko
質問者

お礼

usecで一応大丈夫でした。これで同期できればいいんだとおもうのですが。 ただMovingWalkさんがおっしゃるように正確ではないかもしれませんが・・・。 時間があれば測定もしっかりするよう努力するのですが、まさか測定がこんなにむずかしいものとはおもわなかったもので。涙 とにかくやれるだけやってみます!!ありがとうございました。