※ ChatGPTを利用し、要約された質問です(原文:処理負荷特定で考えられる要因について)
処理負荷特定で考えられる要因について
このQ&Aのポイント
処理負荷の高い現象が発生している関数Aについて、その要因を考える必要があります。関数AはVC6(SP6)上のWin7で動作しており、iniファイルへの書き込み処理を行っています。関数Bから呼び出される構造になっており、関数Aの処理時間が不定期に30秒以上かかる現象が発生しています。原因を特定するために、関数Aの内容や環境の要素、セキュリティソフトの影響などを考える必要があります。
以前にも似た現象が発生した際、ウイルスバスターの影響が指摘されました。関連する要素として、ファイルオープン/クローズの回数が50回前後繰り返されており、この処理が大幅な負荷を引き起こす可能性があります。現在の状況では、ウイルススキャンのソフトウェアはインストールされていないため、その影響は考えにくいですが、確認する価値があります。
関数Aの処理時間が通常よりも長くなる原因は、いくつか考えられます。まず、関数Aで使用しているAPIや標準関数の仕様やパフォーマンスに問題がある可能性があります。また、iniファイルの操作が効率的でない場合、処理負荷が高くなる可能性もあります。さらに、使用している環境や他のプロセスとの干渉、DI/Oボードの影響なども考慮する必要があります。これらの要素を調査し、現象の原因を特定することが重要です。
元々他の人が作成したコードなのですが
元はXPで使用 その時はそういった現象が出ていないようにも思えますが
頻度の問題で気が付かなかったのかもしれません
(現在も動いていますが特に問題が出ているということを聞いていません)
現在 Win7上のVC6(SP6)にて ini ファイルへの書き込み処理を行っている関数Aがあり
それを関数Bからコールしています
関数の関係は下に書いたようなイメージになります
その他複数スレッドなども存在し各種動作を行っています
問題なのは不定期に(頻度も少ない様ですが)関数Aの処理時間が
30秒以上かかることがあるようなのです(ファイルCのチェックにて確認)
もちろん通常は0~1秒程度しかかかっていません
なぜそのような現象が発生するのか要因がつかめずに悩んでいます
(しかも30秒っていくらなんでもかかりすぎだろう と)
考えられる可能性がありましたら何でもいいので教えていただけないでしょうか
少しでも情報が欲しいので可能性・想像だけでも構いません
(あまりにも現実離れした想像は困りますが)
関数B
{
ファイルCに処理開始時間保存 (普通のファイル書き込み処理 追加モード)
関数A
ファイルCに処理終了時間保存 (普通のファイル書き込み処理 追加モード)
}
関数A
{
特定 INI ファイルへの書き込み 使っているのは APIや標準関数のみ
sprintf ・ WritePrivateProfileString 関数
セクション・キー名など変えて 50回前後実行します(1つの ini ファイルです)
}
ウイルスバスターが動いている環境で 上記に類似したコードを動かしたときに
異常に処理負荷がかかったということは経験しています
(多分ファイルオープンクローズを繰り返しているためかなと想像しています)
ただしこの時は時々とかいう問題では無いためすぐにわかりました
(上記現象は分かっているため)該当PC上ではウイルススキャンの類のソフトは
インストールしていません
閉塞LAN構築下に存在しているPCとなります
TCP/IP 通信 共有も行っているのでファイヤーフォールは無効にしています
あまり関係ないと思いますが DI/Oボード増設を行っています
その他については特殊な設定は行っていないと思っていただいて構わないと思います
(既に十分特殊という話もあるかもしれません)
一つのファイルへのオープンクローズを一気に50回前後繰り返すという
作りもいまいちなのですが 既に駆動しているプログラム・
ini ファイルの操作の手軽さということでそのような作りになってしまっています
簡単に他の形に置き換えられるのであればそれでもかまわないのですが
INIファイルの特定セクションや特定キーの一部データの更新という処置の為
自前でやるのにも現在躊躇している状態です
-> こうすれば簡単に置き換えが可能だって話があればそういった情報でも構いません
全ファイル読み込んだうえでセクションやキーをチェック該当部分を
置き換え(バッファ操作)して最後に一括で書き込めばいい
といったことは分かっています
(それを自前でやってないのがini ファイルの操作の手軽で~~ということです)
悩んでる間に作っちまえ という話もあるもかもしれませんが
(微妙な諸事情もあるので)あえてそこには触れないでください
他に必要な情報があれば必要に応じて追記させていただきます
お礼
数点の可能性含め考えるとべき内容もある程度見当ついてきました 様子見のじょゆ教で時間がどれだけかかるか分からないので 一旦閉じさせていただきます
補足
回答ありがとうございます >ローカルファイルにあるINIファイルを変更しているんですよね。 そうです >50回のオープンクローズを1回にしてみると、状況が変わるかとか、 此方に関しては質問文に書いたように躊躇している状態です >関数Aをコールしない場合は、そういう事象は発生しないということも確認済? 頻度の問題確実に確認できているというわけではありません 今現状ではっきりしているのはその処理内で異様に時間がかかることがある ということだけです >構造を改善するのが一番よさそうだけど、例えば、その頻繁にアクセスするINIファイルは、 >RAM上に置き(RAMディスク作成ツールでRAMドライブを作る)、RAM上での書き換えが終わったら、 完全な構造変更というのが諸事象で難しい点もあるのですが 他で同様なことをやって逃げていた前歴がありました すっかり忘れ去ってました 同様対処で発生事象が改善されたことも確認しています システム上今からRAM DISKなどを構築するのは不安があるので 一旦作業用フォルダにコピー そちらのファイルに対して現状の処理を行い終了後再度コピーする といった方法がありますね #1さんの書かれたように本当に都度オープンクロースしてるのかという話と 遅延書き込みとか影響ないのか 等ちょっとわからない点もありますが やってみる価値はありそうな気がします