Сообщение Re: .NET Native Performance and Internals от 28.03.2017 7:32
Изменено 15.10.2017 18:30 Serginio1
Кстати интересная статья .NET Native Performance and Internals
Там по сути там любимые сишниками тесты
MatrixMultiplication — Выполняет наивное O (n ^ 3) умножение двух целых матриц. Есть две версии этого кода — для прямоугольных (многомерных) и неровных массивов. Хороший оптимизирующий компилятор может выполнять здесь несколько оптимизаций, таких как замена циклов, векторизация, FMA и т. Д.
Рабочий стол JIT RectangularMatrixMultiplication — 50.30814ms
.NET Native RectangularMatrix Multiplication — 187.3474ms
Рабочий стол JIT JaggedMatrixMultiplication — 33.11678ms
.NET Native JaggedMatrixMultiplication — 33.08566ms
C ++ Matrix Multiplication — 21.11234ms
Мандельброт — вычисляет множество Мандельброта в заданных измерениях. Это контрольный показатель, который не имеет доступа к большому количеству памяти, но работает с узким циклом с умножениями и дополнениями, которые могут извлечь выгоду из векторизации, интеллектуального распределения регистров, переопределения команд и других соображений, которые использует оптимизирующий компилятор. Из всех приведенных выше показателей это, пожалуй, самый реалистичный с точки зрения количества и качества кода.
Обои для рабочего JIT Mandelbrot — 32.18214ms
.NET Native Mandelbrot — 46.48744ms
C ++ Mandelbrot — 15.26277ms
Полученные результаты довольно убедительны. На данный момент .NET Native не использует никаких оптимизаций супер-умного компилятора, которые приводят его производительность в соответствие с кодом на C ++. В некоторых случаях он даже генерирует код, который не подпадает под JIT рабочего стола (в частности, прямоугольные массивы и тесты Mandelbrot). Важно помнить, что это все еще предварительный просмотр, и я буду очень рад повторить эти измерения, когда будет выпущена обновленная версия .NET Native. Я знаю, что команда .NET Native активно работает над оптимизацией компилятора.
Пока C++ в сложных для .Net Jita алгоритмах проигрывает C++ в 2 раза. .Net Native пока сырой
Это данные от 14 года.
Скомпилировал на 2017 студии.
Вот данные в VS 2015
AddVectors — 1.35302ms
NativeAddVectors — 0.93864ms
AddScalarToVector — 1.18009ms
NativeAddScalarToVector — 0.7964ms
InterfaceDevirtualization — 3.06194ms
AbstractClassDevirtualization — 2.22129ms
Memcpy — 1.07673ms
NativeMemcpy — 0.45323ms
MulDivShifts — 5.24405ms
NativeMulDivShifts — 4.65341ms
RectangularMatrixMultiplication — 83.31062ms
JaggedMatrixMultiplication — 44.85074ms
NativeMatrixMultiplication — 18.64064ms
Mandelbrot — 11.69964ms
NativeMandelbrot — 15.41565ms
Discrepancies on Mandelbrot: 0
Вот тот же код для VS 2017 только для манагед. С++ пока ошибка. Нужно скомпилировать под win 10
AddVectors — 0,83342ms
AddScalarToVector — 0,50806ms
InterfaceDevirtualization — 2,14707ms
AbstractClassDevirtualization — 2,16749ms
Memcpy — 0,68196ms
MulDivShifts — 4,61984ms
RectangularMatrixMultiplication — 37,0944ms
JaggedMatrixMultiplication — 36,38963ms
Mandelbrot — 9,40842ms
То есть ускорение в 1.5-2 раза
И очень близко к реальному нативу
Сделал отчет для .Net Core
AddVectors — 1,2154ms
AddScalarToVector — 0,99208ms
InterfaceDevirtualization — 2,79406ms
AbstractClassDevirtualization — 2,14465ms
Memcpy — 0,6675ms
MulDivShifts — 4,8818ms
RectangularMatrixMultiplication — 85,2632ms
JaggedMatrixMultiplication — 40,28376ms
Mandelbrot — 10,1158ms
Для .Net Core 2
AddVectors — 1,14375ms
AddScalarToVector — 0,79344ms
InterfaceDevirtualization — 0,308ms
AbstractClassDevirtualization — 0,30543ms
Memcpy — 0,666 ms
MulDivShifts — 4,97312ms
RectangularMatrixMultiplication — 125,5858ms
JaggedMatrixMultiplication — 67,31645ms
Mandelbrot — 10,0221ms
Интересно, что
InterfaceDevirtualization,AbstractClassDevirtualization ускорился раз в 10, а скорость
RectangularMatrixMultiplication,JaggedMatrixMultiplication наоборот увеличилась в 1,5 раза
Кстати интересная статья .NET Native Performance and Internals
Там по сути там любимые сишниками тесты
MatrixMultiplication — Выполняет наивное O (n ^ 3) умножение двух целых матриц. Есть две версии этого кода — для прямоугольных (многомерных) и неровных массивов. Хороший оптимизирующий компилятор может выполнять здесь несколько оптимизаций, таких как замена циклов, векторизация, FMA и т. Д.
Рабочий стол JIT RectangularMatrixMultiplication — 50.30814ms
.NET Native RectangularMatrix Multiplication — 187.3474ms
Рабочий стол JIT JaggedMatrixMultiplication — 33.11678ms
.NET Native JaggedMatrixMultiplication — 33.08566ms
C ++ Matrix Multiplication — 21.11234ms
Мандельброт — вычисляет множество Мандельброта в заданных измерениях. Это контрольный показатель, который не имеет доступа к большому количеству памяти, но работает с узким циклом с умножениями и дополнениями, которые могут извлечь выгоду из векторизации, интеллектуального распределения регистров, переопределения команд и других соображений, которые использует оптимизирующий компилятор. Из всех приведенных выше показателей это, пожалуй, самый реалистичный с точки зрения количества и качества кода.
Обои для рабочего JIT Mandelbrot — 32.18214ms
.NET Native Mandelbrot — 46.48744ms
C ++ Mandelbrot — 15.26277ms
Полученные результаты довольно убедительны. На данный момент .NET Native не использует никаких оптимизаций супер-умного компилятора, которые приводят его производительность в соответствие с кодом на C ++. В некоторых случаях он даже генерирует код, который не подпадает под JIT рабочего стола (в частности, прямоугольные массивы и тесты Mandelbrot). Важно помнить, что это все еще предварительный просмотр, и я буду очень рад повторить эти измерения, когда будет выпущена обновленная версия .NET Native. Я знаю, что команда .NET Native активно работает над оптимизацией компилятора.
Пока C++ в сложных для .Net Jita алгоритмах проигрывает C++ в 2 раза. .Net Native пока сырой
Это данные от 14 года.
Скомпилировал на 2017 студии.
Вот данные в VS 2015
AddVectors — 1.35302ms
NativeAddVectors — 0.93864ms
AddScalarToVector — 1.18009ms
NativeAddScalarToVector — 0.7964ms
InterfaceDevirtualization — 3.06194ms
AbstractClassDevirtualization — 2.22129ms
Memcpy — 1.07673ms
NativeMemcpy — 0.45323ms
MulDivShifts — 5.24405ms
NativeMulDivShifts — 4.65341ms
RectangularMatrixMultiplication — 83.31062ms
JaggedMatrixMultiplication — 44.85074ms
NativeMatrixMultiplication — 18.64064ms
Mandelbrot — 11.69964ms
NativeMandelbrot — 15.41565ms
Discrepancies on Mandelbrot: 0
Вот тот же код для VS 2017 только для манагед. С++ пока ошибка. Нужно скомпилировать под win 10
AddVectors — 0,83342ms
AddScalarToVector — 0,50806ms
InterfaceDevirtualization — 2,14707ms
AbstractClassDevirtualization — 2,16749ms
Memcpy — 0,68196ms
MulDivShifts — 4,61984ms
RectangularMatrixMultiplication — 37,0944ms
JaggedMatrixMultiplication — 36,38963ms
Mandelbrot — 9,40842ms
То есть ускорение в 1.5-2 раза
И очень близко к реальному нативу
Cltkfk
Сделал отчет для .Net Core
AddVectors — 1,2154ms
AddScalarToVector — 0,99208ms
InterfaceDevirtualization — 2,79406ms
AbstractClassDevirtualization — 2,14465ms
Memcpy — 0,6675ms
MulDivShifts — 4,8818ms
RectangularMatrixMultiplication — 85,2632ms
JaggedMatrixMultiplication — 40,28376ms
Mandelbrot — 10,1158ms
Для .Net Core 2
AddVectors — 1,14375ms
AddScalarToVector — 0,79344ms
InterfaceDevirtualization — 0,308ms
AbstractClassDevirtualization — 0,30543ms
Memcpy — 0,666 ms
MulDivShifts — 4,97312ms
RectangularMatrixMultiplication — 125,5858ms
JaggedMatrixMultiplication — 67,31645ms
Mandelbrot — 10,0221ms
Интересно, что
InterfaceDevirtualization,AbstractClassDevirtualization ускорился раз в 10, а скорость
RectangularMatrixMultiplication,JaggedMatrixMultiplication наоборот увеличилась в 1,5 раза
Для .Net Native результаты те же