2013-05-15 32 views
8

Tôi đã lập trình một số GUI MATLAB (không sử dụng GUIDE), chủ yếu để xem hình ảnh và một số thao tác đơn giản khác (chẳng hạn như chọn điểm và vẽ một số dữ liệu từ hình ảnh).MATLAB: GUI dần dần bị chậm hơn

Khi GUI bắt đầu, tất cả các thao tác được thực hiện nhanh chóng. Tuy nhiên, khi GUI được sử dụng (hiển thị các khung khác nhau từ khối lượng 3D/4D và hoàn thiện các thao tác nêu trên), nó bắt đầu chậm dần, đạt đến điểm quá chậm để sử dụng phổ biến.

Tôi muốn nghe một số đầu vào liên quan đến:

  • chiến lược khả thi để tìm hiểu lý do tại sao GUI là nhận được chậm hơn;
  • Thực hành lập trình GUI MATLAB tốt để tránh điều này;
  • Tham chiếu có thể giải quyết những vấn đề này.

Tôi đang sử dụng set/getappdata để lưu biến trong hình chính của GUI và liên lạc giữa các hàm.

(Tôi ước gì tôi có thể cung cấp một ví dụ làm việc tối thiểu, nhưng tôi không nghĩ rằng đó là phù hợp trong trường hợp này bởi vì đây chỉ xảy ra trong GUIs hơi phức tạp hơn.)

Thanks a lot.

EDIT:(Báo cáo về một số kết quả sử dụng các hồ sơ :)

tôi đã sử dụng các hồ sơ trong hai dịp:

  • immediatly sau khi bắt đầu giao diện;
  • sau khi chơi với nó một thời gian, cho đến khi nó bắt đầu quá chậm.

tôi thực hiện các thủ tục chính xác như nhau trong cả hai hoạt động profiling, được chỉ đơn giản là di chuyển chuột xung quanh GUI (cùng "con đường" cả hai lần).

Kết quả hồ sơ như sau:

enter image description here

Tôi gặp khó khăn trong việc giải thích những kết quả ... Tại sao số lượng cuộc gọi của chức năng nhất định (chẳng hạn như impixelinfo) nên lớn hơn trong trường hợp thứ hai?

Mọi ý kiến?

Cảm ơn rất nhiều.

+0

Hãy thử điều này: forceGarbageCollection(). Đây là loại điều liên quan đến java. –

+1

Bạn đã thử theo dõi việc sử dụng bộ nhớ của mình trong khi chạy GUI trong thời gian dài - có thường là rất cao hay không, ví dụ, tăng dần theo thời gian khi GUI chậm lại? Bạn đang sử dụng chỉ MATLAB, hoặc là bạn gọi ra mã Java hoặc MEXed C bất cứ nơi nào? Bạn có sử dụng các biến MATLAB thông thường hay bạn đang sử dụng các đối tượng - và nếu có, chúng có giá trị hoặc xử lý các đối tượng lớp không? –

+0

@SamRoberts: Không, tôi đã không cố gắng theo dõi việc sử dụng bộ nhớ trong khi chạy GUI. Sẽ làm và báo cáo lại. Về các câu hỏi khác, tôi chỉ sử dụng MATLAB và chỉ các biến thông thường. Cảm ơn. – fnery

Trả lời

1

Một chiến lược tốt để tìm hiểu lý do tại sao mọi thứ chậm trong Matlab là sử dụng profiler.Đây là cách cơ bản để sử dụng profiler:

profile on 
% do stuff now that you want to measure 
profile off 
profile viewer 

Tôi khuyên bạn nên lập cấu hình giao diện mới mở và giao diện đã mở trong một thời gian và chậm đáng chú ý. Sau đó so sánh kết quả và tìm kiếm các hàm có sự gia tăng đáng kể trong "Thời gian tự" hoặc "Tổng thời gian" cho các manh mối về những gì gây ra sự chậm lại.

+0

Vâng, tôi thường xuyên sử dụng profiler cho các kịch bản thông thường nhưng sử dụng nó trong một loại GUI gây nhầm lẫn cho tôi vì bản thân người dùng có thể sử dụng một lượng thời gian tốt thay vì mã quan tâm. Điều này có làm cho thời gian ít chính xác hơn không? – fnery

+0

@fnery Tôi * nghĩ * tất cả thời gian rảnh (chờ người dùng đưa ra dữ liệu đầu vào) sẽ được kết hợp với một số chức năng cấp cao nhất mà bạn có thể không quan tâm. Bạn sẽ vẫn nhận được thông tin tốt về các chức năng cấp thấp hơn, nơi sự cố có thể xảy ra. – shoelzer

+2

Tìm thấy một số liên kết hữu ích từ MATLAB Central về vấn đề này: [link1] (http: //blogs.mathworks.com/videos/2013/05/03/tăng tốc-up-người dùng-giao diện-trong-matlab-với-profiler /) và [link2] (http://blogs.mathworks.com/community/2011/06/28/ speed-up-your-guis-với-profiling /). – fnery

2

Cách tốt nhất duy nhất tôi tìm thấy xung quanh vấn đề này được gợi ý ở trên: thu gom rác cưỡng bức. Lời khuyên tuyệt vời mặc dù lệnh forceGarbageCollection không được công nhận trong MATLAB. Lệnh bạn muốn là java.lang.System.gc() ... một con thú như vậy.

Tôi đang làm việc trên một dự án trong đó tôi đang đọc 2 cổng nối tiếp ở 40Hz (sử dụng bộ hẹn giờ) và một NIDAQ ở 1000Hz (sử dụng startBackground()) và vẽ đồ thị tất cả trong thời gian thực. Các hạn chế xử lý song song của MATLAB đảm bảo rằng một trong những quy trình đó sẽ gây ra tình trạng nghẹn bộ đệm tại bất kỳ thời điểm nào. Tôi đã đạt được một số thành công ban đầu bằng cách đảm bảo rằng tôi đã xác định một cốt truyện duy nhất và chỉ cập nhật các thông số đã thay đổi bên trong vòng hoạt ảnh của tôi bằng lệnh set. (Ví dụ figure, subplot(311), axis([...]),hold on, p1 = plot(x1,y1,'erasemode','xor',...); vv sau đó -.>tic, while (toc<8) set(p1,'xdata',x1,'ydata',y1)...

Sử dụng set sẽ làm cho hình ảnh động của bạn nhanh hơn và linh hoạt hơn Tuy nhiên, bạn sẽ vẫn chạy vào tường đệm nếu bạn động đủ dài với quá nhiều đang xảy ra trong nền. - đặc biệt là dữ liệu đầu vào thời gian thực, bộ sưu tập rác là câu trả lời của bạn.Nó không phải là tức thời, do đó bạn không muốn nó thực hiện mọi chu trình vòng lặp trừ khi vòng lặp của bạn cực kỳ dài. trong khi vòng lặp và sử dụng một chức năng mod để nó chỉ thực hiện mỗi chu kỳ 'n' (ví dụ: counter = 0; while()... counter++; if (~mod(counter,n)) java.lang.System.gc(); và cứ thế.

Điều này sẽ giúp bạn tiết kiệm (và hy vọng) tải thời gian và đau đầu, tin tưởng tôi, và bạn sẽ có thực thi MATLAB dữ liệu thời gian thực và hoạt ảnh ngang hàng với LabVIEW.

Các vấn đề liên quan