Common Lisp:读取流的最快方法

问题描述

| 人们,在Common Lisp(SBCL)中读取流的最快方法是什么? 对我来说,这是读行。但是突然之间,我对这个功能性能问题感到困惑-我应该在1.5秒内读取10kk个字符(每行1000个字符,每个字符10000个字符),但是读取行未能实现它。 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)
    

解决方法

        在不同的实现之间,面向文本的I / O的性能可能会相差很大,并且有助于提高一种实现的性能的策略可能不适用于另一种实现。您正在使用什么实现? 线是否保证长度相同? 对于它的价值,我尝试了一下您的练习(每行10,000个字符,共1,000行),用SBCL大约需要0.25秒的时间来阅读。     ,        如果不进行概要分析,就不可能确切地说出您的瓶颈在哪里,但是我的猜测是
split
solve
正在使您放慢脚步。具体来说,当您在字符串上调用ѭ3进行拆分时,最终会分配两个新字符串。由于
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))