我有一台 8 CPU 3GHz 的 Windows 机器,根据样本数据测试,估计使用 Excel 完成计算需要 16 天。这种性能不可接受(!)。
该计算不使用 Excel 的功能,而基本上是一个调用具有计算器功能的 COM 对象的 VBA 脚本。
计算器进程占用了 25% 的 CPU,Excel 占用了 1%。交换内存似乎没有被使用。由于该进程正在读取和写入文本文件,因此我假设它与 I/O 相关。在计算过程中,I/O 读/写计数不断计数。
安装了病毒检查程序,但并未主动检查。即计算期间 CPU 为 0%。
到目前为止最好的建议是使用 RAM 磁盘。
您能否建议调查性能瓶颈的其他途径?
[之后...]
非常感谢以下建议。基本上,计算器进程是一个专门的金融计算器,但正如下面提到的,瓶颈似乎是通过 COM 使用它。这种方法正在删除计算器提供的所有多线程功能,这也可以作为 Web 服务来处理。
所涉及的实际场景是使用此新计算器每三年更新一次财务表。不幸的是,在计划的早期阶段没有预留足够的时间进行性能评估,因此导致对性能问题的调查紧迫。由于此计算不是定期进行的,因此不需要设置针对速度进行优化的环境。
放弃 Excel 并向 Calcualtor 编写多线程调度程序的正确解决方案显而易见,但我们目前正在寻找一些解决方法,以便在合理的时间内完成计算。
答案1
您使用了 25% 的 CPU,因为 COM 对象是单线程的,不使用 CPU 的其他核心。如果不修改 COM 对象代码,您就无法提高计算性能。
对不起。
答案2
答案3
要做的一件事可能是找到一种更好的方法来实现您的软件,使用更适合性能计算的工具,甚至使用特定于您的问题领域的语言/框架。有很多工具可供选择,例如 Mathematica、SAS、R 等等。此外,您应该尽可能地并行化它。
另外,尽量避免使用磁盘。如果要使用磁盘,除了 RAM 磁盘之外,还应考虑使用高性能 RAID 阵列,如 RAID 10,或者更好的是由 SSD 组成的 RAID 10。
您应该在进程运行时对其进行分析,看看系统时间和用户时间各占多少。我敢打赌,执行所有磁盘 I/O 所需的系统调用占用了大量的执行时间。摆脱它吧。
答案4
正如其他人提到的,您应该研究将处理从 Excel 中移出。VBA 和 COM 对象在执行大量来回操作时效率不高。
我个人倾向于将数据发送到 SQL 服务器并在那里编写查询。您的查询/程序可以执行计算并使用外部连接将输出提供给 Excel。
RDBMS 解决方案可以非常高效地完成一些我做梦都想不到在 Excel 或 VBA 中做的事情,并且可以轻松处理多 GB 数据库和尽可能多的线程。