0

2つのsqliteDBを比較し、json形式でdiffを生成するOSX用のObjective-Cアプリケーションがあります。dbは非常に大きいです(多くのフィールドを持つ10,000アイテム)。このアプリケーションは約55秒で実行される場合があります(CPUの95%を使用)。場合によっては約8分かかります(CPUの12%を使用)。これは同じDBのものです。CPUのごく一部のみを使用している場合は、残りを使用できます。プロセスよりも優先されるものはないようです。コマンドに「nice-20」を追加すると、CPU使用率を確実に取得できるようです。私の質問は

  1. 他に何もCPUを使用していない場合、なぜ私のアプリはそれを利用しないのですか?

  2. これを変更するためにプログラムでできることはありますか?

  3. これを変更するためにOSXにできることはありますか?

4

4 に答える 4

4

質問1:

データベースをディスクから読み込む必要があると思いますが、コードがディスクの読み取りをブロックしているため、CPUを十分に活用していません。Mac OS Xでは、バックグラウンドで実行されているものがたくさんあり、CPU時間をあまり使用しませんが、Spotlightのように多くのディスク読み取りを送信します。

質問2:

ディスクアクセスを最も効率的に使用できるようにする以外は、おそらくそうではありません。

質問3:

ディスクにアクセスしている他のプロセスをすべてシャットダウンします。これには、実際にシャットダウンしてはならない多くのシステムプロセスが含まれているため、Mac OS Xに精通せずに、Darwinで実行する以外に、ここでできることはあまりないと思います。

于 2009-09-15T18:49:35.343 に答える
1

長い場合、IOバウンドのようです。マシンで何か他のことをしていますか?CPUはそれ自体を抑制していません-それは間違いなく何かを待っています。

いくつかの開発者ツールを使用して、実行中にアプリを確認できます。おそらく最も便利なのは、dtrace上にあるGUIである「Instruments」です。最新のXcodeを実行している場合は、これをインストールする必要があります。Sharkを使用することもできます。これは、一見すると多少使いやすくなりますが、長期的には情報量が少なくなります。

于 2009-09-15T18:46:32.697 に答える
1

通常、利用可能なすべてのパフォーマンスが得られます。CPUが100%でない場合は、何かがCPUをブロックしています。データベースの場合、ロックされていることがよくあります。Sharkを使用して、アプリケーションで何が起こっているかを調べます。

于 2009-09-15T18:48:10.993 に答える
1

プログラムがCPUをほとんど使用しない場合、おそらくディスクを待機しているため、特に他のプロセスが同時にディスクにアクセスしている場合。もう1つの可能性は、プログラムがメモリを使いすぎて、OSがスワップスペースを使い始めたことです。

于 2009-09-15T18:49:40.007 に答える