Вероятно, функция не вызывает себя, а не последовательный шаблон доступа, выделяя небольшие сегменты из большого файла. Несмотря на то, что вы читаете только 16 байт, подсистема хранения, скорее всего, считывает (и кэширует) большие блоки. Ваш шаблон доступа смертелен для типичных операций ввода-вывода.
(профилирование должен показать доступ к диску, является ли горлышко бутылки. Если бы это было «много вызовов функций», CPU будет.)
Итак, в первую очередь, вы можете изменить это требование?
Это самый простой выход из всех сценариев.
Не могли бы вы рассеять меньше? Например. вместо чтения вершин 0, 20, 40, ..., 1000, считанных вершин 0,1,2,3,4, 100, 101, 102, 103, 104, 200, 201, 202, 203, 204, .. . - то же количество вершин, из «всех частей» файла.
Во-вторых, Особые оптимизации ОС.
Нет никакого портативного способа управления кэшированием уровня ОС.
Одним из решений является сопоставление памяти файла (CreaterFileMapping
на Windows, mmap
на системах Linux), как было предложено @Nim. Это может опустить одну копию памяти, но все же будет прочитан весь файл.
не может помочь много с Linux, но на Windows, у вас есть в качестве параметров CreateFile:
FILE_FLAG_NO_BUFFERING
, которые в основном означает, что вы сделать буферизацию, что дает вам больше контроля над кэшированием, что происходит, но вы не можете искать + читать волей-неволей.
FILE_FLAG_SEQUENTIAL_SCAN
который только telsl кэш не хранить старые данные
Ни один из них решит проблему с вашим рисунком доступа, но первый может опосредовать его несколько - особенно если ваши шаги чем дисковые сектора, а второй может оказывать давление на подсистему.
В-третьих, Снимок.
Лучшим вариантом может быть сохранение перемеженного моментального снимка либо в связанном файле.
Снимок может быть просто результатом вашей операции, для конкретного maxVertexCount
. Или несколько снимков, например mipmapping. Идея состоит в том, чтобы заменить рассеянное чтение последовательным чтением.
В качестве альтернативы, моментальный снимок может хранить данные в порядке чередования. Для 128 вершин, вы можете хранить вершины в таком порядке (грубо говоря, остерегайтесь вне от < -она, на основе нулевой против-один и наложения эффектов, и мои ошибки):
64, 32, 96, 16, 48, 80, 112 8, 24, 40, 56, 72, 88, 104, 120 ...
ли вы прочитайте первые 3 или первые 7 или первые 15 или первые 31 ... значения, образцы равномерно распределены по файлу, как в исходном коде. Переупорядочение их в памяти будет намного быстрее - особенно если это всего лишь небольшое подмножество.
Примечание: вам нужен надежный алгоритм для обнаружения того, что ваш снимок устарел, независимо от многих забавных вещей, которые происходят с «последней датой записи» в разных файловых системах. «Счетчик изменений» в главном файле был бы самым безопасным (хотя это уменьшило бы стоимость изменений).
В-четвертых, Изменить формат файла
(В случае, если вы можете контролировать, что) Перемеженный хранения предложено выше, может быть использован для всего файла. Однако это имеет большое значение для обработки - особенно если вам нужно восстановить «оригинальный» порядок в какой-то момент.
Элегантный вариант будет иметь такое перемеженное подмножество как часть файла, и полный список вершин в исходном порядке.Существует обрезание stepSize
, где это больше не помогает, возможно, около 2 * сектора/размера блока на диске. Таким образом, размер файла увеличился бы всего на несколько процентов. Тем не менее, записи станут немного более дорогостоящими, значительно изменится количество вершин.
предупреждение Aliasing
Если это предназначено, чтобы получить «статистический» или «визуально достаточный» выборки, фиксированный stepSize
может быть проблематичным, так как это может создать эффект наложения спектров (думаю Муаровые) с любыми шаблонами, присутствующими в данных.
В этом случае предпочтительным будет случайный выборка. Это может показаться страшным и делает некоторые из решений выше немного сложнее, но часто это самый простой способ избежать многих субоптимальных случаев.
Мне нравится ваша идея для снимков/уровней mipmap. Я попробую. Для предупреждения о слиянии: на данный момент данные выглядят нормально после подвыборки с фиксированным шагомSize, но я буду изучать его в будущем. –