宜しくお願い致します。
Microsoft Visual Studio .NET 2005にて単純なWEBサービス(”Hello”文字列を返すWEBサービス)と、これをWEB参照した単純なWindowsアプリケーション(ボタンを押すとWEBサービスと通信し”Hello”を出力)を作成し、以下のような検証をしました。
※全ての検証はIISのセッションタイムアウト前に行っています
①アプリケーション起動後、ボタン押下
②アプリケーションを終了後、再度①
③アプリケーション継続したまま、再度ボタン押下
結果、それぞれのボタン押下から”Hello”出力までにかかる時間は・・・
①>②>③
となりました。
全ての検証をIISのセッションタイムアウト前に行っていることから、WEBサービスの初回起動によるパフォーマンスの低下とは切り離して考えているのですが、そうなると何が原因でこの時間差が発生しているのか解らずご質問させて頂きました。
.NETアプリケーションがネイティブコードを生成させるタイミングもOSの起動後、初回のみと認識しており、上記検証による時間差はOSの再起動とは関係なく発生している為、尚更原因が解らない限りであります。
長々となってしまいましたが、何とぞご掲示の程宜しくお願い致します。
キャッシュとか
編集 削除やじゅ様、ありがとうございます。
ただ図々しいとは思うのですが、もう少し具体的にご説明頂けないでしょうか?
実はあるシステムで利用しているWEBサービスの初回のアクセス時間がクライアント毎に開きがあることが判明し、簡単なプログラム(上記のような)を作成し調査を始めたといった背景があります。
なので、WEBサービスの仕様(?)でクライアントに依存するならばするでその説明をする必要があるのですが、私の知識ではその根拠までたどり着けず困っております。
なにとぞ宜しくお願い致します。
感で書いたたけなので、なんとも言えません。
METAタグによる制御で、再度検証してみてはいかがでしょうか
http://www.atmarkit.co.jp/fjava/rensai2/webopt12/webopt12.html
やじゅ様、ありがとうございます。
教えて頂いたサイトを参考にし、自分なりにキャッシュの仕組みを調べて検証をしていたところ新たな事実が発覚しました。
アプリケーションの起動→ボタン押下
を繰り返し行っていると、約1分後に”Hello”出力までの時間が長くなります。
まさにクライアントキャッシュがクリアされたのではと考え、クライアントキャッシュがクリアされる幅を広げようと色々調べては見たのですが・・・思うような成果が上げられません。。。
引き続き調査を続けたいと思いますが、また行き詰まった際は何とぞアドバイスの程宜しくお願い致します。
とりあえず・・・解決致しました。
結果としてはWEBサービスのプロキシクラスの生成に時間がかかっていたようです。
WEBサービスへの初回アクセス時のプロキシクラスの生成処理がクライアントのスペックにより結構な開きがあるらしく、一度プロキシクラスが生成されてしまえば、以降のアクセスは短縮されます。ただし、生成されたプロキシクラスはGC(ガベージコレクション)により不定期で解放されてしまい、解放されてからアクセスした場合は、再度プロキシクラスの生成処理が実行される為、初回アクセス時と同じだけ時間がかかってしまうみたいです。
そこで、WEBサービスの宣言をSharedにすることで対応してみたところアプリケーションを起動して初回アクセスは時間がかかるものの、以降は安定することが解りました。
やじゅ様に頂いたヒントからなんとか説明足り得る根拠までたどりつけました(間違った解釈があるかもしれませんが・・・)
本当にありがとうございました。
もりおさん、解決おめでとうございます。
私など単なるおもいつきで書いてますし・・・
こういう場合は、クラスの生成とGCが関連するんですね。
こちらこそ勉強になりました。