Странное поведение - PullRequest
       5

Странное поведение

7 голосов
/ 25 сентября 2011

Я использую Visual Studio 2010 с пакетом обновления 1 (SP1), целевая платформа - 2.0, цель платформы: любой процессор, тестирование под Windows 7 x64 SP1.

У меня странное поведение при работе.

Без app.config или следующего app.config моя программа запускается медленно (секундомер показывает ~ 0,11 с)

<?xml version="1.0"?>
<configuration>
  <startup >
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>

Следующий app.config позволяет моей программе работать в 5 раз быстрее (секундомер показывает ~ 0,02 с)

<?xml version="1.0"?>
<configuration>
  <startup >
    <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>

Это код тестовой программы:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        while (true)
        {
            sw.Reset();
            sw.Start();

            for (int i = 0; i < 1000000; i++ )
            {
                "blablabla".IndexOf("ngrhotbegmhroes", StringComparison.OrdinalIgnoreCase);
            }

            Console.WriteLine(sw.Elapsed);
        }
    }
}

Я сижу часами и не могу понять, что здесь происходит. Есть идеи?

Ответы [ 3 ]

15 голосов
/ 25 сентября 2011

Похоже, вы только что нашли ситуацию, в которой .NET 4 намного быстрее.По умолчанию ваше приложение работает с платформой, для которой оно было создано.Когда вы заставляете использовать это .NET 4, это быстрее.Это может быть улучшение JIT-компилятора, которое может попасть в вашу ситуацию, или это может быть улучшение фреймворка - но не должно быть слишком удивительно, что некоторые вещи быстрее в новых версиях.

(Для чего это стоитЯ бы увеличил количество итераций, на которые вы рассчитываете время, если бы вы были ... на моем компьютере под .NET 4, каждая итерация составляет всего 10 мс, что на самом деле не является хорошим измерением.хотя бы несколько секунд.)

(И, как и Митч, я могу подтвердить, что вижу тот же эффект.)

РЕДАКТИРОВАТЬ: Я только что исследовал это немного дальше, и увидел интересныйэффект ... я предполагаю, что мы звоним haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase):

  • . В .NET 2 результаты примерно одинаковы, но большая "игла"
  • Вкл..NET 4:
    • Если needle больше haystack (согласно вашему примеру) .NET 4 намного быстрее, чем .NET 2
    • Если needle того же размеракак haystack, .NET 4 на немного бит медленнее, чем .NET 2
    • Если needle меньшечем haystack, .NET 4 на лот медленнее, чем .NET 2

(Это тест, в котором первый символ needle никогда не появляется в haystack, кстати.

4 голосов
/ 25 сентября 2011

Я только что выполнил ваш тест с несколькими изменениями (которые включали в себя больше итераций и усреднение) и могу подтвердить, что целевая версия .NET 4.0 действительно в 4-5 раз быстрее.

Итак, предположительно IndexOf() было оптимизировано в .NET 4.0

3 голосов
/ 25 сентября 2011

ОК, некоторые тесты с новым VS11

n = 1000000;
string haystack = "ngrhotbegmhroes";
string needle = "blablablablablablablablablangrhotbegmhrobla bla";

.NET 4.5 :  8 ms
.NET 4.0 :  8 ms
.NET 3.5 : 45 ms
.NET 2.0 : 45 ms

Таким образом, эти первые результаты подтверждают ваши выводы, новые версии работают быстрее.

Однако гораздо чаще искать короткую строку внутри большой строки:

n = 1000000; 
haystack = "blablablablablablablablablangrhotbegmhrobla bla";  
needle = "ngrhotbegmhroes";

.NET 4.5 : 1020 ms
.NET 4.0 : 1020 ms
.NET 3.5 :  155 ms
.NET 2.0 :  155 ms

И с намного более длинным стогом сена (~ 400 символов)

.NET 4.0 : 12100 ms
.NET 2.0 :  1700 ms

Что означает, что для наиболее распространенного шаблона использования дела пошли хуже ...


Все измерения в конфигурации выпуска и профиле клиента, если они доступны.
Запуск от VS 11 с Ctrl + F5
Win 7H, Core i7 2620M

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