Chương trình VBA Excel chỉ chạy ở tốc độ 25%


5

Tôi có một chương trình VBA chạy trên Ultrabook Acer Aspire S3 lõi tứ của tôi. Vấn đề là, nó chỉ sử dụng 25% CPU (các quá trình khác kết hợp sử dụng ~ 1%). Máy tính xách tay chạy Windows 8.0. Phiên bản Excel là 2013 (32-bit). Chỉ 55% RAM hệ thống được sử dụng, với Excel sử dụng một nửa trong số 55%.

Tôi nghĩ có lẽ chỉ 25% được sử dụng vì chỉ có một lõi được sử dụng bởi Excel. Tuy nhiên, tôi không có gì để ủng hộ lý thuyết này. Làm thế nào để tôi tăng tốc chương trình?

Cảm ơn.



4
Âm thanh như Excel / VBA có thể không phải là nền tảng tốt nhất cho chương trình của bạn.
Ƭᴇcʜιᴇ007

2
Nếu bạn lo lắng về thời gian chạy, chuyển logic tính toán của bạn sang nền tảng khác sẽ là một ý tưởng rất tốt. Tôi đã đạt được tốc độ tăng tốc ~ 1000 lần khi chuyển một số mã rất chuyên sâu tính toán từ (Excel 03) VBA sang C #: ~ 4 giờ so với ~ 15 giây. Thuật toán giống nhau trong cả hai trường hợp; và VBA đã tăng tốc 5-10 lần so với việc triển khai ngây thơ bằng cách lưu các giá trị vào các biến thay vì đọc ô mỗi lần và vô hiệu hóa làm mới bảng tính trên màn hình mỗi khi một ô được thay đổi trong quá trình tính toán.
Dan Neely

5
Thật dễ dàng để làm cho VBA chạy chậm - nhưng có nhiều thủ thuật để làm cho nó nhanh hơn nhiều, ngay cả trong một lõi. Bạn có thể nhận được tăng tốc gấp 4 lần nếu bạn có thể sử dụng tất cả các lõi - nhưng có thể có một tốc độ tăng gấp 100 lần chỉ chờ để xảy ra bằng cách thay đổi một vài dòng mã. Có lẽ bạn có thể chỉ ra nơi bạn nghĩ rằng chương trình đang dành thời gian - chúng tôi có thể giúp bạn tăng tốc chương trình. Ví dụ: khai báo các biến được sử dụng nhiều nhất là Doublehoặc Long(thay vì để VBA chọn Variantvắng mặt khai báo). Nó có thể tạo ra sự khác biệt lớn ...
Floris

1
Uh cái gì và ở đâu nó nói với bạn rằng bạn chỉ đang sử dụng 25% điều này nghe có vẻ như là một lỗi lập trình liên quan đến việc ghi dữ liệu

Câu trả lời:


6

Tôi nghe có vẻ như chương trình bạn đang cố sử dụng là một luồng, có nghĩa là nó chỉ có thể sử dụng một lõi duy nhất, nó không biết các chương trình khác tồn tại. Thực sự không có cách nào cụ thể để tăng tốc độ này ngoại trừ mua bộ xử lý có tốc độ xung nhịp đơn nhanh hơn hoặc sử dụng chương trình hỗ trợ đa luồng.


Cảm ơn bạn đã trả lời. Nếu tôi có phiên bản Excel 64 bit, nó có hoạt động trên tất cả các lõi không? Cảm ơn một lần nữa.
nhiệt đới

4
@tropical Số Chuyển sang 64 bit sẽ cho phép quá trình sử dụng hơn 4gb bộ nhớ, tuy nhiên nó sẽ không cho phép nó chạy trên nhiều lõi hơn.
Keltari

11

Mọi thứ bên dưới áp dụng cho Excel 2007 trở về trước. Theo liên kết @ Ƭᴇcʜιᴇ007 được đăng trong các bình luận ở trên, có một số hỗ trợ riêng cho đa luồng trong Excel 2013. Điều đó nói rằng, cảnh báo chỉ cần quên nó trừ khi bạn là một lập trình viên có kinh nghiệm vẫn áp dụng.

Thật không may, VBA không hỗ trợ đa luồng, vì vậy các tính toán VBA của bạn sẽ bị giới hạn ở một lõi của bộ xử lý.

