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

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

Изменено 05.06.2015 12:24 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 или распараллелить *(конкретно тут не поможет, время слишком мелкое), но это читерство и несерьёзно.

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 и золотого правила "ежели один человек построил, другой завсегда разобрать может"
Re[23]: C# - from indians by indians
Здравствуйте, 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 и золотого правила "ежели один человек построил, другой завсегда разобрать может"

UPD3.
На той же машине плюсовый код от ув. greenpci (vs2013, релиз, win32, без отладчика) на настройках проекта по умолчанию выдаёт
Elapsed = 189.011 ms

Что-то я делаю не так