Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318

Скорость работы кэша памяти и стека

04.07.2013, 21:26. Показов 3088. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Иногда возникает необходимость очень часто вызывать метод в котором создаются структуры для вычислений внутри метода, то есть временные данные. Возникает вопрос, лучше в классе создать постоянную переменную и крутить именно её, с целью избежать выделения памяти и потери времени, или же оптимальней создавать структуру внутри метода, так как она создаётся в памяти процессора?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2013, 21:26
Ответы с готовыми решениями:

Выравнивание памяти и скорость работы.
Есть ли преимущество использования переменных длинной в 4 байта в 32 битных процессорах ARM в смысле скорости? Помнится мне, в 32 битных...

Скорость чтения команд из кэша
Здравствуйте! Задали на курсовую работу такую тему "Определение скорость чтения команд из кэша". Ассемблер не знаю совсем, но...

создать стек в памяти из этих чисел таким образом, чтобы на вершине стека было самое большое число. Удалить из стека все отрицательные элементы.
Помогите решить. В файл записывается последовательность целых чисел. Прочитать последовательность из файла и создать стек в памяти из...

9
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 21:55
danrusm, эти микрооптимизации практически не помогают. Если компилятору будет удобней, он вынесет переменную из цикла наружу. Если же вы про вынос локальной переменной из метода -то читаемость >> скорости. Это мне напоминается меня, когда я только начинал программировать, я для цикла везде где только мог вместо int везде писал byte, чтобы не расходовать лишнюю память

Добавлено через 1 минуту
Приведу цитату из авторитетного источника:
Также вызывает беспокойство, связанное с такого вида рефакторингом, возможное падение
производительности. Прежний код выполнял цикл while один раз, новый код выполняет его три раза. Долго
выполняющийся цикл while может снизить производительность. Многие программисты отказались бы от
подобного рефакторинга лишь по данной причине. Но обратите внимание на слово «может». До проведения
профилирования невозможно сказать, сколько времени требует цикл для вычислений и происходит ли
обращение к циклу достаточно часто, чтобы повлиять на итоговую производительность системы. Не
беспокойтесь об этих вещах во время проведения рефакторинга. Когда вы приступите к оптимизации, тогда и
нужно будет об этом беспокоиться, но к тому времени ваше положение окажется значительно более выгодным
для ее проведения и у вас будет больше возможностей для эффективной оптимизации.
Добавлено через 1 минуту
Ну и простыня побольше, которая подробно объясняет что к чему :)
С рефакторингом обычно связан вопрос о его влиянии на производительность программы. С целью
облегчить понимание работы программы часто осуществляется модификация, приводящая к замедлению
выполнения программы. Это важный момент. Я не принадлежу к той школе, которая пренебрегает
производительностью в пользу чистоты проекта или в надежде на рост мощности аппаратной части.
Программное обеспечение отвергалось как слишком медленное, а более быстрые машины устанавливают свои
правила игры. Рефакторинг, несомненно, заставляет программу выполняться медленнее, но при этом делает ее
более податливой для настройки производительности. Секрет создания быстрых программ, если только они не
предназначены для работы в жестком режиме реального времени, состоит в том, чтобы сначала написать
программу, которую можно настраивать, а затем настроить ее так, чтобы достичь приемлемой скорости.


Мне известны три подхода к написанию быстрых программ. Наиболее трудный из них связан с ресурсами
времени и часто применяется в системах с жесткими требованиями к выполнению в режиме реального времени.
В этой ситуации при декомпозиции проекта каждому компоненту выделяется бюджет ресурсов - по времени и
памяти. Компонент не должен выйти за рамки своего бюджета, хотя разрешен механизм обмена временными
ресурсами. Такой механизм жестко сосредоточен на соблюдении времени выполнения. Это важно в таких
системах, как, например, кардиостимуляторы, в которых данные, полученные с опозданием, всегда ошибочны.
Данная технология избыточна в системах другого типа, например в корпоративных информационных системах,
с которыми я обычно работаю.


Второй подход предполагает постоянное внимание. В этом случае каждый программист в любой момент
времени делает все от него зависящее, чтобы поддерживать высокую производительность программы. Это
распространенный и интуитивно привлекательный подход, однако он не так хорош на деле. Модификация,
повышающая производительность, обычно затрудняет работу с программой. Это замедляет создание
программы. На это можно было бы пойти, если бы в результате получалось более быстрое программное
обеспечение, но обычно этого не происходит. Повышающие скорость усовершенствования разбросаны по всей
программе, и каждое из них касается только узкой функции, выполняемой программой.


С производительностью связано то интересное обстоятельство, что при анализе большинства программ
обнаруживается, что большая часть времени расходуется небольшой частью кода. Если в равной мере
оптимизировать весь код, то окажется, что 90% оптимизации произведено впустую, потому что
оптимизировался код, который выполняется не слишком часто. Время, ушедшее на ускорение программы, и
время, потерянное из-за ее непонятности - все это израсходовано напрасно.


Третий подход к повышению производительности программы основан как раз на этой статистике. Он
предполагает создание программы с достаточным разложением ее на компоненты без оглядки на достигаемую
производительность вплоть до этапа оптимизации производительности, который обычно наступает на довольно
поздней стадии разработки и на котором осуществляется особая процедура настройки программы.


