|
-14 / 7 / 4
Регистрация: 24.02.2013
Сообщений: 234
|
|||||||||||
Быстродействие управляемого и неуправляемого кода19.06.2014, 07:56. Показов 1675. Ответов 19
Метки нет (Все метки)
начал изучать небезопасный код,написал прогу в ней 2 функции одна с управляемым кодом вторая нет,так вот сравнил время выполнения этих функций по секундомеру(программно еще не разобрался как это сделать) в итоге время выполнения каждой из функций заняло примерно 9 секунд.Вопрос в том почему время выполнения небезопасного кода =времени выполнения управляемого и как добиться прироста в скорости?
0
|
|||||||||||
| 19.06.2014, 07:56 | |
|
Ответы с готовыми решениями:
19
Вызов неуправляемого кода из длл |
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
|
| 19.06.2014, 08:48 | |
|
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 19.06.2014, 12:56 | ||
Сообщение было отмечено ardos как решение
РешениеВ безопасном контексте при доступе к элементам массива рантайм делает проверку на выход индекса за пределы. В цикле на каждой итерации делается дополнительная проверка, что при большом количестве итераций складывается и получается общая просадка по производительности. При работе с указателями выход за границы массива остается на совести разработчика, потому код должен отрабатывать быстрее... в теории. На практике же оптимизатор видит, что имеется метод, в котором объявлена локальная переменная, ссылающаяся на массив в цикле от i до длины массива. Оптимизатору несложно догадаться, что так как переменная локальная, то другой поток ее не изменит, сам массив после создания тоже не меняется, а так как цикл простой for от i до длины, то выхода за границы не может быть в принципе, потому просто не производит проверку на выход на каждой итерации. В итоге из-за оптимизаций безопасный код отрабатывает так же, как и небезопасный, потому что устраняется главная причина просадки — проверка индекса.
5
|
||
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
||
| 19.06.2014, 14:15 | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 19.06.2014, 15:00 | |
|
0
|
|
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
|
| 19.06.2014, 15:17 | |
|
0
|
|
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
| 19.06.2014, 16:16 | |
|
думаю правильней сказать что unsafe в некоторых случаях позволяет сделать что-то особое, за счет чего и достигается скорость
сам по себе unsafe в вакууме не быстрей safe в том же вакууме я не поэт конечно, но мысль вы поняли )
0
|
|
|
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
|
|
| 19.06.2014, 17:22 | |
|
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 19.06.2014, 17:53 | |||||||
Сообщение было отмечено ardos как решение
Решение![]() Разумеется, если массив большой, то любой выигрыш от отсутствия проверок будет нивелирован постоянными доступами к основной памяти для подпитки кэша, но если массив относительно небольшого размера, но обход производится часто, то разница может быть довольно ощутимой. Немножко причесанный код автора. массив небольшого размера, но обходится часто. Все, что не относится к измеряемому, вынесено из методов:
Unsafe: 00:00:05.3895866 Safe: 00:00:15.5075143 Теперь изменяем метод Safe, чтобы он вместо переменной n в проверке цикла использовал array.Length, тем самым подрубив оптимизатор, который срежет проверки: Unsafe: 00:00:05.3783892 Safe: 00:00:05.3859151 Вот теперь действительно разницы нет ![]() Что касается многомерных массивов, то, насколько мне известно, при их обходе джиттер никакой оптимизации вообще не проводит, потому небезопасный обход там всегда будет быстрее. Хотя, в последних версиях рантайма может и запилили оптимизацию.
1
|
|||||||
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
|||||||||||||||||
| 19.06.2014, 19:22 | |||||||||||||||||
Добавлено через 1 минуту У unsafe скорость подрасла. Он также был переписан
0
|
|||||||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 19.06.2014, 19:40 | |
|
pycture, вы не под отладчиком в debug-билде проверяли? Студийный отладчик по умолчанию отключает JIT-оптимизации.
Мой результат с вашими изменениями: Unsafe: 00:00:05.7764228 Safe: 00:00:15.4849475 Метод Safe скопирован из вашего сообщения, метод Unsafe не менялся. Добавлено через 2 минуты То же самое, но при запуске под студийным отладчиком: Unsafe: 00:00:31.1890356 Safe: 00:00:36.9089222
0
|
|
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
||
| 19.06.2014, 19:41 | ||
|
.net 4 win 8.1 x64 i5 3230m
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 19.06.2014, 22:19 | ||
|
Доползу до дома — проверю на Win7 x64 i5 Добавлено через 1 час 44 минуты Как и предполагалось: Unsafe: 00:00:04.4063939 Safe: 00:00:07.6066734 Это если проект отстроен под x86. Вот под x64: Unsafe: 00:00:05.1728827 Safe: 00:00:07.9313476 То же самое, но в методе Safe переменная n заменена на array.Length: Unsafe: 00:00:03.9905866 Safe: 00:00:03.7868160
0
|
||
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
|||||||
| 19.06.2014, 23:10 | |||||||
|
kolorotur, у меня так
собсно код http://ideone.com/EGnHrA и даже тут SafeJI стабильно медленее чем Safe. есть объяснение?
Добавлено через 6 минут а еще более странно что у вас код x64 под 64-битной осью работает медленее чем 32-х битная эмуляция в той же 64-х битной оси. всегда наоборот было
0
|
|||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 20.06.2014, 00:34 | ||||||
|
Судя по коду на ideone, у вас 1000х1000х1 итераций, я проверял на 1000х1000х10, может из-за этого, а может у меня память медленней. Кэширование инструкций/памяти на уровне ЦП? Как говорится, за что купил...
0
|
||||||
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
||||||
| 20.06.2014, 07:10 | ||||||
|
http://www.cpu-world.com/Compa... GA%29.html Sandy Bridge != Ivy Bridge Хотя это вопрос о медненности х64 кода на х64 оси в вашем случае не снимает у вас кстати в данном случае какие результаты? Добавлено через 2 минуты
0
|
||||||
|
Master of Orion
|
|||||||||||||||||||
| 20.06.2014, 16:04 | |||||||||||||||||||
|
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Добавлено через 28 секунд i7-3615QM win7x64 anycpu Добавлено через 1 минуту Во всех случаях менял только метод Safe. Если есть другие вариации - пишите полный код, чтобы результаты коррелировали...
0
|
|||||||||||||||||||
|
|
|
| 21.06.2014, 05:23 | |
|
Поделюсь своим опытом - оптимизация с помощью небезопасного кода 1-мерного массива особого смысла не имеет.
Вот 2х-мерных - имеет.
1
|
|
| 21.06.2014, 05:23 | |
|
Помогаю со студенческими работами здесь
20
Безопасность управляемого кода .NET
опасности неуправляемого кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|