Решение
@ stribizhev имеет квадратичную сложность худшего случая для правильных регулярных выражений. Для безумных (например, «y *») он не заканчивается. В некоторых приложениях эти проблемы могут быть вызваны DoS-атаками . Вот фиксированная версия:
string str("abcdefabcghiabc");
int i = 0;
regex rgx1("abc");
smatch smtch;
auto beg = str.cbegin();
while (regex_search(beg, str.cend(), smtch, rgx1)) {
std::cout << i << ": " << smtch[0] << std::endl;
i += 1;
if ( smtch.length(0) > 0 )
std::advance(beg, smtch.length(0));
else if ( beg != str.cend() )
++beg;
else
break;
}
Согласно моим личным предпочтениям, это найдет n + 1 совпадений пустого регулярного выражения в строке длины n. Вы также можете просто выйти из цикла после пустого совпадения.
Если вы хотите сравнить производительность для строки с миллионами совпадений, добавьте следующие строки после определения str
(и не забудьте включить оптимизацию), один раз для каждой версии:
for (int j = 0; j < 20; ++j)
str = str + str;
Редактирование 2:
у меня была другая мысль потенциала здесь:
Вы упомянули работу x64. Я протестировал эту ту же проблему о x86 и видел ту же производительность при использовании автосвойств по сравнению с полями. Однако при оглядывании на Подключении и списке рассылки / сообщений форума существует много ссылок онлайн на то, что JIT x64 CLR является другой кодовой базой и имеет совсем другие рабочие характеристики к x86 JIT. Мое предположение, это - одно место, где x64 все еще отстает.
кроме того, к вашему сведению, вещь структуры/метода/и т.д., починенная в .net 3.5sp1, была на x86 стороне и была тем, что вызовы метода, которые взяли структуры в качестве параметра, никогда не будут встраиваться на x86 до .net3.5sp1. Это в значительной степени не важно этому обсуждению Вашей системы.
<час>Редактирование 3:
Другая вещь: относительно того, почему XNA использует поля. Я на самом деле был на Игровом Фестивале, где они объявили о XNA. Rico Mariani сделал доклад, где он поднял многие из тех же точек, которые находятся на его блоге. Кажется, что у людей XNA были подобные идеи, когда они разработали некоторые базовые объекты. См.:
http://blogs.msdn.com/ricom/archive/2006/09/07/745085.aspx
Особенно, проверьте точку № 2.
<час>Что касается того, почему автоматические свойства лучше, чем общедоступные поля:
Они позволяют Вам изменять реализацию в v2 Вашего класса и добавлять логику в свойство стандартные программы get/set по мере необходимости, не изменяя Ваш интерфейс на Ваших конечных пользователей. Это может иметь сильное воздействие на Вашу способность поддерживать Вашу библиотеку и код со временем.
----Из исходного сообщения - но обнаруженный это не было--------
проблемы, Были Вы выполняющий сборку конечных версий внешний из VS? Это может быть одним объяснением того, почему вещи не оптимизируются. Часто, если Вы работаете в VS, даже оптимизированной сборке конечных версий, хост-процесс VS отключает много функций JIT. Это может заставить сравнительные тесты производительности изменяться.
Необходимо прочитать эту статью Vance. Это вдается в подробности о том, почему методы не всегда встраиваются JIT'er, даже если выглядит абсолютно очевидным, что они должны быть.
http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx
XNA должен предназначаться для XBox 360 и JIT в.NET, Компактная Платформа не так сложна как ее настольный дубликат..NET CF JIT'er не встроит методы свойства.
Доступ к полю является просто ссылкой памяти, тогда как использование свойства на самом деле вызывает метод и включает вызов функции наверху. Причина использовать свойства, а не поля состоит в том, чтобы изолировать Ваш код от изменений и обеспечить лучшую гранулярность по доступу. Не представляя Ваше поле непосредственно Вы имеете больший контроль над тем, как доступ сделан. Используя автоматические поля позволяет Вам добираться обычно поведение метода get/метода set, но сборки в способности изменить это без последующей потребности в изменениях для распространения к другим частям кода.
, Например, скажите, что Вы хотите изменить свой код так, чтобы доступом к полю управляла роль текущего пользователя. Если бы Вы представили поле публично, необходимо было бы коснуться каждой части кода, который получил доступ к нему. Представление его через свойство позволяет Вам изменять код свойства для добавления нового требования , но не приводит к ненужным изменениям ни в каком коде, который получает доступ к нему .