Почему общедоступные поля быстрее, чем свойства?

Решение

@ 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;

38
задан JulianR 11 March 2009 в 11:30
поделиться

5 ответов

Редактирование 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. Это может заставить сравнительные тесты производительности изменяться.

15
ответ дан Reed Copsey 23 September 2019 в 19:47
поделиться

Необходимо прочитать эту статью Vance. Это вдается в подробности о том, почему методы не всегда встраиваются JIT'er, даже если выглядит абсолютно очевидным, что они должны быть.

http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx

5
ответ дан JaredPar 23 September 2019 в 19:47
поделиться
  • поля Public являются прямыми присвоениями
  • , Свойства являются методами, тогда больше кода, незначительного, но больше.
3
ответ дан FerranB 23 September 2019 в 19:47
поделиться

XNA должен предназначаться для XBox 360 и JIT в.NET, Компактная Платформа не так сложна как ее настольный дубликат..NET CF JIT'er не встроит методы свойства.

3
ответ дан Michael 23 September 2019 в 19:47
поделиться

Доступ к полю является просто ссылкой памяти, тогда как использование свойства на самом деле вызывает метод и включает вызов функции наверху. Причина использовать свойства, а не поля состоит в том, чтобы изолировать Ваш код от изменений и обеспечить лучшую гранулярность по доступу. Не представляя Ваше поле непосредственно Вы имеете больший контроль над тем, как доступ сделан. Используя автоматические поля позволяет Вам добираться обычно поведение метода get/метода set, но сборки в способности изменить это без последующей потребности в изменениях для распространения к другим частям кода.

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

3
ответ дан tvanfosson 23 September 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: