簡體   English   中英

使用CPU計時器控制線程來執行兩個單獨的操作是否會導致性能下降?

[英]Will using CPU timer control over threads for two seperate operations cause a decrease in performance?

我正在用C ++編寫一個程序,該程序必須同時運行兩個操作(或至少看起來像是在這樣做)。 我一直讀到線程是對此的最佳解決方案,但是我不太熟悉線程,而是按計划選擇基於毫秒的基於計時器的控制來在操作1和操作2之間來回分配CPU資源。稍后再學習多線程。

我的程序運行正常,但運行緩慢,緩慢且有些斷斷續續。 這可能是由於我使用計時器分配資源的方式嗎? 我在第一個操作中進行光視覺處理,並在第二個操作中更新GUI。

作為參考,我使用的是Intel i3-3110M和4 GB的DDR3 RAM。

一方面,使用計時器而不是線程意味着一次只能使用一個CPU內核。 使用線程,您的兩個任務可以(至少原則上)每個都有自己的核心,因此它們實際上可以同時運行,從而使您潛在的2倍加速。

使用計時器的第二個問題實際上是第一個問題的必然結果:如果timer-event-number-1調用的例程花費的時間比預期完成的時間長,那么必然地,timer-event-number-2調用的例程將不會直到第一個例程返回后才可以啟動,因此它將延遲啟動。 如果通常(或每次)花費比預期更長的時間,則隨着時間的流逝,對每個例程的調用將越來越“落后於計划”。

計時器的第三個問題是知道延遲多長時間。 也許對於視覺處理程序來說很明顯(例如,如果視頻以20fps的速度進入,則您可能希望將例程設置為每50mS執行一次),但是對於邏輯上相互依賴的任務(例如,第二個例程是應該消耗掉第一個例程產生的結果),這浪費了CPU周期,因為CPU可能最終沒有理由在特定時間等待處理數據,而這同樣可能早就處理完了並從中退出。方式。 在這種情況下,通常最好使用某種邏輯觸發機制(例如,在第一個例程返回之前,第二個例程由第一個例程調用,或者在多線程情況下,讓第一個例程發出信號量或喚醒的信號)第二個線程立即向上)。 即使在視頻處理的情況下,通常最好讓第一個例程由接收到視頻幀來觸發,而不是由計時器觸發,因為如果計時器關閉得很晚,那您就浪費了寶貴的處理時間,而如果計時器很早就關閉了,尚無任何視頻幀可供處理。

對於您的特定程序,其性能不佳可能是由於您使用了計時器,或者僅僅是您的例程效率不足,無法在您分配給他們的時間內完成工作它。 我建議在程序分析器下運行程序,找出程序大部分時間都花在哪里,然后研究使程序的這一部分更有效率的方法(然后再次進行測試和分析,然后重復進行,直到您對程序滿意為止)。程序的性能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM