- ベストアンサー
スレッドの優先度を下げる方法。
現在バックグラウンドでファイルアクセスを行うプログラムを組んでおります。 しかしこの読み込みのスレッドのCPU占有率が高いためか、バックグラウンドで 読み込んでいるのに関らず、その他の処理が重くなってしまいます。 この問題を解決しようとファイルアクセスの合間にSleepを挟みましたが 一度にファイルアクセスしている時間が長いためかあまり効果が目に見えません。 できたら平均的に負荷がかかるようにしたいのです。 何か解決方法はないでしょうか? 今考えていることは次の二つ(三つ)です。 1.ファイルアクセスを分割して負荷を下げる。 2.何らかの方法でスレッドの優先順位を下げる。 (3.ファイルアクセス自体の負荷を下げる???) 1が一番現実的かと思っています。 2の方法はプロセスの優先度を下げるソフトを目にしたことがあったので 思いついたのですが、そのような関数が今のところ見当たりません。 3は、そういうものがあるのだろうか?というレベルです。 もしあったら積極的に使いたいと思います。 できたら2の方法で解決したいと思っております。 これに関して何かご存知の方がいらっしゃいましたら、ご教授よろしくお願いします。 VC9+XP sp3にてプログラミングを行っております。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
どんなにあがいてもアクセス時間がゼロになることはありませんが、 チューニングするならば、「正しく原因を特定してから」にしないと無駄骨になります。 (「処理時間の8割は処理の2割が使う」等といわれますが、この2割を見直さないと効果が出ません) もしタスクマネージャなどで判断しようとしているなら?、 まずちゃんと、プロファイリングしてみた方がいいと思います。 例えば、優先度を下げれば他の処理があればそちらを優先しますが、 逆に言えば他の処理が行われない間はそのスレッドの処理が続きます。 一方、無理矢理Sleepすれば見た目のCPU処理時間は減りますが、 空き時間が増え完了に時間がかかりますから、この点では効率よくありません。 > 2.何らかの方法でスレッドの優先順位を下げる。 APIは以下です。「優先度」がどういうものか、MSDN等でよく調べてから使ってください。 ・SetThreadPriority ・SetPriorityClass > (3.ファイルアクセス自体の負荷を下げる???) CPUよりメモリの方が影響してる可能性もあると思います。 少なくとも、「アクセス頻度」「アクセス量」が減ることは意味がありますから、 データ構造を見直して/アルゴリズムを変えてサイズを減らすとか、 アクセス頻度を落とすとかを考えるのはいいことだと思います。 > 現在バックグラウンドでファイルアクセスを行うプログラムを組んでおります。 前提としては「別スレッドで」という理解でよいですか。 状況が分からないため確認ですが、「その他の処理」が自分のアプリのことなら、 メッセージ処理を阻害するような(※)実装で遅くなってたりしませんか。 ※メッセージの応答を即座に返さないとか、長いループしてるとか…。 > この問題を解決しようとファイルアクセスの合間にSleepを挟みましたが ファイルアクセスとその他の処理を同じスレッドで実施していたら Sleepでその他の処理も中断されますから、 Sleepを入れたのはファイルアクセス用のスレッドということでよいですか?
その他の回答 (1)
- zwi
- ベストアンサー率56% (730/1282)
単に遅くなっても良いのなら、ファイルを細かい単位で分割読みしてSleepを入れればCPU負荷は確実に下がります。sleepを入れる場合は最低限十数ミリ秒は入れないと効果が出ないと思いますのでかなり遅くなります。 そういう意味ではアクセスを減らす工夫、アルゴリズムの見直しが出来るなら見直したほうが良いと思います。 あと、ファイルのオープンは遅いのでファイル数が異常に多い場合は扱うファイル数を減らす工夫が有効です。
補足
>ファイルを細かい単位で分割読みしてSleepを入れればCPU負荷は >確実に下がります。sleepを入れる場合は最低限十数ミリ秒は入れない >と効果が出ないと思いますのでかなり遅くなります。 アドバイスありがとうございます。 やはりそうする方法が一番シンプルですよね。 ただ アクセスしている⇔してない の切り替えで本スレッドが 急に軽くなったり重くなったりするのは問題だったので今回は その方法の採用を見送りました。 >あと、ファイルのオープンは遅いのでファイル数が異常に多い場合は >扱うファイル数を減らす工夫が有効です。 質問文には書いていなかったのですが、複数のファイルを一つの大きい ファイルにアーカイブしたものに対して仮想的に一つ一つのファイルに アクセスしているような状態です。のでファイルオープン自体はかなり 少ないです。 報告ですが、#1さんが教えてくださいましたスレッド自体の優先度を 下げる方法で、とりあえず気にならないレベルにまで落ち着きました。
お礼
返答ありがとうございます。 まずは、SetThreadPriority、SetPriorityClassを使ってみますね。 (そのままの名前ですね。調査不足でした。すいません。)
補足
>前提としては「別スレッドで」という理解でよいですか。 >状況が分からないため確認ですが、「その他の処理」が自分のアプリのことなら、 >メッセージ処理を阻害するような(※)実装で遅くなってたりしませんか。 >※メッセージの応答を即座に返さないとか、長いループしてるとか…。 まずファイルアクセスは別スレッドになります。 また、メッセージ処理など本スレッドとの関り合いも一切ありません。 (やっているつもりは無いのですが、今一度確認してみようと思います。) >Sleepを入れたのはファイルアクセス用のスレッドということでよいですか? はい。Sleepを入れているのは、ファイルアクセス用のスレッドです。