Мне удалось решить эту проблему, сопоставив имя HtmlTargetElement и имя класса TagHelper. Мне просто нужно было заменить CustomTageHelper
на inputTagHelper
, что на самом деле было названием HtmlTargetElement.
Как всегда с этими типами вопросов, проблема ограничивается факторами за пределами Вашего управления, а именно, пропускной способности памяти. И если хост, ОС решает запустить подкачку страниц память затем вещи, становится намного хуже. На платформах Win32 разбита на страницы память, и страницы только выделяются на первом использовании, которое генерирует большую паузу каждая граница страницы, пока ОС находит, что страница использует (это может потребовать, чтобы страница другого процесса была разбита на страницы к диску).
Это, однако, является абсолютом, самым быстрым memset
когда-либо записанный:
void memset (void *memory, size_t size, byte value)
{
}
Не выполнение чего-то всегда является самым быстрым путем. Действительно ли там каким-либо путем являются алгоритмы, может быть записан для предотвращения начальной буквы memset
? Каковы алгоритмы, которые Вы используете?
Год больше не является 2001. С тех пор новые версии Visual Studio появились. Я не торопился для изучения memset в тех. Они будут использовать SSE для memset (при наличии, конечно). Если Ваш старый код был правильным, статистически , если теперь будет быстрее. Но Вы могли бы поразить неудачный cornercase. Я ожидаю то же от GCC, хотя я не изучил код. Это - довольно очевидное улучшение и компилятор С открытым исходным кодом. Кто-то создаст патч.
Форум MASM имеет много невероятных программистов/людей, увлеченных своим хобби, ассемблера, которые бились, эта проблема полностью до смерти (взгляните через Лабораторию). Результаты были во многом как ответ Christopher: SSE невероятен для большого, выровненного, буферов, но потеря работоспособности по Вам в конечном счете достигнет такого небольшого размера, что основное for
цикл так же быстро.
Статья DDJ подтверждает, что memset является лучшим ответом, и намного быстрее, чем, чего он пытался достигнуть:
существует что-то священное о функциях управления памятью C memset, memcpy, и memcmp. Они, вероятно, будут высоко оптимизированы поставщиком компилятора, до такой степени, что компилятор мог бы обнаружить вызовы к этим функциям и заменить их встроенными ассемблерными инструкциями — дело обстоит так с MSVC.
Так, если memset работает на Вас (т.е. Вы инициализируете с единственным байтом) затем используют его.
, Пока каждая миллисекунда может рассчитать, необходимо установить, какой процент времени выполнения потерян установке памяти. Это, вероятно, очень низко (1 или 2%??), учитывая, что у Вас есть полезная работа, чтобы сделать также. Учитывая, что усилие по оптимизации, вероятно, имело бы намного лучшую рентабельность в другом месте.
Memset/memcpy главным образом записаны с набором исходной команды в памяти и так могут быть превзойдены по характеристикам специализированными стандартными программами SSE, которые, с другой стороны, осуществляют определенные ограничения выравнивания.
, Но уменьшать его до списка:
Этот список только начинает действовать для вещей, где Вам нужна производительность. Слишком маленький/или когда-то инициализированные наборы данных не стоят стычки.
Здесь реализация memcpy от AMD, я не могу найти статью, которая описала понятие позади кода.
d) Признают, что попытка играть "приемы ума джедая" с инициализацией приведет к более потерянным часам программиста, чем кумулятивное различие в миллисекундах между некоторым неясным, но быстрым методом по сравнению с чем-то очевидным и ясным.
Это зависит, что Вы делаете. Если у Вас есть очень конкретный случай, можно часто значительно превосходить систему по характеристикам 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. Они довольно тривиальны. Обратите внимание, что они разработаны для маленьких буферов, которые, как предполагается, находятся в кэше; если Вы хотите инициализировать огромные объемы данных в памяти при обходе кэша, проблема может быть более сложной.
Хорошо это все зависит от Вашей проблемной области и Ваших спецификаций, имейте Вас, столкнулся с проблемами производительности, не удался успеть к сроку синхронизации и точно определил memset, как являющийся корнем всего зла? Если это это, Вы находитесь в том и только случае, где Вы могли рассмотреть некоторую настройку memset.
Затем необходимо ли также иметь в виду, что memset во всяком случае будет варьироваться на аппаратных средствах платформа, которая это, работал, в течение тех пяти лет, программное обеспечение будет работать на той же платформе? На той же архитектуре? Один Вы приходите к тому заключению, которое можно попробовать к 'самокрутке' memset, обычно играя с выравниванием буферов, удостоверившись Вы нулевые 32 битовые значения сразу в зависимости от того, что является самым производительным на Вашей архитектуре.
я однажды столкнулся с тем же для memcmpt, где выравнивание наверху вызвало некоторые проблемы, бит обычно, это не приведет к чудесам, только маленькому улучшению, если таковые имеются. Если Вы пропускаете свои требования порядком mangnitude, чем это не получит Вас дальше.
Если память не является проблемой, то предварительно создайте статический буфер размера, в котором Вы нуждаетесь, инициализированный к Вашему значению (значениям). Насколько я знаю, оба этих компилятора являются оптимизирующими компиляторами, поэтому при использовании простого для цикла компилятор должен генерировать оптимальные ассемблерные команды для копирования буфера через.
, Если память является проблемой, используйте буфер меньшего размера & копия это через в sizeof (..) смещения в новый буфер.
HTH
Можно смотреть на liboil, они (попробуйте к), обеспечивают другую реализацию той же функции и выбор самого быстрого на инициализации. Liboil имеет довольно либеральную лицензию, таким образом, можно взять его также для собственного программного обеспечения.
Я всегда выбирал бы метод инициализации, который является частью времени выполнения или ОС (memset), я использую (худший тот выбора случая, который является частью библиотеки, которой я пользуюсь).
, Почему: при реализации собственной инициализации Вы могли бы закончить с незначительно лучшим решением теперь, но вероятно, что за несколько лет время выполнения улучшилось. И Вы не хотите делать ту же работу, которую делают парни, поддерживающие время выполнения.
Все это стоит, если улучшение времени выполнения является незначительным. Если у Вас есть различие порядка величины между memset и Вашей собственной инициализацией, то имеет смысл иметь Ваше выполнение кода, но я действительно сомневаюсь относительно этого случая.
Если необходимо выделить память, а также инициализировать ее, я был бы:
, причина этого состоит в том, что нуль calloc - инициализирует память для Вас. В то время как это включит издержки для обнуления памяти, большинству компиляторов, вероятно, высоко оптимизируют эта стандартная программа - более оптимизированный что malloc/new с вызовом к memcpy.