Если вы хотите улучшить производительность, вам придется использовать поля фиксированной длины. Разбор или загрузка полей переменной длины не обеспечивает значительного увеличения производительности. Чтение по текстовой строке включает сканирование токена конца строки. Сканирование тратит время.
Прежде чем использовать любое из следующих предложений, профилируйте свой код, чтобы установить базовое время или число для производительности. Делайте это после каждого предложения, так как оно позволит вам вычислить дельта производительности каждой оптимизации. Мой прогноз заключается в том, что дельта будет уменьшаться с каждой оптимизацией.
Я предлагаю сначала преобразовать файл в записи фиксированной длины, все еще используя текст. Заполните поля пробелами по мере необходимости. Таким образом, зная размер записи, вы можете заблокировать чтение в памяти и обрабатывать память как массив. Это должно обеспечить значительное улучшение.
На данный момент вашими узкими местами по-прежнему являются скорость файлового ввода-вывода, которую вы не можете существенно улучшить (поскольку файловый ввод-вывод контролируется ОС), а также сканирование / преобразование текста. Некоторые дальнейшие оптимизации: преобразование текста в числа и, наконец, преобразование в двоичный файл. Любой ценой предпочитайте хранить файл данных в удобочитаемой форме.
Прежде чем сделать файл данных менее читабельным, попробуйте разбить ваше приложение на потоки. Один поток обрабатывает графический интерфейс, другой - ввод, а другой - для обработки. Идея состоит в том, чтобы процессор всегда выполнял часть вашего кода вместо ожидания. На современных платформах файловый ввод-вывод может выполняться, пока процессор обрабатывает ваш код.
Если вас не волнует переносимость, посмотрите, имеет ли ваша платформа возможность DMA (компонент прямого доступа к памяти или прямого доступа к памяти позволяет передавать данные без использования процессора или минимизации использования процессора). Следует обратить внимание на то, что многие платформы разделяют адрес и шину данных между процессором и DMA. Таким образом, один компонент заблокирован или приостановлен, в то время как другой использует адрес и шины данных. Так что может помочь или нет. Зависит от того, как платформа подключена.
Преобразовать поле ключа для использования чисел, a.k.a. tokens . Поскольку токены являются числовыми, они могут использоваться как индексы в таблицах переходов (также для переключения операторов) или просто как индексы в массивах.
В крайнем случае конвертируйте файл в двоичный файл. Двоичная версия должна иметь два поля: ключ как токен и значение. Перенос данных большими кусками в память.
Основная информация
- Перенос больших блоков данных в
память.
- Профиль перед внесением изменений в
установить базовую производительность
измерение.
- Оптимизация по одному шагу за раз,
профилирование после каждой оптимизации.
- Предпочитают хранить файл данных на человеке
читаемая форма.
- Минимизировать изменения в файле данных.
- Конвертировать файл в фиксированную длину
поля.
- Попробуйте использовать темы или многозадачность
поэтому приложение не ждет.
- Преобразование текста в числовые токены
(уменьшает читабельность)
- Конвертировать данные в двоичный файл как последний
курорт (очень трудно для людей
чтение и отладка).