Tuy nhiên, có một phương pháp tiên tiến để lừa VBA chạy nhiều luồng bằng cách tạo các tệp VBscript và thực hiện chúng đồng thời. Điều này giải quyết vấn đề bằng cách chạy mã của bạn bên ngoài quy trình Excel và cho phép Windows quản lý các tài nguyên được phân bổ cho các luồng khác nhau.

Điều đó nói rằng, làm cho điều này hoạt động nhiều khả năng có nghĩa là hoàn toàn xem xét lại logic của mã của bạn (nghĩa là bạn sẽ phải tìm ra cách phân chia các nhiệm vụ theo cách hợp lý để chúng chạy đồng thời), có thể rất tốt là không khả thi cho dự án của bạn. Tôi chưa bao giờ tự mình thực hiện điều này, vì vậy tôi thực sự không thể giúp bạn điều này hơn là nói với bạn những gì tôi đã nói với bạn.

Tuy nhiên, nếu bạn muốn bước vào hố thỏ, đây là một bài đăng blog thú vị cho thấy một ví dụ về việc này đang được thực hiện. Được cảnh báo: trừ khi bạn là một lập trình viên thành đạt, bạn cũng có thể quên ý tưởng này và chỉ chấp nhận rằng VBA chạy trong một luồng duy nhất.

Các tài nguyên khác trên Stack Overflow cho sự táo bạo:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668

Tất nhiên có nhiều cách khác để tối ưu hóa mã VBA của bạn mà không cần sử dụng nhiều luồng. Không nhìn thấy mã của bạn, không thể đưa ra đề xuất nhọn, nhưng đây là một vài nghi phạm thông thường:

  • Tải dữ liệu từ trang tính của bạn vào một mảng để xử lý nhanh hơn. Tương tác với bảng tính là một nút cổ chai lớn trong thực thi VBA và chúng có thể được giảm thiểu bằng cách làm việc với các mảng.
  • Một vấn đề liên quan là Excel tính toán lại sổ làm việc sau mỗi thay đổi được thực hiện cho một ô. Điều này có thể tránh được bằng cách thiết lập Application.Calculation = xlManual. Chỉ cần chắc chắn để đặt lại Application.Calculation = xlAutomatictrước khi thoát Sub.

Ngoài ra, tôi tin rằng nó chạy trên luồng UI để nó khóa UI trong khi xử lý (điều này đáng chú ý nếu bạn thử và sử dụng UDF để định dạng tùy chỉnh).
Casey

