Администратор
|
|
1 | |
Оптимизации, производимые компилятором01.09.2013, 14:01. Показов 2453. Ответов 24
Метки нет (Все метки)
Это не значит, что на них можно писать только медленный код. Джеффри Рихтер утверждает, что управляемый код может работать быстрее неуправляемого при сходных алгоритмах - за счёт оптимизации на лету.
NickoTin: сообщения выделены из темы Ускоренное сложение строк
0
|
01.09.2013, 14:01 | |
Ответы с готовыми решениями:
24
Помощь с компилятором. Выбор редактора C# с компилятором Не могу разобратся с компилятором(( Как пользовать компилятором |
Master of Orion
|
|
01.09.2013, 14:31 | 2 |
tezaurismosis, кстати в итоге кроме инлайна некоторых строк и массивов особо этих оптимизаций не видно. Даже функции не инлайнятся. Хотя существуют компиляторы, которые на лету часто вызываемый код оптимизируют еще сильнее и заменяют исходный сгенерированный код на оптимизированный... А в .Net этого нету
0
|
Администратор
|
|
01.09.2013, 15:20 [ТС] | 3 |
Код на C# -(1)-> Код на IL -(2)-> Код на машинном языке
1) Вот здесь инлайн строк 2) Оптимизация для конкретной архитектуры - более эффективное использование машинных команд и др. По крайней мере, так говорят Майкрософт и Джеффри Рихтер. В чём именно заключается пункт 2 я сказать не могу. В 2007 году, когда ещё была при жизни Managed DirectX, те же Майкрософтовцы в документации приписывали проигрыш в 25% производительности (по большей части по FPS) коду на C# в сравнении с неуправляемым кодом на C++
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
01.09.2013, 15:31 | 4 |
Думаю, например, использование инструкций SSE для математики, если они поддерживаются. Конечно, при необходимости можно сделать несколько вариантов одной функции под различные процессоры и выбирать при запуске программы. При jit компиляции же это происходит естественным образом.
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
01.09.2013, 15:33 | 5 |
Код можно скомпилировать на этапе установки приложения на клиентской системе.
0
|
Master of Orion
|
|
01.09.2013, 15:35 | 6 |
tezaurismosis, ну например инлайна методов нету. Хотя бы в пределах видимости класса. Нету оптимизации алгоритма, если он один раз сгенерировался, этот код уже потом не будет наменяться на более оптимальный. И тд
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
01.09.2013, 15:43 | 7 |
В .NET 4.5 вроде же как добавили инлайны?
А зачем его снова оптимизировать, если это уже сделано при генерировании? Или JIT первый раз не до конца оптимизирует?
0
|
Master of Orion
|
|||||||||||
01.09.2013, 15:50 | 8 | ||||||||||
kolorotur, ну например после 100 прогонов выяснилось, что в метод в 90% случаев передается значение A. Тогда если мы закэшируем возвращаемое значение для А мы получим 10х прирост производительности.
Добавлено через 2 минуты Или например, что у нас есть
1
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
01.09.2013, 16:15 | 9 |
Psilon, а, вон о чем речь.
Это называется "рантайм берет на себя работу программиста, который не соизволил прогнать свой код через профайлер перед тем, как делать коммит". Даже и не знаю, хорошо это или плохо. МС, насколько мне известно, в этом плане старается по максимум придерживаться политики невмешательства: если прогер наваял пахнущий код с условиями вроде if (ConnectToDatabase() && QueryServer() && WriteToFile() && i > 0), то это проблемы прогера и его начальника, а не рантайма. В этом плане я придерживаюсь того же мнения. Я понимаю, что это всего лишь пример, но вот стало интересно: если бы оптимизатор действительно кэшировал возвращаемое значение функции, то как бы он в этих 10-и процентах вызовов определял, что значение в этот раз вернется другое и кэш надо бы обновить?
0
|
Master of Orion
|
||||||||||||||||
01.09.2013, 16:29 | 10 | |||||||||||||||
Кстати насчет: Добавлено через 5 минут Пример: возьмем такой код:
0
|
Почетный модератор
|
|||||||||||||||||||||
01.09.2013, 17:35 | 11 | ||||||||||||||||||||
Смотреть нужно код сгенерированный JIT'ом, а он будет таким:
Для x86
2
|
Master of Orion
|
||||||||||||||||
01.09.2013, 19:43 | 12 | |||||||||||||||
NickoTin, согласен, что смотреть надо x86, но я считаю, что все функции возвращающие константы должны инлайниться. Ведь
Добавлено через 2 минуты Я и говорю. Если бы на основе статистики он бы обнаружил (пусть бы в первый раз так сгенерировал, ладно), что в этом цикле все время одно и то же значение получается, то он бы запустил более глубокую проверку, обнаружил бы, что там действительно константа (а не просто такое совпадение, что 1000 раз вернулось одно значение, а на 1001 может вернуться другое) и перекомпилировал уже сгенерированный exe. Добавлено через 35 минут Кстати а вот что выдал Сшный аналог:
Не по теме: Все-таки я очень люблю С, в отличие от С++. Он простой, понятный, элегантный... Иногда даже больше шарпа:) Добавлено через 55 секунд Кстати забавно, что ASM кода меньше, чем "высокоуровневого" Добавлено через 6 минут NickoTin, кстати а куда он компилирует бинарник? Не нашел
3
|
Администратор
|
||||||
01.09.2013, 19:50 [ТС] | 13 | |||||
Psilon, удивительно, но даже если убрать inline от Get4, оптимизация остаётся (я нрассчитывал на иной результат)
Код получен в дизассемблере Visual Studio 2012 в конфигурации Release
0
|
Почетный модератор
|
|
01.09.2013, 22:12 | 15 |
Ну так с ними это и происходит во время работы JIT'а, а инлайниться в IL код не должны, потому что в .NET есть такая вещь как рефлексия и решения построенные с её использованием будут рушиться в таком случае.
Не понял какой бинарник?
Добавлено через 2 минуты Компилятор C/C++ от MS не делает акцент на inline, он может его учесть или нет в зависимости от ситуации где код используется и там где от этого инлайна действительно можно получить выгоду. Чтобы указать компилятору что функцию нужно заинлайнить используется ключевое слово __forceinline.
1
|
Master of Orion
|
|
01.09.2013, 22:13 | 16 |
ты же сам декомпильнул и получил, что он (JIT) никуда не оптимизировал ничего. Тут рефлексия не при чем.
0
|
Почетный модератор
|
|
01.09.2013, 22:21 | 17 |
Вызов метода Get4 был убран и взамен него была подставлена 4, метод Get4 даже не был отдан JIT'у на съедение. Чем не оптимизация?
Именно в этом случае да, но в общем случае компилятор не имеет право убирать методы которые явно не используются, т.к. они могут вызываться неявно.
Ммм, никуда не кладёт, JIT работает с памятью, образно, ему на вход подается массив байт представляющих собой IL код, он этот поток обрабатывает и генерирует по нему ASM код под конкретную архитектуру. Вот статья хорошая на эту тему от Daniel Pistelli: http://www.ntcore.com/files/netint_native.htm и я ничего не декомпилировал, это всё из под отладчика (WinDbg), работу JIT'а можно только так просмотреть.
0
|
Master of Orion
|
|
01.09.2013, 23:38 | 18 |
NickoTin, сколько раз встречал, что JIT компилирует один раз, а потом просто исполняет скомпилированный код. Где-то он его хранит в итоге...
0
|
Почетный модератор
|
|
02.09.2013, 00:29 | 19 |
JIT компилирует по мере необходимости/использования, скомпилированный метод располагается в памяти. Сначала загрузчик во время загрузки и инициализации типа создает заглушку для методов, когда метод вызывается первый раз эта заглушка передает управление JIT'у который компилирует метод, тем самым последующие вызовы метода будут происходить уже без участия JIT'а, заглушка заменяется на вызов скомпилированного метода. Официальное описание: http://msdn.microsoft.com/en-u... 32s8a.aspx , раздел Compilation by the JIT Compiler.
Я очень за это рад Пытайтесь пробиться в MS, в команду разработчиков JIT компилятора и производите оптимизацию алгоритмов генерации конечного кода, уверен, все Вам скажут огромнейшее спасибо если Вы добьетесь такой же оптимизации как это делает компилятор C, только стоит учесть хотя-бы несколько маленьких факторов: C компилятор - статический, JIT-же динамический, т.е. нужно будет предусмотреть множество факторов которые должны учитываться для конкретной платформы во время исполнения. Не пропускайте пожалуйста строки в моих сообщениях, я уже 2 раза писал о том что метод Get4 заинлайнен, взамен вызова подставляется 4.
1
|
Master of Orion
|
|
02.09.2013, 00:34 | 20 |
0
|
02.09.2013, 00:34 | |
02.09.2013, 00:34 | |
Помогаю со студенческими работами здесь
20
Анонимный тип - это генерация компилятором Как пользоваться компилятором командной строки csc.exe? Как можно посмотреть код, генерируемый компилятором, для итераторов Непонятки с компилятором Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |