嗯...找到一种方法来更快地读取/写入数据,以便使用 F#来解决此问题(https://www.spoj.pl/problems/INTEST/),这是一种挑战。
我的代码(http://paste.ubuntu.com/548748/)获得了TLE ...
如何加快数据阅读速度?
答案 0 :(得分:4)
我的这个版本通过了时间限制(但仍然非常慢~14秒):
open System
open System.IO
// need to change standard buffer, not to add an additional one
let stream = new StreamReader(Console.OpenStandardInput(4096))
let stdin = Seq.unfold (fun s -> if s = null then None else Some (s,stream.ReadLine())) <| stream.ReadLine()
let inline s2i (s : string) = Array.fold (fun a d -> a*10u + (uint32 d - uint32 '0') ) 0u <| s.ToCharArray()
let calc =
let fl = Seq.head stdin
let [|_;ks|] = fl.Split(' ')
let k = uint32 ks
Seq.fold (fun a s -> if (s2i s) % k = 0u then a+1 else a) 0 <| Seq.skip 1 stdin
printf "%A" calc
虽然这个版本的瓶颈实际上是string -> uint32
转换(标准uint32从字符串转换得更慢),但读取本身在我的样本输入上花费大约2秒(相对于总时间的6秒)(〜 100M文件) - 仍然不是一个好结果。一旦s2i
以命令式方式重写,总的运行时间可以减少到10秒:
let inline s2i (s : string) =
let mutable a = 0u
for i in 0..s.Length-1 do a <- a*10u + uint32 (s.Chars(i)) - uint32 '0'
a
答案 1 :(得分:2)
我实际上并不知道,但我猜想一次读一个字符是不好的,你应该阅读,例如一次4k进缓冲区,然后处理缓冲区。
答案 2 :(得分:1)
let buf =
let raw = System.Console.OpenStandardInput()
let bytebuf = new System.IO.BufferedStream(raw)
new System.IO.StreamReader(bytebuf)
buf.Read() // retrieves a single character as an int from the buffer
buf.ReadLine() // retrieves a whole line from the buffer