#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 байт) все ваши данные находятся внутри строки кэша. Поэтому я уверен, что это будет быстрее, чем список. Если вы используете список, вам все равно нужно выделить часть памяти, что в большинстве ОС занимает больше времени, чем копирование такого небольшого фрагмента памяти.