Сообщение Re[23]: C# - from indians by indians от 05.06.2015 11:42
Изменено 05.06.2015 11:53 Sinix
Здравствуйте, greenpci, Вы писали:
G>Теперь разберем дотнет
G>Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.
Если говорить про этот цикл:
то всё ок там, нечего оптимизировать
Не, можно заиспользовать RyuJIT+SIMD или распараллелить *(конкретно тут не поможет, время слишком мелкое), но это читерство и несерьёзно
Такая просьба: запусти дотнетный код с Target platform = x86. Текущий JIT под x64 любит на ровном месте кривой код генерить. У меня соотношение 58ms/116ms в пользу x86.
Да, можно вытащить в отдельный метод
— это уменьшит ограничение времени на JIT и даст возможность сгенерить чуть-чуть лучший код, но это копейки: 60 vs 58 ms.
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>Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.
Если говорить про этот цикл:
то всё ок там, нечего оптимизировать
Не, можно заиспользовать RyuJIT+SIMD или распараллелить *(конкретно тут не поможет, время слишком мелкое), но это читерство и несерьёзно.
UPD. Ещё, обычно рандом инициализируют константой,
Такая просьба: запусти дотнетный код с Target platform = x86. Текущий JIT под x64 любит на ровном месте кривой код генерить. У меня соотношение 58ms/116ms в пользу x86.
Да, можно вытащить в отдельный метод
— это уменьшит ограничение времени на JIT и даст возможность сгенерить чуть-чуть лучший код, но это копейки: 60 vs 58 ms.
UPD2. Тот же код с классами вместо структур:
Наглядная иллюстрация gc pressure и золотого правила "ежели один человек построил, другой завсегда разобрать может"
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 и золотого правила "ежели один человек построил, другой завсегда разобрать может"