|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
Скорость работы кэша памяти и стека04.07.2013, 21:26. Показов 3088. Ответов 9
Метки нет (Все метки)
Иногда возникает необходимость очень часто вызывать метод в котором создаются структуры для вычислений внутри метода, то есть временные данные. Возникает вопрос, лучше в классе создать постоянную переменную и крутить именно её, с целью избежать выделения памяти и потери времени, или же оптимальней создавать структуру внутри метода, так как она создаётся в памяти процессора?
Спасибо.
0
|
|
| 04.07.2013, 21:26 | |
|
Ответы с готовыми решениями:
9
Выравнивание памяти и скорость работы.
создать стек в памяти из этих чисел таким образом, чтобы на вершине стека было самое большое число. Удалить из стека все отрицательные элементы. |
|
Master of Orion
|
||
| 04.07.2013, 21:55 | ||
|
danrusm, эти микрооптимизации практически не помогают. Если компилятору будет удобней, он вынесет переменную из цикла наружу. Если же вы про вынос локальной переменной из метода -то читаемость >> скорости. Это мне напоминается меня, когда я только начинал программировать, я для цикла везде где только мог вместо int везде писал byte, чтобы не расходовать лишнюю память
![]() Добавлено через 1 минуту Приведу цитату из авторитетного источника:
Ну и простыня побольше, которая подробно объясняет что к чему :)
С рефакторингом обычно связан вопрос о его влиянии на производительность программы. С целью
облегчить понимание работы программы часто осуществляется модификация, приводящая к замедлению выполнения программы. Это важный момент. Я не принадлежу к той школе, которая пренебрегает производительностью в пользу чистоты проекта или в надежде на рост мощности аппаратной части. Программное обеспечение отвергалось как слишком медленное, а более быстрые машины устанавливают свои правила игры. Рефакторинг, несомненно, заставляет программу выполняться медленнее, но при этом делает ее более податливой для настройки производительности. Секрет создания быстрых программ, если только они не предназначены для работы в жестком режиме реального времени, состоит в том, чтобы сначала написать программу, которую можно настраивать, а затем настроить ее так, чтобы достичь приемлемой скорости. Мне известны три подхода к написанию быстрых программ. Наиболее трудный из них связан с ресурсами времени и часто применяется в системах с жесткими требованиями к выполнению в режиме реального времени. В этой ситуации при декомпозиции проекта каждому компоненту выделяется бюджет ресурсов - по времени и памяти. Компонент не должен выйти за рамки своего бюджета, хотя разрешен механизм обмена временными ресурсами. Такой механизм жестко сосредоточен на соблюдении времени выполнения. Это важно в таких системах, как, например, кардиостимуляторы, в которых данные, полученные с опозданием, всегда ошибочны. Данная технология избыточна в системах другого типа, например в корпоративных информационных системах, с которыми я обычно работаю. Второй подход предполагает постоянное внимание. В этом случае каждый программист в любой момент времени делает все от него зависящее, чтобы поддерживать высокую производительность программы. Это распространенный и интуитивно привлекательный подход, однако он не так хорош на деле. Модификация, повышающая производительность, обычно затрудняет работу с программой. Это замедляет создание программы. На это можно было бы пойти, если бы в результате получалось более быстрое программное обеспечение, но обычно этого не происходит. Повышающие скорость усовершенствования разбросаны по всей программе, и каждое из них касается только узкой функции, выполняемой программой. С производительностью связано то интересное обстоятельство, что при анализе большинства программ обнаруживается, что большая часть времени расходуется небольшой частью кода. Если в равной мере оптимизировать весь код, то окажется, что 90% оптимизации произведено впустую, потому что оптимизировался код, который выполняется не слишком часто. Время, ушедшее на ускорение программы, и время, потерянное из-за ее непонятности - все это израсходовано напрасно. Третий подход к повышению производительности программы основан как раз на этой статистике. Он предполагает создание программы с достаточным разложением ее на компоненты без оглядки на достигаемую производительность вплоть до этапа оптимизации производительности, который обычно наступает на довольно поздней стадии разработки и на котором осуществляется особая процедура настройки программы. Начинается все с запуска программы под профайлером, контролирующим программу и сообщающим, где расходуются время и память. Благодаря этому можно обнаружить тот небольшой участок программы, в котором находятся узкие места производительности. На этих узких местах сосредоточиваются усилия, и осуществляется та же самая оптимизация, которая была бы применена при подходе с постоянным вниманием. Но благодаря тому, что внимание сосредоточено на выявленных узких местах, удается достичь больших результатов при значительно меньших затратах труда. Но даже в этой ситуации необходима бдительность. Как и при проведении рефакторинга, изменения следует вносить небольшими порциями, каждый раз компилируя, тестируя и запуская профайлер. Если производительность не увеличилась, изменениям дается обратный ход. Процесс поиска и ликвидации узких мест продолжается до достижения производительности, которая удовлетворяет пользователей. Мак-Коннелл [McConnell] подробно рассказывает об этой технологии. Хорошее разделение программы на компоненты способствует оптимизации такого рода в двух отношениях. Во-первых, благодаря ему появляется время, которое можно потратить на оптимизацию. Имея хорошо структурированный код, можно быстрее добавлять новые функции и выиграть время для того, чтобы заняться производительностью. (Профилирование гарантирует, что это время не будет потрачено зря.) Во- вторых, хорошо структурированная программа обеспечивает более высокое разрешение для анализа производительности. Профайлер указывает на более мелкие фрагменты кода, которые легче настроить. Благодаря большей понятности кода легче осуществить выбор возможных вариантов и разобраться в том, какого рода настройка может оказаться действенной. Я пришел к выводу, что рефакторинг позволяет мне писать программы быстрее. На некоторое время он делает программы более медленными, но облегчает настройку программ на этапе оптимизации. В конечном счете достигается большой выигрыш.
1
|
||
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 05.07.2013, 08:00 [ТС] | |
|
Ну с подходом, пишите и сильно не заморачивайтесь, при тестировании узкие места поправите, я знаком, считаю это очень правильным. Был как то код, в котором при возврате из метода надо было возвращать структуру, собираемую из динамичных данных, размер у неё был 320 байт, ну и я её каждый раз создавал из этих данных, а при тесте обнаружил что это самое узкое место. Создал переменную и менял её в те моменты когда менялись данные, что намного реже чем обращение к методу, в методе возвращал уже готовую структуру. Прирост был ощутимым. Наверно больше интересно когда выделение памяти происходит именно в процессоре, а когда в оперативке.
Я понимаю что бываю разные случаи, просто хотелось узнать мнение других программистов.
0
|
|
|
Master of Orion
|
||
| 05.07.2013, 08:30 | ||
|
danrusm, жамкаете в студии alt+f2 и смотрите, что где когда и сколько работало и сколько памяти кушало.
В принципе я догадываюсь, что вы хотели сказать, но звучит... Странновато. C# не имеет доступа к низкоуровневой информации, программист не может распихивать по регистрам, как в С, и тд
1
|
||
|
Почетный модератор
|
||
| 05.07.2013, 11:45 | ||
|
1
|
||
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 05.07.2013, 20:40 [ТС] | |
|
То есть структура, с корнями не далее одного метода размещается в оперативной памяти и потом уже оперирует в регистрах процессора? Если так, то при необходимости оптимизации в любом случае лучше если память уже выделена. Тогда последний вопрос, существует ли вероятность что данные не будут созданы в оперативной памяти, а сразу в регистрах процессора или в его кеше? Всё касаемо именно сишарпа.
0
|
|
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 06.07.2013, 07:52 [ТС] | |
|
Ассемблер читал для ознакомления, и даже не одну книгу, правда не писал ничего. А при чём тут знания, это всего лишь вопрос по работе компилятора. Некоторые моменты доходят через форумы, не всегда вся картина понятна из книг. Всё что мне надо, так это понять, стоит ли сохранять поля структур, или инициировать в методе и какие могут быть нюансы в зависимости от размера структур.
Добавлено через 4 минуты Ну хотя судя по вашей реакции ясно что память в любом случае выделяется. Всем спасибо, очень помогли.
0
|
|
|
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
|
|
| 07.07.2013, 21:11 | |
|
Мне кажется , что автор думает что стек размещается в процессоре, на самом деле стек размещен в озу
0
|
|
| 07.07.2013, 21:11 | |
|
Помогаю со студенческими работами здесь
10
Перераспределение памяти для стека
Переполнение стека во время освобождения памяти
Организация памяти и стека и отладка в AVRstudio Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|