Информация об изменениях

Сообщение Re[23]: C# - from indians by indians от 05.06.2015 11:42

Изменено 05.06.2015 11:53 Sinix

Здравствуйте, greenpci, Вы писали:

G>Теперь разберем дотнет

G>Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.

Если говорить про этот цикл:
            unsafe
            {
                watch = Stopwatch.StartNew();
                for (int i = 0; i < n; i++)
                {
                    v[i] = v[i] * u[i];
                }
            }
            watch.Stop();

то всё ок там, нечего оптимизировать
Не, можно заиспользовать RyuJIT+SIMD или распараллелить *(конкретно тут не поможет, время слишком мелкое), но это читерство и несерьёзно

Такая просьба: запусти дотнетный код с Target platform = x86. Текущий JIT под x64 любит на ровном месте кривой код генерить. У меня соотношение 58ms/116ms в пользу x86.

Да, можно вытащить в отдельный метод
        unsafe private static void Run(int n, Complex[] v, Complex[] u)
        {
            for (int i = 0; i < n; i++)
            {
                v[i] = v[i] * u[i];
            }
        }

— это уменьшит ограничение времени на JIT и даст возможность сгенерить чуть-чуть лучший код, но это копейки: 60 vs 58 ms.
Здравствуйте, greenpci, Вы писали:

G>Теперь разберем дотнет

G>Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.

Если говорить про этот цикл:
            unsafe
            {
                watch = Stopwatch.StartNew();
                for (int i = 0; i < n; i++)
                {
                    v[i] = v[i] * u[i];
                }
            }
            watch.Stop();

то всё ок там, нечего оптимизировать
Не, можно заиспользовать RyuJIT+SIMD или распараллелить *(конкретно тут не поможет, время слишком мелкое), но это читерство и несерьёзно.

UPD. Ещё, обычно рандом инициализируют константой,
            Random rng = new Random(0);
, чтобы повторяемые результаты были. Опять-таки это скорее вопрос для собеседования, чем смертельно важный факт


Такая просьба: запусти дотнетный код с Target platform = x86. Текущий JIT под x64 любит на ровном месте кривой код генерить. У меня соотношение 58ms/116ms в пользу x86.

Да, можно вытащить в отдельный метод
        unsafe private static void Run(int n, Complex[] v, Complex[] u)
        {
            for (int i = 0; i < n; i++)
            {
                v[i] = v[i] * u[i];
            }
        }

— это уменьшит ограничение времени на JIT и даст возможность сгенерить чуть-чуть лучший код, но это копейки: 60 vs 58 ms.

UPD2. Тот же код с классами вместо структур:
.NET Elapsed: 4723,0000 ms

Наглядная иллюстрация gc pressure и золотого правила "ежели один человек построил, другой завсегда разобрать может"