1

皆さん、Common Lisp (SBCL) でストリームを読み取る最速の方法は何ですか?

私にとって、それはread-lineです。しかし、突然、この関数のパフォーマンスの問題に行き詰まりました。1.5 秒で 10kk 文字 (それぞれ 10000 文字の 1000 行) を読み取る必要がありますが、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)
4

2 に答える 2

4

プロファイリングを行わないと、ボトルネックがどこにあるかを正確に判断することはできませんが、私の推測では、それが原因splitsolve速度が低下しています。具体的にsubseqは、文字列を呼び出して分割すると、最終的に 2 つの新しい文字列が割り当てられます。開始インデックスと終了インデックスを文字列に取り込めるため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))
于 2011-05-27T14:56:44.113 に答える