«динамическое хранилище» с memcpy

#c #data-structures #memcpy

#c #структуры данных #memcpy

Вопрос:

Я работаю с библиотекой, которая использует «memcpy» для имитации динамической структуры данных хранилища с прямым доступом. Важно отметить, что я работаю над числовыми операциями, которые приводят к небольшим наборам данных. Как я могу определить, будет ли связанный список более подходящим, чем memcpy с точки зрения эффективности?

Из того, что я нашел в литературе и в Интернете, тесты считаются довольно злыми.

Я имею дело примерно с 30 элементами (по опыту) небольшого размера (3 компонентных вектора: точки в пространстве).

Что бы вы использовали в этом случае:

1) memcpy прямой доступ 2) связанный список линейное время поиска

Спасибо!

Комментарии:

1. Тесты «считаются злом»? Что за черт?

2. Пожалуйста, покажите нам «литературу», в которой говорится, что контрольные показатели — это зло.

3. Ну, коды, которые я программирую (я механик), касаются численного моделирования в механике сплошной среды с использованием метода конечных объемов. Вычисления очень сложны, и они выполняются на кластерах HPC. То, что я имел в виду под «бенчмарками — это зло», было неправильно сформулировано: я имел в виду, что нет смысла проводить бенчмаркинг этой вещи сейчас, пока все это не будет закодировано. Есть много слоев для построения, и на данный момент я не могу знать, какой вариант лучше. Наверное, я имел в виду «преждевременную оптимизацию», но опять же, я механик, поэтому прошу прощения за неправильную терминологию…

Ответ №1:

Если вы действительно так заботитесь о производительности, вы должны измерить ее, то есть сравнить свой код (это не зло, это обычная практика; что является злом, так это преждевременная оптимизация).

Но имейте в виду, что, по крайней мере, с недавним GCC (например, GCC 4.6) на GNU / Linux и при оптимизации по крайней мере -O2, memcpy amp; memset полулегальным образом (с помощью __builtin_memcpy или подобных трюков) преобразуются в довольно эффективный код.

И для большого набора небольших элементов данных, я бы предположил, что соображения кэширования являются доминирующими в отношении производительности.

Комментарии:

1. Что именно это означает «соображения кэширования являются доминирующими в отношении производительности»? Я имею дело с большим набором небольших элементов данных, и в конце я протестирую различные варианты контейнера, как вы предложили. Спасибо.

Ответ №2:

Профилирование, или контрольные показатели, не являются злом. Это лучший способ выяснить, какой из нескольких вариантов является более эффективным. Учитывая «сообразительность» современных оптимизаторов, нелогичный вариант на самом деле может оказаться наиболее эффективным. Я предлагаю вам запустить бенчмарк и сделать выбор, основываясь на этом. Единственный способ, которым вы можете ошибиться, — это не предоставить корректные входные данные, которые охватывают большинство случаев.

Ответ №3:

Поскольку вы имеете дело с таким небольшим объемом данных — почему вы беспокоитесь?

Сравнительный анализ действительно работает только с большим количеством вычислений — чтобы ограничить другие эффекты от ОС.

Ответ №4:

При таком маленьком наборе данных (30 * 12 байт) все ваши данные находятся внутри строки кэша. Поэтому я уверен, что это будет быстрее, чем список. Если вы используете список, вам все равно нужно выделить часть памяти, что в большинстве ОС занимает больше времени, чем копирование такого небольшого фрагмента памяти.