« 三菱プレシジョン最終面接 | トップページ | 祈られたー »

中身と外見

無駄に長くなったので、結論を先に書きます。

プログラムの中の構造と外のインターフェースを分離できていれば、外見を変えずに中の構造を変えられるよという話。

後はメモのようなものです。

2週間くらい悩んでると思われるQuickLookの問題を解決できそうな気がするアイデアが浮かんだ。

その問題は、クライアントの受信が遅くてデータの取りこぼしが多すぎて実用に耐えないこと。

問題の発生条件は、サーバとクライアントを同一パソコン上で動かしている時には発生せず、別々のパソコンで実行した時だけ発生していた。

今日は、一体どこが遅くなっているのかを、自前の時間計測関数を使って測ったりした。

その結果、クライアント側でrecv関数から帰ってくるのが遅いことが分かった。帰ってくるまでにかかる時間は0.2秒強だった。100Hzのデータを5Hzで受信しようとしてるので、そりゃできないわけだ。

recvが遅くなる原因をネットで調べると、TCPを使ったときはNagleアルゴリズムが働き、小さいデータがすぐに送受信されるとは限らないことを知った。

Microsoftのサポートページで見つけた情報を参考にした。解決法としては、setsockopt関数で、TCP_NOREADYを設定して、Nagleアルゴリズムを使わないようするのと、同じくsetsockopt関数でSO_SNDBUFを使ってバッファの大きさを0にする方法があげられていた。

どちらも試してみたが、望む結果にはならなかった。

クライアントの取りこぼしはなくなったが、なぜかサーバの送信が0.2秒刻みになってしまった。これではサーバ側でテレメータからのデータ取得に失敗する。

小手先ではダメそうなので、サーバ、クライアント間の通信の仕方そのものを改めないといけない。

通信スピードを求めるならUDPだが、UDPでサーバの送信を確実にクライアントが受信するという条件を満たすのが面倒だ。TCPと変わらないようなエラー訂正をする必要が出てきそうに思われる。

そこで、TCPを使ったまま、サーバはひたすらに接続されているクライアントにデータを送りつけて、データの世代管理やキャッシングはクライアントDLLの責任とすることにした。これでサーバはより簡単になる。

明日は、これを実装して評価する予定。

|

« 三菱プレシジョン最終面接 | トップページ | 祈られたー »

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/535686/29339383

この記事へのトラックバック一覧です: 中身と外見:

« 三菱プレシジョン最終面接 | トップページ | 祈られたー »