LINUX.ORG.RU

История изменений

Исправление Puzan, (текущая версия) :

Тривиальная версия на Guile (никто не постил ещё?)

#!/usr/bin/env -S guile
!#

(import (srfi srfi-1)
        (srfi srfi-26)
        (ice-9 textual-ports))

(define (parse port cities)
  (let ((line (get-line port)))
    (when (not (eof-object? line))
      (let* ((l (string-split line #\;))
             (city-name (first l))
             (temperature (string->number (second l)))
             (city (hash-ref cities city-name)))
        (hash-set! cities city-name
                   (if city
                       `(,(+ (first city) 1)
                         ,(min (second city) temperature)
                         ,(+ (third city) temperature)
                         ,(max (fourth city) temperature))
                       `(1 ,temperature ,temperature ,temperature))))
      (parse port cities))))

(define (parse-file file)
  (let ((cities (make-hash-table)))
    (call-with-input-file file (cut parse <> cities))
    (sort (map (lambda (c)
                 `(,(first c)
                   ,(third c)
                   ,(/ (fourth c) (second c))
                   ,(fifth c)))
               (hash-map->list cons cities))
          (lambda (a b) (string< (car a) (car b))))))

(parse-file "./measurements.txt")

Результат (Ryzen 7 4700U):

$ time ./1brc.scm

________________________________________________________
Executed in   23.20 mins    fish           external
   usr time   34.63 mins  421.00 micros   34.63 mins
   sys time    1.15 mins  274.00 micros    1.15 mins

Для скорости пробовал делать hash-get-handle и set-cdr!, но время получилось то же самое. Да и нечего тут оптимизировать, потому что простое чтение строк без обработки занимает почти 10 минут.

PS: второй запуск выполнялся 20 минут.

Исходная версия Puzan, :

Тривиальная версия на Guile (никто не постил ещё?)

#!/usr/bin/env -S guile
!#

(import (srfi srfi-1)
        (srfi srfi-26)
        (ice-9 textual-ports))

(define (parse port cities)
  (let ((line (get-line port)))
    (when (not (eof-object? line))
      (let* ((l (string-split line #\;))
             (city-name (first l))
             (temperature (string->number (second l)))
             (city (hash-ref cities city-name)))
        (hash-set! cities city-name
                   (if city
                       `(,(+ (first city) 1)
                         ,(min (second city) temperature)
                         ,(+ (third city) temperature)
                         ,(max (fourth city) temperature))
                       `(1 ,temperature ,temperature ,temperature))))
      (parse port cities))))

(define (parse-file file)
  (let ((cities (make-hash-table)))
    (call-with-input-file file (cut parse <> cities))
    (sort (map (lambda (c)
                 `(,(first c)
                   ,(third c)
                   ,(/ (fourth c) (second c))
                   ,(fifth c)))
               (hash-map->list cons cities))
          (lambda (a b) (string< (car a) (car b))))))

(parse-file "./measurements.txt")

Результат (Ryzen 7 4700U):

$ time ./1brc.scm

________________________________________________________
Executed in   23.20 mins    fish           external
   usr time   34.63 mins  421.00 micros   34.63 mins
   sys time    1.15 mins  274.00 micros    1.15 mins

Для скорости пробовал делать hash-get-handle и set-cdr!, но время получилось то же самое. Да и нечего тут оптимизировать, потому что простое чтение строк без обработки занимает почти 10 минут.