text: Hello Joel, Tuesday, December 27, 2005, 12:18:54 PM, you wrote: JR> My desired goal is to have 4k bots (threads?) running at the same JR> time. At, say, 1k/s per bot I figure something like 4Mb/s round-trip. no problem. my library handle about 10-15mb/s, and i think that speed can be doubled by using unboxed ints JR> I'm getting delays of 4s+ with just 100-200 bots reading from a file divide and conquer! calc speed of networking, unzipping, unpickling separately. compare these speeds with overall program througput to calc multithreading "expenses" JR> and even less than that in a networked environment. The more bots I JR> run the higher the delays, to the point of frequent delays of 10s+. these delays says nothing about speed. you are mixing two things - your end goal is to make delays short, but your instrument - speeds of different processes and to decide what you need to optimize you must calc these speeds separately. without it, your "optimization" is just random game JR> Each bot is given 5, 15 or 35 seconds to respond by the poker server so you don't need to create complex timer thread machinery, just use 3 threads which proceed requests in FIFO order JR> I spent 3 hard months (barely any weekends, no holidays) polishing my JR> Haskell code. ... wasting your time to speed up code that is slow by design. don't forget that this article was published as FUNCTIONAL pearl, not damn-fast pearl JR> I started the Erlang rewrite at about 3pm this saturday JR> and about 1.5 workdays later I have 80% of what I need. I expect to JR> finish the rest today and will have a good yardstick to measure JR> Haskell against. i think that you will get just the same problems as with Haskell and forced to switch back because it's easier to low-level optimize in Haskell than in Erlang JR> My only requirement is that there be a _single_ spec for pickling and JR> unpickling, i.e. no separate methods. The following is not acceptable JR> to me ;-). say exactly WHY you need this single spec. i know at least 4 solutions, what is the best depends on your exact needs for example, one of these solutions looks like this: instance Binary TableInfo where put_ bh (TableInfo a b c d) = put_ bh (a,b,c,d) get bh = do (a,b,c,d) <- get bh; return (TableInfo a b c d) instance Binary GameType where put_ bh = putWord16 bh . fromEnum get = liftM toEnum . getWord16 .... -- Best regards, Bulat mailto:bulatz at HotPOP.com