Excel VBAプログラムは25%の速度でのみ実行


5

クアッドコアのAcer Aspire S3 UltrabookでVBAプログラムを実行しています。問題は、CPUの25%しか使用しないことです(他のプロセスを組み合わせて使用​​すると、〜1%使用されます)。ラップトップはWindows 8.0を実行します。 Excel版は2013(32ビット)です。システムRAMの55%しか使用されておらず、Excelでは55%の半分が使用されています。

たった25%しか使われていないと思いますが、Excelでは1つのコアしか使われていません。しかし、この理論を裏付けるものは何もありません。プログラムをスピードアップする方法

ありがとう。



4
Excel / VBAのようなサウンドは、あなたのプログラムにとって最良のプラットフォームではないかもしれません。
Ƭᴇcʜιᴇ007

2
実行時間が心配な場合は、計算ロジックを別のプラットフォームに移植することをお勧めします。私は(Excel 03)VBAからC#への非常に計算集約的なコードを移植する〜1000倍のスピードアップを達成しました:〜4時間vs〜15秒。どちらの場合も同じアルゴリズム。 VBAは、毎回セルを読み取る代わりに値を変数にキャッシュし、計算中にセルが変更されるたびにスプレッドシートの画面上での更新を無効にすることで、単純な実装よりも5〜10倍高速化しました。
Dan Neely

5
VBAをゆっくり動かすのは簡単です - しかし、それをもっと速くするための多くのトリックがあります。すべてのコアを使用できれば4倍のスピードアップが得られます - しかし、数行のコードを変更するだけで100倍のスピードアップが起こる可能性があります。おそらくあなたは、プログラムが時間を費やしていると思う場所を示すことができます - 私たちはあなたがそれをスピードアップするのを助けることができるかもしれません。例:最も使用されている変数を Double または Long (VBAに選択させる代わりに Variant 宣言がない)それは大きな違いを生むことができます...
Floris

1
25%しか使用していないことを示しているのは、データ書き込みに関するプログラミングエラーのようです。

回答:


6

私はあなたが使おうとしているプログラムがシングルスレッドであるように聞こえます。これをスピードアップする具体的な方法は、シングルコアクロック速度が速いプロセッサを購入するか、マルチスレッドをサポートするプログラムを使用する以外には実際にはありません。


答えてくれてありがとう。 64ビット版のExcelを入手する場合、それはすべてのコアで機能しますか?再度、感謝します。
tropical

4
@tropicalいいえ。64ビットに切り替えると、プロセスが4 GBを超えるメモリを使用できるようになりますが、それ以上のコアで実行することはできません。
Keltari

11

以下のすべてがExcel 2007以前に適用されます。による リンク 上記のコメントを投稿しましたが、Excel 2013でのマルチスレッドのネイティブサポートがあります。

残念ながら、VBAはマルチスレッドをサポートしていないため、VBAの計算はプロセッサの1コアに制限されます。

ただし、VBスクリプトファイルを生成してそれらを同時に実行することによって、VBAをトリックして複数のスレッドを実行するようにする高度な方法があります。これは、Excelプロセスの外部でコードを実行することで問題を回避し、Windowsがさまざまなスレッドに割り当てられたリソースを管理できるようにします。

そうは言っても、これを機能させることはあなたのコードのロジックを完全に再考することをおそらく意味するでしょう(すなわち、それらを並行して実行するのに意味がある方法でタスクを分割する方法を考え出す必要があるでしょう)。あなたのプロジェクトには非常にうまくいきません。私はこれを自分で実装したことは一度もないので、私がすでにあなたに言ったことを言うことによってあなたをこれ以上助けることはできません。

あなたがウサギの穴に足を踏み入れたいのであれば、ただし、ここでは 面白いブログ記事 それが行われている例を示しています。警告:あなたが熟練したプログラマーでない限り、あなたはこの考えを忘れてVBAがシングルスレッドで動くことを受け入れるかもしれません。

大胆な人のためのスタックオーバーフローに関するその他のリソース:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668

もちろん、マルチスレッドを使わずにVBAコードを最適化する方法は他にもあります。あなたのコードを見なくても、鋭い提案をすることは不可能ですが、ここではふつうの疑いがいくつかあります。

  • 処理速度を上げるために、シートからデータを配列にロードしてください。ワークシートとのやり取りはVBAの実行における大きなボトルネックであり、配列を操作することで最小限に抑えることができます。
  • 関連する問題は、セルに変更が加えられるたびにExcelがブックを再計算することです。これを設定することで回避できます Application.Calculation = xlManual。必ず元に戻してください。 Application.Calculation = xlAutomatic あなたの潜水艦を出る前に。

