小编vze*_*zex的帖子

为什么这个简单的文本分析程序如此之慢?

这是我计算行数和单词的代码:

import System.IO
import Data.List
main = do
        hSetBinaryMode stdin True
        interact $ (\(w,l)->"line:"++(show l)++"\nwords:"++(show w)++"\n")
                   . foldl' (\(w,l) r-> w `seq` l `seq` (w+length r ,succ l) ) (0,0)
                   . lines
Run Code Online (Sandbox Code Playgroud)

这大约需要10秒才能在大约100兆字节的文件上运行.我将它与Lua(9s),awk(20s)和wc -l -c(0.6s)中的类似程序进行了比较.

为什么这段代码这么慢?可能是什么问题呢?

haskell

8
推荐指数
1
解决办法
553
查看次数

如何使用haskell处理窗口上的信号?

在Windows上有类似System.Posix的东西吗?

我希望下面的代码在Windows上运行,我应该更改吗?

import IO
import Control.Exception hiding (catch)
import Control.Concurrent
import Network
import System.Posix   ---cannot be run on windows.

main = withSocketsDo (installHandler sigPIPE Ignore Nothing >> main')
    --so the signal handler cannot be used

main' = listenOn (PortNumber 9900) >>= acceptConnections

acceptConnections sock = do
        putStrLn "trying to accept" -- debug msg
        conn@(h,host,port) <- accept sock
        print conn -- debug msg
        forkIO $ catch (talk conn `finally` hClose h) (\e -> print e)
        acceptConnections sock

talk conn@(h,_,_) = hGetLine …
Run Code Online (Sandbox Code Playgroud)

haskell signals

6
推荐指数
2
解决办法
907
查看次数

在相同的goroutine中创建的goroutine是否始终按顺序执行?

package main

func main() {
        c:=make(chan int)
        for i:=0; i<=100;i++ {
                i:=i
                go func() {
                        c<-i
                }() 
        }   
        for {
                b:=<-c
                println(b)
                if b==100 {
                        break
                }   
        }   
}
Run Code Online (Sandbox Code Playgroud)

上面的代码创建了100个goroutine来插入num到通道c,所以我只是想知道,这些goroutines会以随机顺序执行吗?在我的测试期间,输出将始终为1到100

go goroutine

3
推荐指数
2
解决办法
489
查看次数

如何以正确的方式将float64数字更改为uint64?

package main

func main() {
    var n float64 = 6161047830682206209
    println(uint64(n))
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

6161047830682206208
Run Code Online (Sandbox Code Playgroud)

看起来当float64改变时uint64,分数被丢弃.

floating-point type-conversion go floating-point-conversion

1
推荐指数
2
解决办法
1978
查看次数

获取File()后golang tcp socket无法关闭

请参阅以下代码:

    package main
    import "net"
    import "log"
    import "bufio"
    import "time"

    func main() {
             l,_:=net.Listen("tcp", ":8888")
             for {
                     conn, _ := l.Accept()
                     log.Println("get conn", conn.RemoteAddr())
                     go func() {
                             f, _:=conn.(*net.TCPConn).File()
                             d:=f.Fd()
                             log.Println(d)
                             f.Close()
                             arr := make([]byte, 1000)
                             reader := bufio.NewReader(conn)
                             time.AfterFunc(3*time.Second, func() {
                                     log.Println("close conn", conn.RemoteAddr())
                                     conn.Close()
                             })
                             for {
                                     size, err := reader.Read(arr)
                                     if err != nil {
                                             break
                                     }
                                     log.Println("sss", arr[:size])
                             }
                     }()
             }
    }

当程序启动时,我使用telnet连接localhost:8888,3秒后,服务器会将我杀掉,但是当我使用netstat监视时套接字状态仍然是ESTABLISHED.如果我删除了File()函数,套接字可以正常关闭.我怎么解决这个问题?

sockets tcp go

0
推荐指数
1
解决办法
1044
查看次数