这是我计算行数和单词的代码:
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)中的类似程序进行了比较.
为什么这段代码这么慢?可能是什么问题呢?
在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) 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
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,分数被丢弃.
请参阅以下代码:
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()函数,套接字可以正常关闭.我怎么解决这个问题?