また、処理中にUIをロックするようにUIスレッド上で実行されると思います(これは、カスタムフォーマットにUDFを使用した場合に顕著になります)。
Casey

アプリケーションをより良い言語(VB.NETとC#はどちらもVBAよりも優れている)で書くことができるのに、なぜこの狂気に自分自身を傷つけたくなるのでしょうか。同時性、そしてそれでもOffice PIAを介してExcelと対話することができますか?
Matteo Italia

2

他の人が言ったように、ネイティブVBAはマルチスレッドではありません。スピードを上げたい場合は、ユーザー定義関数(UDF)を別の言語で書くことを検討してください。

私はあなたにExcelDNAとC#かVB.Netを使うことを勧めます。 C#の書き方をすでに知っていて、UDF内でマルチスレッドを制御できるのであれば、それらは非常に使いやすいです。

http://exceldna.codeplex.com/


1
あなたがこれをしたいと思うほとんどの場合、あなたはすべきです 本当に Excelがその仕事に適したツールであるかどうかを考えてください。ハンマーと釘...
sapi

ファイナンスでは、Excelが最良の解決策ではなくまともな解決策である場合が多く、トレーダーはモンテカルロシミュレーションまたはリスクシミュレーションを実行しなければならないことが多くあります。これらはマルチスレッドから大きな恩恵を受けます。適切なインフラストラクチャを構築することもできますが、複雑なインフラストラクチャを構築するためのリソースがないため、ほとんどの小規模な組織ではExcelアドインを構築しています。
BlueTrin

2

免責事項: これは適切な答えではありませんが、1つのコアのみの使用に関して他の答えと一緒にこの種の問題を見つける必要があるユーザーがたくさんいることに気付きました。

あなたのVBAスクリプトがコアを1つだけ使用しているように見えます、そしてそれは非常に良いことかもしれません!

他の人がすでに良い答えを述べているように、私はあなたが適切な解決策を見つけるのを助けるためにこの質問に対する他の側面を知ることが重要であると思います。それではどのようにあなたはプログラムをスピードアップしますか?

  • システム概要におけるCPU使用率が100%であっても、プログラムができる限り速くなるわけではありません。 :役に立たないことがたくさんあるかもしれません、 'VBAをスピードアップするための最適化'を検索してみてください。どんな良い検索エンジンでもStack Exchange networkからここにいくつかの役に立つ答えをあなたに与えるでしょう。 CPU使用量ではなく、計算に費やした時間を求めます。
  • ExcelでのVBAは、仕事を終わらせるのに必ずしも最善のツールではありません :長時間実行する数値計算の計算では、プログラミングのスキルによっては、Excelからデータをエクスポートして他のプラットフォームを使用すると便利な場合があります。から選ぶべき非常に多くがあります、いくつかはマイクロソフトのプラットフォームとうまく統合し、かなり良い 達成可能 パフォーマンス( 無駄なことをする ここでも適用されます)。
  • 100%CPUを実行しても、25%しか実行していない場合と比べて4倍の速度向上は見込めないでしょう。 :計算をどの程度うまく分割できたかによって、4コアでわずか2倍のブーストを達成できます。しかし同様に行くケースがあります ほとんど 4コアを4倍にする - たとえば、各行で実行される計算がスプレッドシート内の他のデータから完全に独立している場合などです。見る アムダールの法則 ウィキペディアで。
  • それ以上のコアを使用しようとしても価値がないかもしれません :場合によっては便利かもしれませんが、計算に複数のコアを使用することは非常に困難な作業になる可能性があり(通常はプログラミング技術の専門知識が必要です) この質問 一般的な概要については)。
  • ボーナス: たぶんあなたはあなたのプログラムを全くスピードアップする必要はありません。 たとえば、計算に3分かかり、1日に1回しか実行しない場合は、椅子から少し立ち上がって硬い骨を伸ばしてみませんか。 2分30分でプログラムを実行できるようにプログラムを微調整するのに費やす日数が増えるのです。 非常に ロングラン。良いプログラマーは、それが本当に価値があるときに最適化に時間を費やすだけなので、良いプログラマーからインスピレーションを受けましょう:)

0

上記の他の人が言っているように、スレッド化が答えになるでしょう、しかしそれは実際に実行可能な解決策ではありません、そして64ビットにアップグレードすることはごくわずかな違いを生じるでしょう。あなたがやってみることができる一つのことは、プロセスの優先順位を上げることです、あなたはそれを行う方法を見ることができます ここに

プログラム内の他の場所に別のボトルネック(ディスクからの読み取り/書き込みなど)がある可能性があるため、これによってスクリプトの速度が上がるかどうかを判断するのは困難ですが、少なくともWindowsより優先されます他のプロセス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.