我有以下功能:禁止運行時錯誤「無可辯駁的模式失敗模式Data.Maybe.Just B」
loopMyQ s q m = forever $ do
q' <- atomically $ readTVar q
let Just b = PSQ.findMin q' --irrefutable pattern here in case the queue has just been created
duetime = (PSQ.prio b) + 2.000
now <- getPOSIXTime
when (now > duetime) (transMit2 s now q m)
的問題是,當PSQ有「剛」被創建爲空PSQ正義無法匹配,並在運行時給我一個無可辯駁的模式錯誤。這隻發生一次,因爲顯然後面的隊列被填滿,而且b總是匹配。
我試圖測試隊列是否爲空,然後在我的函數中對其執行操作,但是這使得整個事件運行速度降低了一倍。
由於這顯然不會傷害,所以這個錯誤可以用某種方式抑制,一個編譯器選項,還是我需要捕捉異常,然後忽略它(這也可能需要額外的時間)。
不要擔心***可能會花費額外的時間。編寫正確的,檢查過的代碼並對其進行配置。如果檢查是減慢代碼的速度,那就對其進行處理。不成熟的優化是萬惡之源。 – rampion 2012-03-13 16:56:28
我想你需要解釋更多關於失敗的模式匹配如何不會受到傷害。例如,值得一提的是'loopMyQ'(正如你在另一條評論中所說的那樣)是在'forkIO'的線程內部開始的,假如這個線程在拋出異常的時候死掉了,那麼可以這麼說。我懷疑你在其他解決方案中看到的放緩與你的其他線程在做什麼比在這裏發生的更多。 – 2012-03-14 00:15:09
@rampion,benmachine謝謝,您的評論讓我走上了正確的道路。通過分析發現,loopMyQ中的永久循環運行的頻率與CPU可以做的一樣頻繁,並且每200毫秒執行一次動作。雖然對我來說,只需每200毫秒運行一次,並在需要時採取一些措施。 – 2012-03-14 12:48:42