Начинается все с запуска программы под профайлером, контролирующим программу и сообщающим, где
расходуются время и память. Благодаря этому можно обнаружить тот небольшой участок программы, в
котором находятся узкие места производительности. На этих узких местах сосредоточиваются усилия, и
осуществляется та же самая оптимизация, которая была бы применена при подходе с постоянным вниманием.
Но благодаря тому, что внимание сосредоточено на выявленных узких местах, удается достичь больших
результатов при значительно меньших затратах труда. Но даже в этой ситуации необходима бдительность. Как
и при проведении рефакторинга, изменения следует вносить небольшими порциями, каждый раз компилируя,
тестируя и запуская профайлер. Если производительность не увеличилась, изменениям дается обратный ход.
Процесс поиска и ликвидации узких мест продолжается до достижения производительности, которая
удовлетворяет пользователей. Мак-Коннелл [McConnell] подробно рассказывает об этой технологии.


Хорошее разделение программы на компоненты способствует оптимизации такого рода в двух
отношениях. Во-первых, благодаря ему появляется время, которое можно потратить на оптимизацию. Имея
хорошо структурированный код, можно быстрее добавлять новые функции и выиграть время для того, чтобы
заняться производительностью. (Профилирование гарантирует, что это время не будет потрачено зря.) Во-
вторых, хорошо структурированная программа обеспечивает более высокое разрешение для анализа
производительности. Профайлер указывает на более мелкие фрагменты кода, которые легче настроить.
Благодаря большей понятности кода легче осуществить выбор возможных вариантов и разобраться в том,
какого рода настройка может оказаться действенной.


Я пришел к выводу, что рефакторинг позволяет мне писать программы быстрее. На некоторое время он
делает программы более медленными, но облегчает настройку программ на этапе оптимизации. В конечном
счете достигается большой выигрыш.
1
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
05.07.2013, 08:00  [ТС]
Ну с подходом, пишите и сильно не заморачивайтесь, при тестировании узкие места поправите, я знаком, считаю это очень правильным. Был как то код, в котором при возврате из метода надо было возвращать структуру, собираемую из динамичных данных, размер у неё был 320 байт, ну и я её каждый раз создавал из этих данных, а при тесте обнаружил что это самое узкое место. Создал переменную и менял её в те моменты когда менялись данные, что намного реже чем обращение к методу, в методе возвращал уже готовую структуру. Прирост был ощутимым. Наверно больше интересно когда выделение памяти происходит именно в процессоре, а когда в оперативке.
Я понимаю что бываю разные случаи, просто хотелось узнать мнение других программистов.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.07.2013, 08:30
danrusm, жамкаете в студии alt+f2 и смотрите, что где когда и сколько работало и сколько памяти кушало.

Наверно больше интересно когда выделение памяти происходит именно в процессоре, а когда в оперативке.
Чего?о_0

В принципе я догадываюсь, что вы хотели сказать, но звучит... Странновато.
C# не имеет доступа к низкоуровневой информации, программист не может распихивать по регистрам, как в С, и тд
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
05.07.2013, 11:45
Цитата Сообщение от danrusm Посмотреть сообщение
структуру внутри метода, так как она создаётся в памяти процессора?
Память под структуру будет выделена в стеке, шанс того что она попадет в кэш процессора есть, но только если будет замечено что к участку памяти идёт очень частое постоянное обращение. Вы не можете самостоятельно управлять данными в кэше процессора, это контролирует процессор.
1
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
05.07.2013, 20:40  [ТС]
То есть структура, с корнями не далее одного метода размещается в оперативной памяти и потом уже оперирует в регистрах процессора? Если так, то при необходимости оптимизации в любом случае лучше если память уже выделена. Тогда последний вопрос, существует ли вероятность что данные не будут созданы в оперативной памяти, а сразу в регистрах процессора или в его кеше? Всё касаемо именно сишарпа.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.07.2013, 22:05
danrusm, вы вообще представляете, как работает процессор, ЭВМ, шина данных, адресная шина, и т.д.? Что такое регистры, кэш, кэш-промах, виртуальная адресация...
0
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
06.07.2013, 07:52  [ТС]
Ассемблер читал для ознакомления, и даже не одну книгу, правда не писал ничего. А при чём тут знания, это всего лишь вопрос по работе компилятора. Некоторые моменты доходят через форумы, не всегда вся картина понятна из книг. Всё что мне надо, так это понять, стоит ли сохранять поля структур, или инициировать в методе и какие могут быть нюансы в зависимости от размера структур.

Добавлено через 4 минуты
Ну хотя судя по вашей реакции ясно что память в любом случае выделяется.
Всем спасибо, очень помогли.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.07.2013, 10:37
danrusm, читать мало...
0
 Аватар для Nevermore_
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
07.07.2013, 21:11
Мне кажется , что автор думает что стек размещается в процессоре, на самом деле стек размещен в озу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2013, 21:11
Помогаю со студенческими работами здесь

Перераспределение памяти для стека
Помогите решить задачку, реализовал стек, осталось решить задачку.. Задача состоит в следующем: реализовать перераспределение памяти,...

Фейл на перевыделении памяти для стека
собственно требовалась работа со стеком, в отладчике определил что прога брякается на Push при первом же перевыделении памяти (на выделении...

Переполнение стека во время освобождения памяти
Здравствуйте! СТолкнулся с такой проблемой, что при работе деструктора программа аварийно завершается, а в дебаггере появляется сообщение о...

Переменная стека и динамическое выделение памяти
Здравствуйте! Проблема в следующем: Допустим есть какое-то диалоговое окно, например "Dialog", и есть главное...

Организация памяти и стека и отладка в AVRstudio
Всем привет. Я новичок в мк avr. Прошу ногами сильно не пинать, за возможно глупый вопрос и по возможности поправить, если я что то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Первый деплой
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru