В настоящее время я пишу простую часть анализа ввода-вывода, и у меня возникла дилемма относительно того, как мне ее кодировать.
Это случай веб-приложения, в котором эта конкретная функция синтаксического анализа может вызываться несколько раз в течение секунды несколькими пользователями.
Предположим, что размер файла превышает 2 МБ, а задержки аппаратного ввода-вывода составляют 5 мс для каждого вызова.
Первый случай: память
Первый случай - код дляпамять, но за счет скорости.Функция будет принимать небольшие части файла и разбирать их по частям, используя больше итераций, но меньше памяти.
Псевдокод:
function parser() {
Open file and put into handle variable fHandle
while (file position not passed EOF) {
read 1024 bytes from file using fHandle into variable data
process(data)
}
Close file using handle fHandle
}
Второй случай: Скорость
Второй случай - кодирование скорости за счет использования памяти.Функция загружает все содержимое файла в память и анализирует его напрямую.
Псевдокод:
function parser() {
read entire file and store into variable data
declare parsing position variable and set to 0
while (parsing position not past data length) {
get position of next token and store into variable pos
process( substring from current position to pos of data )
}
}
Примечание: при чтении всего файла мы используем функции прямого доступа к библиотеке для чтениявесь файл.Никакие циклы не используются при чтении файла на стороне разработчика.
Третий случай: выбор конечного пользователя
Тогда было бы целесообразно написать для обоих, и всякий раз, когда функция выполняется, функцияопределит, достаточно ли памяти или нет.Если в памяти много свободного места, функция будет использовать версию с интенсивным использованием памяти.
Псевдокод:
function parser() {
if (memory is too little) {
Open file and put into handle variable fHandle
while (file position not passed EOF) {
read 1024 bytes from file using fHandle into variable data
process(data)
}
Close file using handle fHandle
} else {
read entire file and store into variable data
declare parsing position variable and set to 0
while (parsing position not past data length) {
get position of next token and store into variable pos
process( substring from current position to pos of data )
}
}
}