История изменений
Исправление 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 минут.