【发布时间】:2011-05-27 12:10:25
【问题描述】:
伙计们,在 Common Lisp (SBCL) 中读取流的最快方法是什么?
对我来说,这就是 read-line。但突然间我遇到了这个函数的性能问题——我应该在 1.5 秒内读取 10kk 个字符(1000 行,每个字符 10000 个字符),但 read-line 未能实现。 Common Lisp 可以吗?是否提供了 C 风格的 scanf() 函数以便快速阅读?
谢谢!
更新。代码:
(defun split (string)
(let ((space-position (position #\Space string)))
(list
(subseq string 0 space-position)
(subseq string (+ space-position 1)))))
(defun solve (line)
(let ((nums (split line))
(first)
(second))
(setq first (parse-integer (car nums)))
(setq second (parse-integer (cadr nums)))
(* first second)))
(defun spoj()
(let ((N (read))
(line))
(dotimes (i N)
(setq line (read-line))
(format t "~d~%" (solve line))))))
(spoj)
【问题讨论】:
-
您的瓶颈很可能是您在
read-line他们之后对字符串所做的事情。您可以发布您正在使用的代码吗? -
我正在使用 SBCL。但看来你是对的。读取流后,应用程序逻辑代码中发生缓慢的事情。实际上,我通过长算术使用 parse-integer 和乘法。所以应用程序读取 1000 对整数(每个人 10^4 位)并打印出每对整数相乘的结果。
标签: common-lisp sbcl