С# vs C++, голые цифры
От: IID Россия  
Дата: 19.05.09 20:30
Оценка: 11 (6) +5 -1 :))
В соселней ветке "Работа — с чего начать: С++ или С#?" было озвучено мнение
Автор: samius
Дата: 19.05.09
, что C# немного медленее С++. И даже предложен код на C#
Автор: IID
Дата: 19.05.09
.

Я привёл код в компилябельное состояние. Вот C# вариант, а вот C++ вариант. Для компиляции использовалась MSVS2008 со всеми обновлениями.
— компилятор C# версии 3.5 Настроки релизной сборки — дефолтные. (Там-то и настраивать особо нечего).
— компилятор Intel С++ 11.0.072. Релизная сборка кастомизирована. Впрочем, разница между дефолтной релизной сборкой и кастомизированной невелика, порядка 10-15%. Ключи компиляции:

/c /O2 /Og /Oi /Ot /Oy /Qipo /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /EHsc /MD /GS- /Gy /fp:fast /Yu"StdAfx.h" /Fp"Release/SpeedTestCpp.pch" /Fo"Release/" /W3 /nologo /Zi /QxSSSE3 /Qparallel /Qprof_use /Qprof_dir "Release"


Тестовая машина: Intel Core2 Q6600, 800mhz RAM 8Gb. ОС — Windows 7 RC1 x64. Программы собирались для x86.
Условия прогона: в диапазонах, указанных автором оригинального C# кода. Шаг по X/Y составляет 0.001 (всего за прогон обсчитывается 9млн пикселей). Делается 100(сто) прогонов подряд. Вычисляется суммарное время.
Побочные эффекты: практически исключены. Сторонней нагрузки не было, taskmgr показывал загрузку только одного ядра во время прогонов. Т.е. гипотеза о том что интел компилер сумел заюзать несколько ядер отпадает.

Результаты:
С#: 2m 14s (134 секунды)
С++: 27 секунд

С++ показал практически пятикратное преимущество (496%), обеспечив обсчёт ~33.33млн пикселей в секунду. C# осилил только ~6.71млн пикселей в секунду. (что довольно близко к результату автора в 5.9млн пикселей)

Итог: подавляющее превосходство С++. Не "немного быстрее", как утверждал автор, а в разы. Причём задача сводилась, фактически, только к грамотному распихиванию FPU команд. Интересно было бы посмотреть на работу с битами. Думаю, тут интел смог бы обеспечить ещё больший отрыв.
kalsarikännit
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.