4

5000 個のアイテムを処理する長時間 (5 ~ 10 時間) の Mac アプリを使用しています。各項目は、(Saxon を使用して) 多数の変換を実行し、(Python および Racket で) 一連のスクリプトを実行し、データを収集して、一連の XML ファイル、SQLite データベース、および CoreData データベースとしてシリアル化することによって処理されます。各アイテムは、他のすべてのアイテムから完全に独立しています。

要約すると、多くのことを行い、時間がかかり、高度に並列化できるように見えます。

処理が必要なすべてのアイテムをロードした後、アプリは GCD を使用して作業を並列化し、以下を使用しdispatch_applyます。

dispatch_apply(numberOfItems, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
    @autoreleasepool {
        ...
    }
});

12 コア (24 仮想) の Mac Pro でアプリを実行しています。したがって、常に 24 個のアイテムが処理されると予想されます。ただし、処理されるアイテムの数が 8 から 24 の間で変動することをログで確認しました。これは、実行時間に文字通り時間を追加します (一度に 24 のアイテムを処理できると仮定します)。

一方では、おそらく GCD は非常にスマートで、すでに最大のスループットを実現しています。しかし、このアプリによって生成されたスクリプトで多くの作業が行われるため、GCD が不完全な情報から推論し、最善の決定を下していないのではないかと心配しています。

パフォーマンスを向上させる方法はありますか? 正しさの次に望ましい属性の 1 つは、このアプリの実行にかかる時間を短縮することです。消費電力や Mac Pro の占有率など、私は気にしません。

更新:実際、これはドキュメントで憂慮すべきことのように見えます。利用可能なコアの数、他のプロセスによって実行されている作業量、および他のシリアル ディスパッチ キュー内のタスクの数と優先度を含む、同時キュー。」(強調追加) 他のプロセスが動作していると、アプリのスケジューリングに悪影響が及ぶようです。

「これらのブロックをコアごとに 1 つずつ同時に実行し、よりスマートに実行しようとしないでください」とだけ言えるとよいでしょう。

4

1 に答える 1