Common lisp CommonLisp:读取流的最快方法
各位,在CommonLisp(SBCL)中读取流的最快方法是什么 对我来说,那就是读一行。但突然间,我遇到了这个函数的性能问题——我应该在1.5秒内读取10kk字符(1000行,每行10000个字符),但读取行未能实现。使用公共Lisp是否可能?它是否提供用于快速读取的C-stylescanf()功能 谢谢 更新。守则:Common lisp CommonLisp:读取流的最快方法,common-lisp,sbcl,Common Lisp,Sbcl,各位,在CommonLisp(SBCL)中读取流的最快方法是什么 对我来说,那就是读一行。但突然间,我遇到了这个函数的性能问题——我应该在1.5秒内读取10kk字符(1000行,每行10000个字符),但读取行未能实现。使用公共Lisp是否可能?它是否提供用于快速读取的C-stylescanf()功能 谢谢 更新。守则: (defun split (string) (let ((space-position (position #\Space string))) (list
(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)
面向文本的I/O的性能在不同的实现之间可能有很大的差异,帮助提高一个实现的性能的策略可能不适用于另一个实现。您正在使用什么实现 是否保证线路长度相同
值得一提的是,我尝试了您的练习(1000行,每行10000个字符),在SBCL中读取大约需要0.25秒。面向文本的I/O的性能在不同的实现之间可能会有很大差异,帮助提高一个实现的性能的策略可能不适用于另一个实现。您正在使用什么实现 是否保证线路长度相同
值得一提的是,我尝试了您的练习(1000行,每行10000个字符),在SBCL中读取大约需要0.25秒。如果不分析,就不可能准确地知道瓶颈在哪里,但我猜
拆分和解决会让您速度变慢。具体地说,当您对字符串调用subseq
来拆分它时,您最终会分配两个新字符串。由于parse integer
可以将开始索引和结束索引放入字符串中,因此无需进行拆分:
(let* ((space-position (position #\Space string))
(first (parse-integer string :end space-position))
(second (parse-integer string :start (1+ space-position)))
(* first second))
如果不进行分析,就不可能准确地知道瓶颈在哪里,但我的猜测是split
和solve
正在拖慢您的速度。具体地说,当您对字符串调用subseq
来拆分它时,您最终会分配两个新字符串。由于parse integer
可以将开始索引和结束索引放入字符串中,因此无需进行拆分:
(let* ((space-position (position #\Space string))
(first (parse-integer string :end space-position))
(second (parse-integer string :start (1+ space-position)))
(* first second))
您的瓶颈很可能是您在读取行后对字符串所做的操作。你能把你用的代码贴出来吗?我用的是SBCL。但看来你是对的。在读取流之后,应用程序逻辑的代码中会发生缓慢的事情。实际上,我通过长算术使用解析整数和乘法。因此,应用程序读取1000对整数(每个人10^4位),并打印每对整数的乘法结果。您的瓶颈很可能是您在读取行后对字符串所做的操作。你能把你用的代码贴出来吗?我用的是SBCL。但看来你是对的。在读取流之后,应用程序逻辑的代码中会发生缓慢的事情。实际上,我通过长算术使用解析整数和乘法。所以应用程序读取1000对整数(每个10^4位),并打印每对整数的乘法结果。我使用SBCL。现在我认为这不是I/O问题。我正在使用SBCL。现在我认为这不是I/O问题。PARSE-INTEGER返回它消耗的字符串数量的第二个值,因此您也可以使用(m-v-b(第一个端点)(PARSE-INTEGER字符串:允许垃圾t)(*first(PARSE-INTEGER字符串:start(1+end):允许垃圾t))或类似的值。PARSE-INTEGER返回它消耗的字符串数量的第二个值,因此,您也可以使用(m-v-b(first end)(解析整数字符串:允许垃圾t)(*first(解析整数字符串:start(1+end):允许垃圾t))或类似的方法。