[ (PipeableOSProcess waitForCommand: 'wc -l /path/to/bigfile2.csv') output ] timeToRun.
В приведенных выше отчетах ~ 207 миллисекунд, где указано время:
real 0m0.160s
user 0m0.131s
sys 0m0.029s
Шучу, но тоже серьезно.Не нужно изобретать велосипед.FFI, OSProcess, Zinc и т. Д. Предоставляют широкие возможности для использования таких вещей, как утилиты UNIX, которые были испытаны в бою на протяжении десятилетий.
Если бы ваш вопрос был действительно больше о самом Smalltalk, то для начала бы:
[ FileStream
readOnlyFileNamed: '/path/to/reallybigfile2.csv'
do: [ :file | | endings count |
count := 0.
file binary.
file contents do: [ :c | c = 10 ifTrue: [ count := count + 1 ] ].
count ]
] timeToRun.
Это приведет к снижению времени до 2,5 секунд:
- сохранение потока в двоичном виде ~ 10 секунд
- readOnlyFileNamed: do: сохранено ~ 1 секунда
- поиск концов строк вручную вместо использования #nextLine сэкономил ~ 4 секунды
Более чистый, но более длительный полдня операции будет:
file contents occurrencesOf: 10.
Конечно, если требуется лучшая производительность, и вы не хотите использовать FFI / OSProcess, вы бы тогда написали плагин.