Common Lisp: самый быстрый способ чтения потока - PullRequest
1 голос
/ 27 мая 2011

ребята, какой самый быстрый подход для чтения потока в Common Lisp (SBCL)?

Для меня это read-line .Но внезапно я застрял с проблемой производительности этой функции - мне нужно прочитать 10kk символов (1000 строк по 10000 символов в каждой) за 1,5 секунды, но read-line не удалось этого достичь.Это возможно с Common Lisp?Предоставляет ли он функцию C-style scanf () для быстрого чтения?

Спасибо!

UPDATE .Код:

(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)

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

Производительность для текстово-ориентированного ввода / вывода может сильно различаться между реализациями, и стратегии, которые помогают повысить производительность в одной реализации, могут не относиться к другой.Какую реализацию вы используете?

Гарантируется, что строки имеют одинаковую длину?

Для чего бы это ни стоило, я попробовал ваше упражнение (1000 строк по 10000 символов в каждой), и оно заняло около 0,25секунд для чтения в SBCL.

3 голосов
/ 27 мая 2011

Без профилирования невозможно точно определить, где находятся ваши узкие места, но я предполагаю, что 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))
...