Common lisp CommonLisp:读取流的最快方法

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

各位,在CommonLisp(SBCL)中读取流的最快方法是什么

对我来说,那就是读一行。但突然间,我遇到了这个函数的性能问题——我应该在1.5秒内读取10kk字符(1000行,每行10000个字符),但读取行未能实现。使用公共Lisp是否可能?它是否提供用于快速读取的C-stylescanf()功能

谢谢

更新。守则:

(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))或类似的方法。