Здравствуйте, alexzz, Вы писали:
A>Там дальше по теме Sinix привёл unsafe вариант на C#, который работает в 1,8 раза быстрее оригинала на C#.
Угу. Сделав дико страшный код (в сравнение и с C# оригиналом и с C++ оригиналом) он сумел ускориться в пару раз, но при этом отставание в разы от C++ всё равно сохранилось. )))
A>Я написал свой вариант на C#, работает ещё быстрее оригинала, в 2,3 раза: http://pastebin.com/v2ZMRu86
A>original: 9881
A>optimized: 4342
ОК, я протестировал этот код на той же машине, что и в тех сообщения. Так что могу поздравить: в данных результатах
http://rsdn.ru/forum/philosophy/6117201.1Автор: alex_public
Дата: 18.07.15
мы смело можем заменить значение для C# unsafe с 5,0 секунд на 4,6 секунды. Что впрочем вообще никак не меняет общую картину.
Кстати, возник ещё один интересный нюанс. Оригинальный C# из данного исходника исполнялся у меня 8,1 секунды, а не 8,7 секунды, как в изначальном коде. Хотя всё выглядит практически одинаково. Я немного поигрался с кодом и выяснил, что это происходит при передаче данных в Test в виде параметров (у меня это были статические члены класса приложения). Это конечно же характеризует оптимизатор .net с интересной стороны. )))
A>У меня давно сложилось и продолжает укрепляться подозрение, что C++ ощутимо (хотя бы раза в два) быстрее C# только там, где повезёт и задачу можно векторизовать, и компилятор C++ сумеет при этом применить свою векторизовальную магию. А если не повезёт, то быстрее может и вообще не получиться.
Это неверное подозрение. Что очевидно и из практики (см. ссылку выше, там есть цифры для C++ без simd) и из общетеоретических соображений. Кроме отсутствия автовекторизации, C# (а точнее .net) обладает ещё целым букетом замедляющих факторов, происходящих из самого устройства платформы. Это не говоря уже о просто слабом оптимизаторе.