「動かぬパターンは、パターンData.Maybe.Just bのに失敗しました」I以下の機能を持っている:抑制のランタイムエラーが
PSQがある場合、問題は「ただ」ちょうど空のPSQとして作成されていることを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)
一致することができず、実行時に反駁できないパターンエラーを返します。明らかにキューは後で埋められ、ジャストbは常に一致するので、これは正確に1回発生します。
私は、キューが空であるかどうかをテストしてから、それを自分の関数で実行しようとしましたが、これですべてが2倍遅くなりました。
これは明らかに傷つきませんので、このエラーは何らかの形で抑止できますか?コンパイラオプションを使用するか、例外をキャッチして無視する必要があります(余分な時間がかかるかもしれません)。
***気になることがありますか***気をつけて***かもしれない余分な時間。正しい、チェックされたコードを書いて、それをプロファイルする。チェックがコードを遅くしている場合は、それを処理します。早期最適化はすべての悪の根源です。 – rampion
私はあなたが失敗したパターンマッチが傷つけることができない方法についてもっと説明する必要があると思います。たとえば、 'loopMyQ'は(別のコメントで述べたように)' forkIO'を使ってスレッド内で開始され、例外がスローされたときにスレッドが消滅しても大丈夫だと言えるでしょう。私は、他のソリューションで見られる減速が、ここで起こっていることよりも他のスレッドがやっていることと関係があるという疑いがあります。 –
@ rampion、benmachineありがとうございます、あなたのコメントは私を正しい道に導きました。プロファイリングを通して、loopMyQの永遠のループは、CPUができるように頻繁に実行され、200msごとにいくつかのアクションを実行したことがわかりました。私にとっては200msごとに実行するだけで十分であり、必要な場合は何らかのアクションを実行することができました。 –