Всем привет.
Вчера наконец заборол кросс-платформенную сборку для бенчмарков linq2d.
Получил какие-то удивительные результаты.
Вкратце, что происходит: я вызываю пару функций из нативной .dll/.so через интероп.
На винде dll собирается MS VC.
На linux so собирается g++.
Замеряем быстродействие там и там — получаем, что плюсовый код на винде чуточку быстрее аналогичного unsafe-кода на дотнете:
Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
| CppC4 | InProcess | InProcessEmitToolchain | p00743.bmp | 125.56 ms | 1.562 ms | 1.385 ms | 0.87 | 0.02 |
| UnsafeC4 | InProcess | InProcessEmitToolchain | p00743.bmp | 144.90 ms | 2.675 ms | 2.502 ms | 1.00 | 0.00 |
| NaturalC4 | InProcess | InProcessEmitToolchain | p00743.bmp | 284.03 ms | 3.851 ms | 3.006 ms | 1.96 | 0.03 |
На линуксе получаем какой-то сюр:
Intel Xeon Platinum 8171M CPU 2.60GHz, 1 CPU, 2 logical and 2 physical cores
| Method | FileName | Mean | Error | StdDev | Ratio | RatioSD |
|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
| CppC4 | p00743.bmp | 330.92 ms | 1.103 ms | 0.921 ms | 2.73 | 0.03 |
| NaturalC4 | p00743.bmp | 318.12 ms | 1.053 ms | 0.822 ms | 2.62 | 0.03 |
| UnsafeC4 | p00743.bmp | 121.07 ms | 1.679 ms | 1.571 ms | 1.00 | 0.00 |
Это там интероп такой дорогой, или это я не сумел включить релизную конфигурацию сборки для g++?
Здравствуйте, Sinclair, Вы писали:
S>Всем привет.
S>Вчера наконец заборол кросс-платформенную сборку для бенчмарков linq2d.
S>Получил какие-то удивительные результаты.
S>Вкратце, что происходит: я вызываю пару функций из нативной .dll/.so через интероп.
S>На винде dll собирается MS VC.
S>На linux so собирается g++.
S>Замеряем быстродействие там и там — получаем, что плюсовый код на винде чуточку быстрее аналогичного unsafe-кода на дотнете:
S>S>Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
S>| CppC4 | InProcess | InProcessEmitToolchain | p00743.bmp | 125.56 ms | 1.562 ms | 1.385 ms | 0.87 | 0.02 |
S>| UnsafeC4 | InProcess | InProcessEmitToolchain | p00743.bmp | 144.90 ms | 2.675 ms | 2.502 ms | 1.00 | 0.00 |
S>| NaturalC4 | InProcess | InProcessEmitToolchain | p00743.bmp | 284.03 ms | 3.851 ms | 3.006 ms | 1.96 | 0.03 |
S>
S>На линуксе получаем какой-то сюр:
S>S>Intel Xeon Platinum 8171M CPU 2.60GHz, 1 CPU, 2 logical and 2 physical cores
S>| Method | FileName | Mean | Error | StdDev | Ratio | RatioSD |
S>|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
S>| CppC4 | p00743.bmp | 330.92 ms | 1.103 ms | 0.921 ms | 2.73 | 0.03 |
S>| NaturalC4 | p00743.bmp | 318.12 ms | 1.053 ms | 0.822 ms | 2.62 | 0.03 |
S>| UnsafeC4 | p00743.bmp | 121.07 ms | 1.679 ms | 1.571 ms | 1.00 | 0.00 |
S>
S>Это там интероп такой дорогой, или это я не сумел включить релизную конфигурацию сборки для g++?
-O3/O2 в обычном gcc или llvm пробовал в линуксе?
В linux много базовых классов из netcore прекомпилировано в so майкрософтом и я не видел потерь от этого по сравнению с виндовс на однопоточных числодробительных задачах, хотя многопоточная синхронизация в линуксе в 2 раза медленее, чем в windows
Здравствуйте, VladCore, Вы писали:
VC>-O3/O2 в обычном gcc или llvm пробовал в линуксе?
VC>В linux много базовых классов из netcore прекомпилировано в so майкрософтом и я не видел потерь от этого по сравнению с виндовс на однопоточных числодробительных задачах, хотя многопоточная синхронизация в линуксе в 2 раза медленее, чем в windows
Спасибо большое, действительно, там какая-то кривда при сохранении С++ проектов в Visual Studio. Судя по всему, какие-то настройки считаются дефолтными, и он в Release в явном виде состояние флагов компиляции не сохраняет.
gccBuildTargets честно конвертирует настройки проекта в параметры g++, и туда ничего не попадало. Сейчас пробую перебилдить с
<Optimization>Full</Optimization>, который должен мапиться в
-O3.
Вот тут будут результаты:
https://github.com/evilguest/linq2d/runs/1213262916?check_suite_focus=true
Здравствуйте, VladCore, Вы писали:
S>>S>>Intel Xeon Platinum 8171M CPU 2.60GHz, 1 CPU, 2 logical and 2 physical cores
S>>| Method | FileName | Mean | Error | StdDev | Ratio | RatioSD |
S>>|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
S>>| CppC4 | p00743.bmp | 330.92 ms | 1.103 ms | 0.921 ms | 2.73 | 0.03 |
S>>| NaturalC4 | p00743.bmp | 318.12 ms | 1.053 ms | 0.822 ms | 2.62 | 0.03 |
S>>| UnsafeC4 | p00743.bmp | 121.07 ms | 1.679 ms | 1.571 ms | 1.00 | 0.00 |
S>>
S>>Это там интероп такой дорогой, или это я не сумел включить релизную конфигурацию сборки для g++?
VC>-O3/O2 в обычном gcc или llvm пробовал в линуксе?
Да, вы были правы:
Intel Xeon CPU E5-2673 v4 2.30GHz, 1 CPU, 2 logical and 2 physical cores
Job=InProcess Toolchain=InProcessEmitToolchain
| Method | FileName | Mean | Error | StdDev | Ratio | RatioSD |
|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
| CppC4 | p00743.bmp | 61.42 ms | 0.975 ms | 0.864 ms | 0.55 | 0.01 |
| NaturalC4 | p00743.bmp | 252.15 ms | 5.038 ms | 8.555 ms | 2.24 | 0.07 |
| UnsafeC4 | p00743.bmp | 111.86 ms | 1.666 ms | 1.558 ms | 1.00 | 0.00 |
Здравствуйте, Sinclair, Вы писали:
S>Да, вы были правы:
S>S>Intel Xeon CPU E5-2673 v4 2.30GHz, 1 CPU, 2 logical and 2 physical cores
S>Job=InProcess Toolchain=InProcessEmitToolchain
S>| Method | FileName | Mean | Error | StdDev | Ratio | RatioSD |
S>|------------------- |----------- |----------:|---------:|---------:|------:|--------:|
S>| CppC4 | p00743.bmp | 61.42 ms | 0.975 ms | 0.864 ms | 0.55 | 0.01 |
S>| NaturalC4 | p00743.bmp | 252.15 ms | 5.038 ms | 8.555 ms | 2.24 | 0.07 |
S>| UnsafeC4 | p00743.bmp | 111.86 ms | 1.666 ms | 1.558 ms | 1.00 | 0.00 |
S>
Вдуг пригодится — что бы на всех линуксах работало собирать приходится на старых версиях линукса. Я как то разбирался с этим вопросом и вот выжимка на каких линуксах под какую архитектуру что можно собрать в докере переносимое:
https://github.com/devizer/Universe.NativeLinux.Interop#precompiled-native-shared-objects
2.15 for x86_64, armhf, i386 (Ubuntu 12.04 LTS Precise)
2.19 for arm64, ppc64el (Ubuntu 14.04 LTS Trusty)
2.13 for armel & powerpc (Debian 7 Wheezy)
2.24 for mips64el: (Debian 9 Stretch)
2.12 for RHEL/CentOS 6 x84_64
По теме — Электрон свои бинарники кстати тоже на 12й убунте собирает под x86_64
Все архитектуры на x86_64 кстати собираются без мучений крос компиляции — сила докера)