Re[23]: C# - from indians by indians
От: Sinix  
Дата: 05.06.15 11:42
Оценка: 4 (2)
Здравствуйте, 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

Что-то я делаю не так
Отредактировано 05.06.2015 12:24 Sinix . Предыдущая версия . Еще …
Отредактировано 05.06.2015 11:53 Sinix . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.