Tại sao bạn muốn làm tổn thương bản thân với sự điên rồ này khi bạn có thể viết ứng dụng của mình theo cách tốt hơn (cả VB.NET và C # đều tốt hơn VBA), mà bản thân nó chạy nhanh hơn (biên dịch JIT so với giải thích), thực sự hỗ trợ đồng thời và vẫn có thể tương tác với Excel thông qua PIA Office?
Matteo Italia

2

Giống như những người khác đã nói, VBA vốn không phải là đa luồng. Nếu bạn muốn tăng tốc, bạn có thể muốn xem xét việc viết các hàm do người dùng xác định (UDF) bằng ngôn ngữ khác.

Tôi muốn giới thiệu bạn ExcelDNA và sử dụng C # hoặc VB.Net. Chúng rất dễ sử dụng nếu bạn đã biết cách viết một số C # và bạn có thể kiểm soát đa luồng trong UDF.

http://exceldna.codeplex.com/


1
Trong hầu hết các trường hợp bạn muốn làm điều này, bạn thực sự nên suy nghĩ về việc liệu Excel có phải là công cụ phù hợp cho công việc hay không. Búa và đinh ...
sapi

Ngoài ra tôi đồng ý với bạn, trong Tài chính có nhiều trường hợp Excel không phải là giải pháp tốt nhất mà là một giải pháp hợp lý, đôi khi các nhà giao dịch phải chạy mô phỏng Monte-Carlo hoặc mô phỏng rủi ro. Những lợi ích rất lớn từ đa luồng. Tất nhiên, bạn có thể xây dựng một cơ sở hạ tầng phù hợp, nhưng hầu hết các tổ chức nhỏ hơn xây dựng các bổ trợ Excel vì họ không có tài nguyên để xây dựng cơ sở hạ tầng phức tạp.
BlueTrin

2

Tuyên bố miễn trừ trách nhiệm: đây không phải là một câu trả lời thích hợp nhưng tôi thấy có nhiều người dùng cần tìm loại này cùng với các câu trả lời khác liên quan đến việc sử dụng chỉ một lõi và danh tiếng của tôi quá thấp để đăng nó dưới dạng nhận xét.

Có vẻ như tập lệnh VBA của bạn chỉ sử dụng một lõi và đó rất có thể là một điều tốt!

Như những người khác đã đề cập trong câu trả lời đã tốt, tôi nghĩ điều quan trọng là phải biết các khía cạnh khác cho câu hỏi này để giúp bạn tìm ra giải pháp phù hợp. Vậy làm thế nào để bạn tăng tốc chương trình?

  • Việc sử dụng CPU 100% trong tổng quan hệ thống không có nghĩa là chương trình của bạn diễn ra nhanh nhất có thể : có thể có nhiều việc vô ích đang được thực hiện, hãy thử tìm kiếm 'Tối ưu hóa VBA cho tốc độ'. Bất kỳ công cụ tìm kiếm tốt nào cũng sẽ cung cấp cho bạn một số câu trả lời hữu ích ở đây từ mạng Stack Exchange. Dành thời gian cho việc tính toán và không sử dụng CPU.
  • VBA trong Excel không nhất thiết là công cụ tốt nhất để hoàn thành công việc : đối với các phép tính số nhanh trong thời gian dài, có thể hữu ích để xuất dữ liệu từ excel và sử dụng một số nền tảng khác, tùy thuộc vào kỹ năng lập trình của bạn. Có rất nhiều lựa chọn, một số tích hợp độc đáo với nền tảng của Microsoft và có hiệu suất có thể đạt được tốt hơn đáng kể (những việc vô dụng cũng được áp dụng ở đây).
  • Chạy CPU 100% có thể sẽ không giúp bạn tăng tốc độ gấp 4 lần so với chỉ chạy 25% : tùy thuộc vào mức độ bạn chia nhỏ tính toán của mình, bạn có thể đạt được mức tăng gấp 2 lần trên 4 lõi. Nhưng có những trường hợp tăng gần gấp 4 lần trên 4 lõi - ví dụ, nếu việc tính toán được thực hiện trên mỗi dòng hoàn toàn độc lập với bất kỳ dữ liệu nào khác trong bảng tính của bạn. Xem luật của Amdahl trên Wikipedia.
  • Có thể không đáng để thử sử dụng nhiều lõi hơn : mặc dù trong một số trường hợp, nó có thể hữu ích, việc tính toán của bạn sử dụng nhiều hơn một lõi có thể (và thường là) một nhiệm vụ khó khăn hơn, đòi hỏi phải có chuyên môn kỹ lưỡng trong kỹ thuật lập trình (xem câu hỏi này để biết tổng quan).
  • Phần thưởng: Có lẽ bạn không cần phải tăng tốc chương trình của mình. Nếu tính toán mất ba phút và bạn chỉ chạy nó một lần một ngày, tại sao không đứng lên khỏi ghế một chút và kéo căng xương cứng? Bạn đang mạo hiểm dành nhiều ngày để điều chỉnh chương trình của mình để có thể chạy nó trong hai phút ba mươi, chỉ trả hết trong một thời gian rất dài. Một lập trình viên giỏi chỉ dành thời gian của mình để tối ưu hóa khi nó thực sự có giá trị, vì vậy hãy để bản thân được truyền cảm hứng bởi các lập trình viên giỏi :)

0

Giống như những người khác đã nói ở trên, xâu chuỗi sẽ là câu trả lời, nhưng nó không thực sự là một giải pháp khả thi và việc nâng cấp lên 64 bit sẽ tạo ra sự khác biệt không đáng kể. Một điều bạn có thể thử làm là tăng mức độ ưu tiên của quy trình, bạn có thể xem cách thực hiện điều đó tại đây .

Thật khó để nói liệu điều đó có làm cho kịch bản của bạn nhanh hơn hay không, vì có thể có một nút cổ chai khác ở nơi khác trong chương trình (ví dụ: đọc / ghi từ đĩa), nhưng ít nhất nó sẽ cho Windows biết đó là ưu tiên cao hơn so với của bạn các quá trình khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.