учет производительности при многократном использовании свойств - PullRequest
5 голосов
/ 08 февраля 2010

Я использую CultureInfo.CurrentCulture при форматировании строк, используя string.format

Цитировать этот блог

Это просто означает, что если Вы часто используете CurrentCulture, это может быть стоит прочитать это в частная переменная, а не делая много звонков CultureInfo.CurrentCulture, в противном случае вы используете такты без необходимости.

согласно этому автору

var culture = CultureInfo.CurrentCulture
string.Format(culture,"{0} some format string","some args");
string.Format(culture,"{0} some format string","some other args");

лучше чем

string.Format(CultureInfo.CurrentCulture,"{0} some format string","some args");
string.Format(CultureInfo.CurrentCulture,"{0} some format string","some other args");

согласно MSDN, CultureInfo.CurrentCulture является собственностью

Есть ли снижение производительности, связанное с многократным доступом к свойству ??

Также я сделал некоторый эмпирический анализ, и мои тесты показали, что использование локальной переменной дороже, чем непосредственное использование свойства.

Stopwatch watch = new Stopwatch();

            int count = 100000000;
            watch.Start();
            for(int i=0;i<count;i++)
            {
                string.Format(CultureInfo.CurrentCulture, "{0} is my name", "ram");
            }


            watch.Stop();
                 //EDIT:Reset watch
                 watch.Reset();


            Console.WriteLine(watch.Elapsed);
            Console.WriteLine(watch.ElapsedMilliseconds);
            Console.WriteLine(watch.ElapsedTicks);


            Console.WriteLine("--------------------");
            var culture = CultureInfo.CurrentCulture;
            watch.Start();
            for (int i=0; i < count; i++)
            {
                string.Format(culture, "{0} is my name", "ram");
            }


            watch.Stop();

            Console.WriteLine(watch.Elapsed);
            Console.WriteLine(watch.ElapsedMilliseconds);
            Console.WriteLine(watch.ElapsedTicks);

Результат:

00:00:29.6116306
29611
68922550970
--------------------
00:00:27.3578116
27357
63676674390

Мои тесты показывают, что использование свойства CultureInfo.CurrentCulture лучше, чем использование локальной переменной (что противоречит мнению авторов). Или я что-то здесь упускаю?

Редактировать: я не сбрасывал секундомер до второй итерации. отсюда и разница. сброс секундомера, обновление счетчика итераций и результат этого редактирования

Ответы [ 3 ]

7 голосов
/ 08 февраля 2010

Единственная истинная причина переписать ваш код на

var culture = CultureInfo.CurrentCulture;
String.Format(culture, "{0} some format string", "some args"); 
String.Format(culture, "{0} some format string", "some other args"); 

от

String.Format(CultureInfo.CurrentCulture, "{0} some format string", "some args");  
String.Format(CultureInfo.CurrentCulture, "{0} some format string", "some other args"); 

для удобочитаемости и удобства обслуживания. Теперь, если вам по какой-то причине нужно изменить культуру с CultureInfo.CurrentCulture на CultureInfo, которая загружается через какой-либо файл конфигурации или передается в качестве метода параметру, вам нужно всего лишь изменить код в одном месте. Производительность здесь является второстепенным фактором и, вероятно, не имеет значения, поскольку вряд ли это будет узким местом в вашем коде.

3 голосов
/ 08 февраля 2010

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

2 голосов
/ 16 февраля 2010

В вашем коде есть ошибка. В вашем тестовом коде вы не сбрасываете секундомер. Когда вы сбросите секундомер, вы увидите, что использование кэшированной ссылки на самом деле быстрее. CultureInfo.CurrentCulture не дешевый, но строковый. Формат намного дороже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...