Состояние “memset” функциональности в C++ с современными компиляторами

Мне удалось решить эту проблему, сопоставив имя HtmlTargetElement и имя класса TagHelper. Мне просто нужно было заменить CustomTageHelper на inputTagHelper, что на самом деле было названием HtmlTargetElement.

19
задан rlerallut 5 October 2008 в 13:15
поделиться

12 ответов

Как всегда с этими типами вопросов, проблема ограничивается факторами за пределами Вашего управления, а именно, пропускной способности памяти. И если хост, ОС решает запустить подкачку страниц память затем вещи, становится намного хуже. На платформах Win32 разбита на страницы память, и страницы только выделяются на первом использовании, которое генерирует большую паузу каждая граница страницы, пока ОС находит, что страница использует (это может потребовать, чтобы страница другого процесса была разбита на страницы к диску).

Это, однако, является абсолютом, самым быстрым memset когда-либо записанный:

void memset (void *memory, size_t size, byte value)
{
}

Не выполнение чего-то всегда является самым быстрым путем. Действительно ли там каким-либо путем являются алгоритмы, может быть записан для предотвращения начальной буквы memset? Каковы алгоритмы, которые Вы используете?

1
ответ дан 30 November 2019 в 03:29
поделиться

Год больше не является 2001. С тех пор новые версии Visual Studio появились. Я не торопился для изучения memset в тех. Они будут использовать SSE для memset (при наличии, конечно). Если Ваш старый код был правильным, статистически , если теперь будет быстрее. Но Вы могли бы поразить неудачный cornercase. Я ожидаю то же от GCC, хотя я не изучил код. Это - довольно очевидное улучшение и компилятор С открытым исходным кодом. Кто-то создаст патч.

0
ответ дан 30 November 2019 в 03:29
поделиться

Форум MASM имеет много невероятных программистов/людей, увлеченных своим хобби, ассемблера, которые бились, эта проблема полностью до смерти (взгляните через Лабораторию). Результаты были во многом как ответ Christopher: SSE невероятен для большого, выровненного, буферов, но потеря работоспособности по Вам в конечном счете достигнет такого небольшого размера, что основное for цикл так же быстро.

8
ответ дан 30 November 2019 в 03:29
поделиться

Статья DDJ подтверждает, что memset является лучшим ответом, и намного быстрее, чем, чего он пытался достигнуть:

существует что-то священное о функциях управления памятью C memset, memcpy, и memcmp. Они, вероятно, будут высоко оптимизированы поставщиком компилятора, до такой степени, что компилятор мог бы обнаружить вызовы к этим функциям и заменить их встроенными ассемблерными инструкциями — дело обстоит так с MSVC.

Так, если memset работает на Вас (т.е. Вы инициализируете с единственным байтом) затем используют его.

, Пока каждая миллисекунда может рассчитать, необходимо установить, какой процент времени выполнения потерян установке памяти. Это, вероятно, очень низко (1 или 2%??), учитывая, что у Вас есть полезная работа, чтобы сделать также. Учитывая, что усилие по оптимизации, вероятно, имело бы намного лучшую рентабельность в другом месте.

10
ответ дан 30 November 2019 в 03:29
поделиться

Memset/memcpy главным образом записаны с набором исходной команды в памяти и так могут быть превзойдены по характеристикам специализированными стандартными программами SSE, которые, с другой стороны, осуществляют определенные ограничения выравнивания.

, Но уменьшать его до списка:

  1. Для наборов данных < = несколько сотен килобайтов memcpy/memset работают быстрее, чем что-нибудь, что Вы могли копировать.
  2. Для наборов данных> мегабайты используют комбинацию memcpy/memset для получения, выравнивание и затем использовать собственный SSE оптимизировало стандартные программы/нейтрализацию к оптимизированным стандартным программам от Intel и т.д.
  3. , Осуществляют выравнивание при запуске и используют собственные стандартные программы SSE.

Этот список только начинает действовать для вещей, где Вам нужна производительность. Слишком маленький/или когда-то инициализированные наборы данных не стоят стычки.

Здесь реализация memcpy от AMD, я не могу найти статью, которая описала понятие позади кода.

5
ответ дан 30 November 2019 в 03:29
поделиться

d) Признают, что попытка играть "приемы ума джедая" с инициализацией приведет к более потерянным часам программиста, чем кумулятивное различие в миллисекундах между некоторым неясным, но быстрым методом по сравнению с чем-то очевидным и ясным.

4
ответ дан 30 November 2019 в 03:29
поделиться

Это зависит, что Вы делаете. Если у Вас есть очень конкретный случай, можно часто значительно превосходить систему по характеристикам libc (и/или встраивание компилятора) memset и memcpy.

, Например, для программы я продолжаю работать, я записал 16 байтам выровненный memcpy и memset, разработанный для небольших размеров данных. memcpy был сделан для multiple-16 размеров, больше, чем или равным 64 только (с данными, выровненными к 16), и memset был сделан для multiple-128 размеров только. Эти ограничения позволили мне получать огромную скорость, и так как я управлял приложением, я мог адаптировать функции конкретно в соответствии с тем, что было необходимо, и также адаптируйте приложение для выравнивания всех необходимых данных.

memcpy, выполненный приблизительно в 8-9x скорость собственного компонента Windows memcpy, knocing 460 байтов, копируют всего к 50 тактам. memset был о 2.5x быстрее, заполняя массив стека нулей чрезвычайно быстро.

, Если Вы интересуетесь этими функциями, они могут быть найдены здесь ; выпадающий приблизительно к строке 600 для memcpy и memset. Они довольно тривиальны. Обратите внимание, что они разработаны для маленьких буферов, которые, как предполагается, находятся в кэше; если Вы хотите инициализировать огромные объемы данных в памяти при обходе кэша, проблема может быть более сложной.

4
ответ дан 30 November 2019 в 03:29
поделиться

Хорошо это все зависит от Вашей проблемной области и Ваших спецификаций, имейте Вас, столкнулся с проблемами производительности, не удался успеть к сроку синхронизации и точно определил memset, как являющийся корнем всего зла? Если это это, Вы находитесь в том и только случае, где Вы могли рассмотреть некоторую настройку memset.

Затем необходимо ли также иметь в виду, что memset во всяком случае будет варьироваться на аппаратных средствах платформа, которая это, работал, в течение тех пяти лет, программное обеспечение будет работать на той же платформе? На той же архитектуре? Один Вы приходите к тому заключению, которое можно попробовать к 'самокрутке' memset, обычно играя с выравниванием буферов, удостоверившись Вы нулевые 32 битовые значения сразу в зависимости от того, что является самым производительным на Вашей архитектуре.

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

1
ответ дан 30 November 2019 в 03:29
поделиться

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

, Если память является проблемой, используйте буфер меньшего размера & копия это через в sizeof (..) смещения в новый буфер.

HTH

1
ответ дан 30 November 2019 в 03:29
поделиться

Можно смотреть на liboil, они (попробуйте к), обеспечивают другую реализацию той же функции и выбор самого быстрого на инициализации. Liboil имеет довольно либеральную лицензию, таким образом, можно взять его также для собственного программного обеспечения.

http://liboil.freedesktop.org/

2
ответ дан 30 November 2019 в 03:29
поделиться

Я всегда выбирал бы метод инициализации, который является частью времени выполнения или ОС (memset), я использую (худший тот выбора случая, который является частью библиотеки, которой я пользуюсь).

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

Все это стоит, если улучшение времени выполнения является незначительным. Если у Вас есть различие порядка величины между memset и Вашей собственной инициализацией, то имеет смысл иметь Ваше выполнение кода, но я действительно сомневаюсь относительно этого случая.

1
ответ дан 30 November 2019 в 03:29
поделиться

Если необходимо выделить память, а также инициализировать ее, я был бы:

  • Использование calloc вместо Изменения malloc
  • как можно больше моих значений по умолчанию, чтобы быть нулем (исключая: позвольте моей перечислимой величине по умолчанию быть нулем; или если значение по умолчанию логической переменной 'верно', сохраните, это - обратное значение в структуре)

, причина этого состоит в том, что нуль calloc - инициализирует память для Вас. В то время как это включит издержки для обнуления памяти, большинству компиляторов, вероятно, высоко оптимизируют эта стандартная программа - более оптимизированный что malloc/new с вызовом к memcpy.

1
ответ дан 30 November 2019 в 03:29
поделиться