के साथ खराब प्रदर्शन/लॉकअप मैं एक प्रोग्राम लिख रहा हूं जहां बड़ी संख्या में एजेंट घटनाओं को सुनते हैं और उन पर प्रतिक्रिया करते हैं। Control.Concurrent.Chan.dupChan
के बाद से हटा दिया गया है मैं Tchan के रूप में विज्ञापित उपयोग करने का फैसला।एसटीएम
टीसीएचएन का प्रदर्शन मेरी अपेक्षा से भी बदतर है। मैं निम्नलिखित प्रोग्राम है जो मुद्दे को दर्शाता है:
{-# LANGUAGE BangPatterns #-}
module Main where
import Control.Concurrent.STM
import Control.Concurrent
import System.Random(randomRIO)
import Control.Monad(forever, when)
allCoords :: [(Int,Int)]
allCoords = [(x,y) | x <- [0..99], y <- [0..99]]
randomCoords :: IO (Int,Int)
randomCoords = do
x <- randomRIO (0,99)
y <- randomRIO (0,99)
return (x,y)
main = do
chan <- newTChanIO :: IO (TChan ((Int,Int),Int))
let watcher p = do
chan' <- atomically $ dupTChan chan
forkIO $ forever $ do
[email protected](p',_counter) <- atomically $ readTChan chan'
when (p == p') (print r)
return()
mapM_ watcher allCoords
let go !cnt = do
xy <- randomCoords
atomically $ writeTChan chan (xy,cnt)
go (cnt+1)
go 1
जब संकलित (-O) और इस तरह कार्यक्रम पहले इच्छा उत्पादन कुछ चलाएँ:
./tchantest ((0,25),341) ((0,33),523) ((0,33),654) ((0,35),196) ((0,48),181) ((0,48),446) ((1,15),676) ((1,50),260) ((1,78),561) ((2,30),622) ((2,38),383) ((2,41),365) ((2,50),596) ((2,57),194) ((3,19),259) ((3,27),344) ((3,33),65) ((3,37),124) ((3,49),109) ((3,72),91) ((3,87),637) ((3,96),14) ((4,0),34) ((4,17),390) ((4,73),381) ((4,74),217) ((4,78),150) ((5,7),476) ((5,27),207) ((5,47),197) ((5,49),543) ((5,53),641) ((5,58),175) ((5,70),497) ((5,88),421) ((5,89),617) ((6,0),15) ((6,4),322) ((6,16),661) ((6,18),405) ((6,30),526) ((6,50),183) ((6,61),528) ((7,0),74) ((7,28),479) ((7,66),418) ((7,72),318) ((7,79),101) ((7,84),462) ((7,98),669) ((8,5),126) ((8,64),113) ((8,77),154) ((8,83),265) ((9,4),253) ((9,26),220) ((9,41),255) ((9,63),51) ((9,64),229) ((9,73),621) ((9,76),384) ((9,92),569) ...
और फिर, कुछ बिंदु पर, बंद हो जाएगा कुछ भी लिखना, जबकि अभी भी 100% सीपीयू खपत है।
((20,56),186) ((20,58),558) ((20,68),277) ((20,76),102) ((21,5),396) ((21,7),84)
लॉकअप के साथ-साथ भी तेज है और केवल कुछ मुट्ठी भर के बाद होता है। यह आरटीएस '-एन ध्वज के माध्यम से जो भी कोर उपलब्ध कराया जाएगा, वह भी उपभोग करेगा।
इसके अतिरिक्त प्रदर्शन खराब दिखता है - केवल प्रति सेकंड लगभग 100 ईवेंट संसाधित होते हैं।
क्या यह एसटीएम में एक बग है या क्या मैं एसटीएम के अर्थशास्त्र के बारे में कुछ गलत समझ रहा हूं?
एक चीज जिसे आप गलत समझते हैं वह यह है कि 'चान' एक पाठक को जगाएगा जबकि एसटीएम का 'टीखान' सभी व्यक्तिगत पाठकों के लिए * सभी * पाठकों को जगाएगा। इसके अलावा, नील ब्राउन के जवाब में आपके लिए एक अच्छा सुझाव है। –
यह एसटीएम का अर्थशास्त्र नहीं है जिसे आप गलत समझते हैं, यह कार्यान्वयन है। यह आशावादी लॉकिंग के साथ लागू किया गया है। यह उन मामलों में उचित बनाता है जहां आपके पास कई स्वतंत्र म्यूटेबल सेल हैं और कई लेन-देन जो आमतौर पर अपडेट नहीं करना चाहते हैं-उनमें से गैर-ओवरलैपिंग सबसेट्स। यह उस मामले में बहुत अनुचित बनाता है जहां हर लेनदेन एक ही परिवर्तनीय सेल को छूता है - इस मामले में टीसीएचएन की तरह। – Carl
यहां तक कि जहां भी प्रत्येक लेन-देन एक ही परिवर्तनीय सेल को छूता है, तब तक जब तक पर्याप्त रूप से लिखने वाले लिखते हैं, तब तक आप बहुत अच्छी तरह से कर सकते हैं। – sclv